Modifica classe del fingerprint sensor FPC1020

Ciao a tutti, ho bisogno di utilizzare il sensore per la lettura delle impronte digitali FPC1020 su una scheda Arduino MKRZero. Il problema è che questo dispositivo viene fornito insieme a un codice di esempio che utilizza la libreria SoftwareSerial sia nel programma principale che nella classe, la quale non è utilizzabile con questa scheda. Ho provato a modificare i file .cpp e .h ma ho un errorre in fase di compilazione che non riesco a risolvere. Qui sotto riporterò i 2 codici dei file .cpp e .h che ho modificato (li inserisco in 2 messaggi diversi altrimenti non me li fa inviare), potete aiutarmi a capire dove sta il problema ? Allego come file anche i 2 codici originali e un PDF fornito dall'azienda costruttrice del sensore che potrebbe essere utile per trovare una soluzione.
Grazie in anticipo a chi può darmi una mano. A presto.

Giacomo

File .cpp:

#include "FPC1020.h"
#include "Arduino.h" 

#define UART_BUF_LEN  8
#define BUF_N 8

unsigned char rBuf[192];  //Receive return data
unsigned char tBuf[UART_BUF_LEN];  //Send commands or data
unsigned char g_ucUartRxEnd ;      //Receive return data end flag
unsigned char g_ucUartRxLen ;      //Receive return data length
unsigned char l_ucFPID =1;         //User ID
// Uart *mySerial = NULL;


FPC1020::FPC1020() {
// mySerial = ser; // ...override gpsHwSerial with value passed.
 Serial1.begin(19200);
}

//Function:wait data packet send finish
unsigned char FPC1020::WaitFpData(void)
{
    int i;
    unsigned char rBuf_p = 0;
    
    while(Serial1.available()<= 0);
    
    for(i=200; i>0; i--)//wait response info
    {
        delay(20);
        rBuf[rBuf_p++] = Serial1.read();
        
        if(Serial1.available() == 0)
        {
            g_ucUartRxEnd = 1;
            g_ucUartRxLen = rBuf_p;
            break;
        }
    }
    
    if(rBuf_p == 0) return FALSE;
    else return TRUE;
}

// check sum
unsigned char FPC1020::CmdGenCHK(unsigned char wLen,unsigned char *ptr)
{
 unsigned char i,temp = 0;
 
 for(i = 0; i < wLen; i++)
 {
 temp ^= *(ptr + i);
 }
 return temp;
}

// Send command
void FPC1020::UART_SendPackage(unsigned char wLen,unsigned char *ptr)
{
  unsigned int i=0,len=0;
 
  tBuf[0] = DATA_START;     //command head
  for(i = 0; i < wLen; i++)      // data in packet 
  {
    tBuf[1+i] = *(ptr+i);
  } 
  
  tBuf[wLen + 1] = CmdGenCHK(wLen, ptr);         //Generate checkout data
  tBuf[wLen + 2] = DATA_END;
  len = wLen + 3;
 
  g_ucUartRxEnd = 0;
  g_ucUartRxLen = len ;
  
  Serial1.write(tBuf,len); 

 // Serial.print((char *)tBuf);   
// UartSend(tBuf,len);
}
 
