Repositório para códigos do painel da plataforma SATC

Dependencies:   MFRC522 mbed-STM32F103C8T6 mbed

Fork of C_005_EA_Painel_sem_bms by Engenharia Mobilis

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers leitor_rfid.cpp Source File

leitor_rfid.cpp

00001 #include <leitor_rfid.h>
00002 /*
00003     Inicializacao do leitor de cartoes
00004 */
00005 uint8_t CardReader::init(CardReaderMode mode){
00006     rf_chip.PCD_Reset();
00007     //Configuracoes copiadas da biblioteca utilizada no arduino
00008     // Reseta baud rates
00009     rf_chip.PCD_WriteRegister(rf_chip.TxModeReg, 0x00);
00010     rf_chip.PCD_WriteRegister(rf_chip.RxModeReg, 0x00);
00011     // Reseta ModWidthReg
00012     rf_chip.PCD_WriteRegister(rf_chip.ModWidthReg, 0x26);    
00013     // Prossegue com a inicializacao padrao
00014     rf_chip.PCD_Init();   
00015     wait_ms(10);   
00016     // Seleciona o modo de operacao: Polling ou interrupcao
00017     int comIEnRegValue;
00018     switch (mode){
00019         case CRMODE_Interrupt:
00020             comIEnRegValue = comIEnRegInterruptValue; 
00021             break;
00022         case CRMODE_Polling:
00023             comIEnRegValue = comIEnRegPollingValue;
00024             break;
00025         default:
00026             comIEnRegValue = comIEnRegPollingValue;
00027             break;
00028     }
00029     rf_chip.PCD_WriteRegister(rf_chip.ComIEnReg, comIEnRegValue);
00030     // Sucesso de inicializacao se da pelo sucesso de leitura de um registrador
00031     return comIEnRegValue == rf_chip.PCD_ReadRegister(rf_chip.ComIEnReg);
00032 }
00033 
00034 /* Funcao necessaria para funcionamento via interrupcao
00035         Deve ser chamada logo apos processar uma interrupcao, 
00036         para que o mfrc522 volte o pino de interrupcao para seu valor de repouso (alto)
00037 */
00038 void CardReader::clearInterrupts(){
00039     rf_chip.PCD_WriteRegister(rf_chip.ComIrqReg, comIrqRegValue);
00040     rf_chip.PICC_HaltA();
00041 }
00042 /* Funcao necessaria para funcionamento via interrupcao
00043         Deve ser chamada periodicamente 
00044         para que o mfrc522 reative o circuito da antena
00045 
00046 */
00047 void CardReader::enableAntenna(){  
00048     rf_chip.PCD_WriteRegister(rf_chip.FIFODataReg, rf_chip.PICC_CMD_REQA);
00049     rf_chip.PCD_WriteRegister(rf_chip.CommandReg, rf_chip.PCD_Transceive);
00050     rf_chip.PCD_WriteRegister(rf_chip.BitFramingReg, 0x87);      
00051 }
00052 
00053 /*
00054     Avalia se cartao escolhido esta entre os autorizados para uso com o veiculo
00055 */
00056 int CardReader::cardIsValid(){
00057     bool card_is_valid = true;
00058     // Coleta uid do cartao
00059     uint8_t* card_id = rf_chip.uid.uidByte;
00060     uint8_t id_database_list_size = sizeof(id_database_list)/sizeof(id_database_list[0]);
00061     //itera sobre cada um dos cartoes autorizados e os compara com o cartao lido
00062     for(uint8_t i = 0; i < id_database_list_size ; i++){            
00063         card_is_valid = true;
00064         for(uint8_t j = 0; j < ID_SIZE; j++){
00065             card_is_valid = card_is_valid && (card_id[j] == id_database_list[i][j]);
00066         }        
00067         if(card_is_valid){
00068             //copia id do cartao para atributo 'last_valid_card' do objeto
00069             std::copy(rf_chip.uid.uidByte,rf_chip.uid.uidByte+ID_SIZE,last_valid_card);
00070             break;
00071         }
00072     }       
00073     return card_is_valid;    
00074 }
00075 
00076 
00077 /*
00078     Tenta ler o cartao, retorna 'true' em caso de sucesso
00079 */
00080 int CardReader::readCard(){    
00081     return rf_chip.PICC_IsNewCardPresent() && rf_chip.PICC_ReadCardSerial();
00082 }