// response info check, return various info 
unsigned char FPC1020::Check_Package(unsigned char cmd)
{
    unsigned char flag = FALSE;
   if(!WaitFpData()) return flag; //wait response info
    // p = 0 ;
    if(g_ucUartRxEnd)
      g_ucUartRxEnd = 0;//clear data packet flag
    else 
      return flag;
    
 //   if(rBuf[0] != DATA_START)return flag;
// if(rBuf[1] != cmd)return flag;
// if(rBuf[6] != CmdGenCHK(g_ucUartRxLen - 3, &rBuf[1]))return flag;
 
    switch(cmd)
 {
 case CMD_ENROLL1:
 case CMD_ENROLL2:
 case CMD_ENROLL3:
 if(ACK_SUCCESS == rBuf[4])flag = TRUE;
 else if(ACK_USER_EXIST == rBuf[4])
 {
                        flag = ACK_USER_EXIST;
 delay(500);
 }
                else if(ACK_USER_OCCUPIED == rBuf[4])
 {
                        flag  = ACK_USER_OCCUPIED;
 delay(500);
 }
 break;
 case CMD_DELETE:  //delete assigned user
            if(ACK_SUCCESS == rBuf[4])flag = TRUE;
 break;
 case CMD_CLEAR:    //delete all users
            if(ACK_SUCCESS == rBuf[4])flag = TRUE;
 break;
 case CMD_IDENTIFY:  //1:1 comparison
 if(ACK_SUCCESS == rBuf[4])flag = TRUE;
 break;
 case CMD_USERNUMB:  // get user number
 if(ACK_SUCCESS == rBuf[4])
 {
 flag = TRUE;
 l_ucFPID = rBuf[3];
 }
 break;
 case CMD_SEARCH:   //1:N comparison
 if((1 == rBuf[4])||(2 == rBuf[4])||(3 == rBuf[4]))
 {
 flag = TRUE;
 l_ucFPID = rBuf[3];
 }
 break;
        
        case CMD_USERID: // Get user ID
            
            if(ACK_SUCCESS == rBuf[4])
            {
                flag = TRUE;
                l_ucFPID = rBuf[3];
            }
        
            break;
           
 default:
 break;
 }
     
    return flag;
}

// Fingerprint indentify 1:N
unsigned char FPC1020::Search(void)
{
 unsigned char buf[BUF_N];
  
    *buf = CMD_SEARCH;          //1:N comparison
    *(buf+1) = 0x00;
    *(buf+2) = 0x00;
    *(buf+3) = 0x00;
    *(buf+4) = 0x00;

    UART_SendPackage(5, buf);
 return Check_Package(CMD_SEARCH);
}

// Fingerprint indentify 1:1
void FPC1020::FP_Identify(unsigned int u_id)
{
  unsigned char buf[BUF_N];
  
  *buf = CMD_IDENTIFY;
  *(buf+1) = u_id>>8;
  *(buf+2) = u_id&0xff;
  *(buf+3) = 0x00;
  *(buf+4) = 0x00;
  UART_SendPackage(5, buf);
}

//   Add new user Step 1
void FPC1020::Enroll_Step1(unsigned int u_id)
{
  unsigned char buf[BUF_N];
  
  *buf = CMD_ENROLL1;
  *(buf+1) = u_id>>8;
  *(buf+2) = u_id&0xff;
  *(buf+3) = 1;
  *(buf+4) = 0x00;

  UART_SendPackage(5, buf);
}

//   Add new user Step 2
void FPC1020::Enroll_Step2(unsigned int u_id)
{
  unsigned char buf[BUF_N];
  
  *buf = CMD_ENROLL2;
  *(buf+1) = u_id>>8;
  *(buf+2) = u_id&0xff;
  *(buf+3) = 1;
  *(buf+4) = 0x00;

  UART_SendPackage(5, buf);
}

//   Add new user Step 1
void FPC1020::Enroll_Step3(unsigned int u_id)
{
  unsigned char buf[BUF_N];
  
  *buf = CMD_ENROLL3;
  *(buf+1) = u_id>>8;
  *(buf+2) = u_id&0xff;
  *(buf+3) = 1;
  *(buf+4) = 0x00;

  UART_SendPackage(5, buf);
}

//   Add a new user
unsigned char FPC1020::Enroll(unsigned int u_id)
{
  unsigned char  rtflag;
 Enroll_Step1(u_id);
        rtflag = Check_Package(CMD_ENROLL1);
        Serial.println("Get data1"); 
 if(rtflag != TRUE)  return rtflag;
 delay(100);
        
 
 Enroll_Step2(u_id);
        rtflag = Check_Package(CMD_ENROLL2);
        Serial.println("Get data2"); 
 if(rtflag !=TRUE)return rtflag;
 delay(100);
 

 Enroll_Step3(u_id);
 rtflag = Check_Package(CMD_ENROLL3);
        Serial.println("Get data3");
        if(rtflag !=TRUE)return rtflag;
 delay(100);
         
}

//   Delete all of the users
unsigned char FPC1020::Clear(void)
{
    unsigned char buf[BUF_N];
  
    *buf = CMD_CLEAR;
    *(buf+1) = 0x00;
    *(buf+2) = 0x00;
    *(buf+3) = 0x00;
    *(buf+4) = 0x00;

    UART_SendPackage(5, buf);
 return Check_Package(CMD_CLEAR);
}

//   Delete assigned user
unsigned char FPC1020::Delete(unsigned int u_id)
{
    unsigned char buf[BUF_N];
    *buf = CMD_DELETE;
    *(buf+1) = u_id>>8;
    *(buf+2) = u_id&0xff;
    *(buf+3) = 0x00;
    *(buf+4) = 0x00;
    UART_SendPackage(5, buf); 
 return Check_Package(CMD_DELETE);
}

//   Get user ID number
unsigned char FPC1020::Read(void)
{
    unsigned char buf[BUF_N];
    *buf = CMD_USERNUMB;
    *(buf+1) = 0x00;
    *(buf+2) = 0x00;
    *(buf+3) = 0x00;
    *(buf+4) = 0x00;
    UART_SendPackage(5, buf);
 return Check_Package(CMD_USERNUMB);
}

//   Get user ID number
unsigned char FPC1020::PrintUserID(void)
{
    unsigned char buf[BUF_N];
    *buf = CMD_USERID;
    *(buf+1) = 0x00;
    *(buf+2) = 0x00;
    *(buf+3) = 0x00;
    *(buf+4) = 0x00;
    UART_SendPackage(5, buf);
 return Check_Package(CMD_USERID);
}

FPC1020.cpp (6.23 KB)

FPC1020.h (1.9 KB)

Fingerprint_Protocol_All_English.pdf (216 KB)

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:

Seconda parte

File .h:

#ifndef FPC1020_h
#define FPC1020_h
#include "Arduino.h"

/* #ifdef __AVR__
  #if ARDUINO >= 100
    #include <SoftwareSerial.h>
  #else
    #include <NewSoftSerial.h>
  #endif
#endif */

#define TRUE  0x01
#define FALSE  0x00

#define DATA_START		    0xf5  // Data start
#define DATA_END		    0xf5  // Data end

#define CMD_ENROLL1  		0x01  // Add fingerprint 1st
#define CMD_ENROLL2  		0x02  // Add fingerprint 2nd
#define CMD_ENROLL3  		0x03  // Add fingerprint 3rd
#define CMD_DELETE  		0x04  // Delete assigned user
#define CMD_CLEAR  		    0x05  // Delete all users
#define CMD_USERNUMB  		0x09  // Get number of users
#define CMD_IDENTIFY  		0x0b  // Fingerprint matching 1:1
#define CMD_SEARCH  		0x0c  // Fingerprint matching 1:N
#define CMD_USERID          0x2b  // Get User ID and User Permission

#define ACK_SUCCESS  		0x00  // Operate success
#define ACK_FAIL	  	    0x01  // Operate filed
#define ACK_FULL	  	    0x04  // Fingerprint database is full
#define ACK_NOUSER   		0x05  // User do not exist
#define ACK_USER_OCCUPIED	0x06  // User ID already exists
#define ACK_USER_EXIST 		0x07  // Fingerprint already exists
#define ACK_TIMEOUT  		0x08  // Acuquisition timeout
  
class FPC1020
{
   public:  
    FPC1020();
    unsigned char Enroll(unsigned int u_id);
    unsigned char Clear(void);
    unsigned char Delete(unsigned int u_id);
    unsigned char Search(void);
    unsigned char Read(void);   
    unsigned char PrintUserID(void);
    
   private:
    unsigned char WaitFpData(void);
    unsigned char CmdGenCHK(unsigned char wLen,unsigned char *ptr);
    void UART_SendPackage(unsigned char wLen,unsigned char *ptr);
    unsigned char Check_Package(unsigned char cmd);
    void FP_Identify(unsigned int u_id);
    void Enroll_Step1(unsigned int u_id);
    void Enroll_Step2(unsigned int u_id);
    void Enroll_Step3(unsigned int u_id);
    
    
};

#endif

Principale errore:

FPC1020.h:45: error: expected ')' before '*' token

     FPC1020(SoftwareSerial *ser);

Stai cercando di modificare la libreria per usare Serial1 invece di SoftwareSerial ?

Se il compilatore segnala questa riga:
FPC1020(SoftwareSerial *ser);
vuol dire che hai quella riga che fa riferimento ad un oggetto della libreria che tu vuoi togliere.
Li dovrai passare Serial1 o comunque un puntatore a un Serial1
Ma nell'originale non c'e' quella riga. L'hai messa tu ?

La SoftwareSerial() NON esiste per MKR1000 quindi NON la puoi inserire e la devi eliminare.

C'è invece un modo per definire delle altre porte seriali oltre quelle già presenti (il SAMD21 ha 6 (0..5) moduli configurabili SERCOM che puoi usare come I2C, SPI o porta seriale). Prova a leggere QUESTO thread :wink:

Guglielmo

nid69ita:
Stai cercando di modificare la libreria per usare Serial1 invece di SoftwareSerial ?

Se il compilatore segnala questa riga:
FPC1020(SoftwareSerial *ser);
vuol dire che hai quella riga che fa riferimento ad un oggetto della libreria che tu vuoi togliere.
Li dovrai passare Serial1 o comunque un puntatore a un Serial1
Ma nell'originale non c'e' quella riga. L'hai messa tu ?

Si l'idea è quella di utilizzare Serial1. Quindi c'è qualche parte del codice che ancora fa riferimento a SoftwareSerial ?

Giaco25:
Si l'idea è quella di utilizzare Serial1. Quindi c'è qualche parte del codice che ancora fa riferimento a SoftwareSerial ?

Se non lo sai tu !! Il codice è sul tuo pc. Ricontrolla i sorgenti e soprattutto il file .h Secondo me quello che hai postato non è quello che compili.

@Guglielmo credo che @giaco25 si accontenta di usare Serial1 (mi pare già definita), quindi cerca di sostituire la SoftwareSerial con Serial1

P.S. @Guglielmo Urca che roba bestiale a quel link. Bello poterlo fare. Ti ritrovi con una Serial2 su pin 0 e 1 un pò come la Arduino Uno :o :slight_smile:

nid69ita:
P.S. @Guglielmo Urca che roba bestiale a quel link. Bello poterlo fare. Ti ritrovi con una Serial2 su pin 0 e 1 un pò come la Arduino Uno :o :slight_smile:

Simpatico eh ? :smiley: :smiley: :smiley:

Guglielmo

P.S.: Ormai quasi tutte le nuove MCU hanno introdotto questo concetto di pin indipendenti dall'uso che ne fai, poi ... ti configuri tu la MCU collegando le varie risorse hai vari pin. La cosa si sta compliacndo a tal punto che ... a "manina" sta diventando veramente difficile e, quasi tutti i produttori, offrono tools grafici di configurazione. Atmel offre "START", Microchip offre "MCC" sui pic 8/16 ed "Harmony" sui PIC32, e così via ...

nid69ita:
Se non lo sai tu !! Il codice è sul tuo pc. Ricontrolla i sorgenti e soprattutto il file .h Secondo me quello che hai postato non è quello che compili.

@Guglielmo credo che @giaco25 si accontenta di usare Serial1 (mi pare già definita), quindi cerca di sostituire la SoftwareSerial con Serial1

P.S. @Guglielmo Urca che roba bestiale a quel link. Bello poterlo fare. Ti ritrovi con una Serial2 su pin 0 e 1 un pò come la Arduino Uno :o :slight_smile:

Il file che ho postato è proprio quello che compilo, quello originale è tra gli allegati del primo messaggio. Avevo intuito che ci potesse essere una parte di codice che ancora fa riferimento a SoftwareSerial ma sono giorni che sto cercando di risolvere questo problema e non capisco quale parte è che mi causa questo problema !!!

Comunque intanto vi ringrazio @nid69ita e @Guglielmo per la disponibilità :wink:

Secondo me hai più copie di quella libreria e viene presa un'altra copia ...

Fai una cosa, nell'IDE vai nelle "Impostazioni" (Preferences) e metti il segno di spunta nel dettaglio (verbose) sia della compilazione che dell'upload ... ti darà molte più informazioni, inclusa la path completa del file che da l'errore.

Guglielmo

gpb01:
Secondo me hai più copie di quella libreria e viene presa un'altra copia ...

Fai una cosa, nell'IDE vai nelle "Impostazioni" (Preferences) e metti il segno di spunta nel dettaglio (verbose) sia della compilazione che dell'upload ... ti darà molte più informazioni, inclusa la path completa del file che da l'errore.

Guglielmo

Ho provato a fare in questo modo e forse il problema è proprio questo. Mi dice come ultima frase:

Uso la libreria FPC1020 nella cartella: C:\Program Files (x86)\Arduino\libraries\FPC1020 (legacy)

Ovviamente i file modificati non sono in questo percorso.

Ecco, allora vai in quella cartella e, temporaneamente, elimina quella libreria da quella posizione e vedi come va.

Guglielmo

gpb01:
Ecco, allora vai in quella cartella e, temporaneamente, elimina quella libreria da quella posizione e vedi come va.

Guglielmo

Ok adesso l'unico errore che mi esce fuori è questo:

C:\Users\giaco\Desktop\Modifica\Modifica.ino:7:21: fatal error: FPC1020.h: No such file or directory

 #include <FPC1020.h>

La cartella "Modifica" è quella dove sono contenuti il codice .ino e i 2 file modificati .cpp e .h

Intanto NON è normale che tu abbia messo la lib sotto "C:\Program Files (x86)\Arduino\libraries"
Sono sicuro l'hai messa tu li.
Li dentro ci vanno le lib ufficiali, le librerie aggiuntive devono stare sotto la libraries ma dove hai i progetti.
esempio da me:
E:\Arduino_projects\ dove salvo i progetti e quindi c'e'
E:\Arduino_projects\LIBRARIES e li dentro il manager delle lib mette le nuove lib o quelle caricate da zip (due voci di menu apposite).
Versione di IDE Arduino che usi ?

Uso la versione 1.8.0

Intanto passa alla 1.8.5 la 1.8.0 qualche bacherozzo l'aveva.

Ok passato alla 1.8.5

Ora, hai arduino ide installato qui: C:\Program Files (x86)\Arduino
Ma dalle impostazioni, dove stà la cartella degli sketch ?

Con l'IDE, menu Sketch->#include libreria
ci sono poi altre 2 voci, "gestione libreria" e "includi libreria da zip"
Per aggiungere librerie meglio usare una di quelle voci. La prima ha un elenco di lib "affidabili"
Ma se non c'e' quella ce ti serve usi la seconda voce per prendere la lib dallo zip

C:\Users\giaco\Documents\Arduino

è questo qui il percorso della cartella degli sketch che mi visualizza nella impostazioni

nid69ita:
Ma se non c'e' quella ce ti serve usi la seconda voce per prendere la lib dallo zip

L'ho aggiunta tramite file zip perchè non si trova tra quelle disponibili. Adesso allora come faccio a modificare quella libreria nel modo corretto senza fare danni come prima ?