programme bts
Dependencies: mbed ID12RFID SDFileSystem
Revision 5:e104ec24b3fa, committed 2021-05-05
- Comitter:
- valentinbruchet
- Date:
- Wed May 05 08:13:43 2021 +0000
- Parent:
- 4:3269abcc9c73
- Commit message:
- Programme BTS;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ID12RFID.lib Wed May 05 08:13:43 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/simon/code/ID12RFID/#f04afa911cf5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Wed May 05 08:13:43 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/valentinbruchet/code/SDFileSystem/#bb0a603a0f79
--- a/eeprom_flash.cpp Tue Mar 16 14:58:12 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -#include "mbed.h" -#include "eeprom_flash.h" -Serial pc(USBTX, USBRX); //Initalise PC serial comms -DigitalOut myled(LED1); -/* -* Must call this first to enable writing -*/ -void enableEEPROMWriting() { -HAL_StatusTypeDef status = HAL_FLASH_Unlock(); -FLASH_PageErase(EEPROM_START_ADDRESS); // required to re-write -CLEAR_BIT(FLASH->CR, FLASH_CR_PER); // Bug fix: bit PER has been set in Flash_PageErase(), must clear it here -} -void disableEEPROMWriting() { -HAL_FLASH_Lock(); -} -/* -* Writing functions -* Must call enableEEPROMWriting() first -*/ -HAL_StatusTypeDef writeEEPROMHalfWord(uint32_t address, uint16_t data) { -HAL_StatusTypeDef status; -address = address + EEPROM_START_ADDRESS; -status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data); -return status; -} -/* -* Reading functions -*/ -uint16_t readEEPROMHalfWord(uint32_t address) { -uint16_t val = 0; -address = address + EEPROM_START_ADDRESS; -val = *(__IO uint16_t*)address; -return val; -} -//Programme de test -int main() { -int tab[40]= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40}; -int adresse = 0x00; -int lecture; -pc.baud(9600); -/* Ecriture*/ -enableEEPROMWriting(); //autorisation d'ecriture dans l'eeprom -writeEEPROMHalfWord(adresse, tab[0]); -writeEEPROMHalfWord(adresse+2, tab[1]); -writeEEPROMHalfWord(adresse+4, tab[2]); -writeEEPROMHalfWord(adresse+6, tab[3]); -writeEEPROMHalfWord(adresse+8, tab[4]); -writeEEPROMHalfWord(adresse+10, tab[5]); -writeEEPROMHalfWord(adresse+12, tab[6]); -writeEEPROMHalfWord(adresse+14, tab[7]); -writeEEPROMHalfWord(adresse+16, tab[8]); -writeEEPROMHalfWord(adresse+18, tab[9]); -writeEEPROMHalfWord(adresse+20, tab[10]); -writeEEPROMHalfWord(adresse+22, tab[11]); -writeEEPROMHalfWord(adresse+24, tab[12]); -writeEEPROMHalfWord(adresse+26, tab[13]); -writeEEPROMHalfWord(adresse+28, tab[14]); -writeEEPROMHalfWord(adresse+30, tab[15]); -writeEEPROMHalfWord(adresse+32, tab[16]); -writeEEPROMHalfWord(adresse+34, tab[17]); -writeEEPROMHalfWord(adresse+36, tab[18]); -writeEEPROMHalfWord(adresse+38, tab[19]); -writeEEPROMHalfWord(adresse+40, tab[20]); -writeEEPROMHalfWord(adresse+42, tab[21]); -writeEEPROMHalfWord(adresse+44, tab[22]); -writeEEPROMHalfWord(adresse+46, tab[23]); -writeEEPROMHalfWord(adresse+48, tab[24]); -writeEEPROMHalfWord(adresse+50, tab[25]); -writeEEPROMHalfWord(adresse+52, tab[26]); -writeEEPROMHalfWord(adresse+54, tab[27]); -writeEEPROMHalfWord(adresse+56, tab[28]); -writeEEPROMHalfWord(adresse+58, tab[29]); -writeEEPROMHalfWord(adresse+60, tab[30]); -writeEEPROMHalfWord(adresse+62, tab[31]); -writeEEPROMHalfWord(adresse+64, tab[32]); -writeEEPROMHalfWord(adresse+66, tab[33]); -writeEEPROMHalfWord(adresse+68, tab[34]); -writeEEPROMHalfWord(adresse+70, tab[35]); -writeEEPROMHalfWord(adresse+72, tab[36]); -writeEEPROMHalfWord(adresse+74, tab[37]); -writeEEPROMHalfWord(adresse+76, tab[38]); -writeEEPROMHalfWord(adresse+78, tab[39]); -disableEEPROMWriting(); //Interdiction d'ecriture -myled=!myled; -wait(0.5); -myled=!myled; -wait(0.5); -/*lecture et affichage*/ -lecture=readEEPROMHalfWord(adresse); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+2); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+4); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+6); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+8); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+10); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+12); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+14); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+16); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+18); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+20); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+22); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+24); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+26); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+28); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+30); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+32); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+34); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+36); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+38); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+40); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+42); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+44); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+46); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+48); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+50); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+52); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+54); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+56); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+58); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+60); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+62); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+64); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+68); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+70); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+72); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+76); -pc.printf ("valeur lue: %d\n\r",lecture); -lecture=readEEPROMHalfWord(adresse+78); -pc.printf ("valeur lue: %d\n\r",lecture); -while(1); -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed May 05 08:13:43 2021 +0000 @@ -0,0 +1,282 @@ +#include "mbed.h" +#include "mbed_genie.h" +#include "eeprom_flash.h" +#include "SDFileSystem.h" +#include "ID12RFID.h" + +Serial pc(USBTX, USBRX); +ID12RFID rfid(PA_10); + +DigitalOut myled(LED1); +DigitalOut led1(PA_8); +DigitalOut led2(PB_14); +DigitalOut led3(PB_11); +DigitalOut led4(PA_11); +DigitalOut led5(PA_12); +DigitalOut led6(PC_5); +DigitalOut led7(PC_6); +DigitalOut led8(PC_8); +DigitalOut ledmasse(PB_3); + +int flag_contraste; +int valeur_clavier; +int i; +unsigned int lecture; +int chrono = 99; +int led = 99; +int tab[40] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40}; +int code1 = 49; +int code2 = 50; +int code3 = 51; +int y = 15; +int flag = 0; +int adressetempo = 0x0000; +int adresserfid = 0x00000000; +unsigned int tempo1, tempo2, tempo3, tempo4, tempo5, tempo6, tempo7,tempo8, rfid1, rfid2, rfid3, rfid4, rfid5; + + +void enableEEPROMWriting() +{ + HAL_StatusTypeDef status = HAL_FLASH_Unlock(); + FLASH_PageErase(EEPROM_START_ADDRESS); // required to re-write + CLEAR_BIT(FLASH->CR, FLASH_CR_PER); // Bug fix: bit PER has been set in Flash_PageErase(), must clear it here +} + +void disableEEPROMWriting() +{ + HAL_FLASH_Lock(); +} + +HAL_StatusTypeDef writeEEPROMWord(uint32_t address, uint32_t data) +{ + HAL_StatusTypeDef status; + address = address + EEPROM_START_ADDRESS; + status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data); + return status; +} + +uint32_t readEEPROMWord(uint32_t address) +{ + uint32_t val = 0; + address = address + EEPROM_START_ADDRESS; + val = *(__IO uint32_t*)address; + return val; +} + +void myGenieEventHandler(void) +{ + genieFrame Event; + genieDequeueEvent(&Event); + if(Event.reportObject.cmd == GENIE_REPORT_EVENT) + { + if (Event.reportObject.object == GENIE_OBJ_KEYBOARD) + { + if (Event.reportObject.index == 0) + { + valeur_clavier = Event.reportObject.data_lsb; + printf("%c\n\r", valeur_clavier); + if ((valeur_clavier == code1) || (valeur_clavier== code2) || (valeur_clavier == code3)) + { + printf("Acces autorise\n\r"); + } + else + { + printf("Acces refuse\n\r"); + } + } + } + if (Event.reportObject.object == GENIE_OBJ_4DBUTTON) + { + if (Event.reportObject.index == 3) //Start + { + printf("Depart\n\r"); + flag=1; + } + if (Event.reportObject.index == 5) //Stop + { + printf("Stop\n\r"); + flag=0; + } + /*if (Event.reportObject.index == 8) // Contraste + + { + if (y<15) + { + y++; + printf("Contraste=%d\r\n",y); + flag_contraste=1; + } + genieWriteContrast(y); + } + if (Event.reportObject.index == 7) // Contraste - + { + if (y>0) + { + y--; + printf("Contraste=%d\r\n",y); + flag_contraste=1; + } + genieWriteContrast(y); + }*/ + if (Event.reportObject.index == 6) //Lecture tempo + { + SDFileSystem sd(PA_7, PA_6, PA_5, PB_6, "sd"); + char numberstring[100]; + FILE *fp = fopen("/sd/valeur_temporisation.txt", "r"); + fgets(numberstring, 100, fp); + + if(fp == NULL) + { + error("Impossible d'ouvrir le fichier pour la lecture\n\r"); + fclose(fp); + } + else + { + printf("Lecture temporisation\n\r"); + enableEEPROMWriting(); + sscanf(numberstring, "%d", &tempo1); + writeEEPROMWord(adressetempo, tempo1); + lecture=readEEPROMWord(adressetempo); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo1); + sscanf(numberstring+3, "%d", &tempo2); + writeEEPROMWord(adressetempo+4, tempo2); + lecture=readEEPROMWord(adressetempo+4); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo2); + sscanf(numberstring+6, "%d", &tempo3); + writeEEPROMWord(adressetempo+8, tempo3); + lecture=readEEPROMWord(adressetempo+8); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo3); + sscanf(numberstring+9, "%d", &tempo4); + writeEEPROMWord(adressetempo+12, tempo4); + lecture=readEEPROMWord(adressetempo+12); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo4); + sscanf(numberstring+11, "%d", &tempo5); + writeEEPROMWord(adressetempo+16, tempo5); + lecture=readEEPROMWord(adressetempo+16); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo5); + sscanf(numberstring+14, "%d", &tempo6); + writeEEPROMWord(adressetempo+20, tempo6); + lecture=readEEPROMWord(adressetempo+20); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo6); + sscanf(numberstring+16, "%d", &tempo7); + writeEEPROMWord(adressetempo+24, tempo7); + lecture=readEEPROMWord(adressetempo+24); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo7); + sscanf(numberstring+18, "%d", &tempo8); + writeEEPROMWord(adressetempo+28, tempo8); + lecture=readEEPROMWord(adressetempo+28); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r",tempo8); + fclose(fp); + printf("Lecture finie!\n\r"); + disableEEPROMWriting(); + } + } + if (Event.reportObject.index == 7) //Lecture code RFID + { + SDFileSystem sd(PA_7, PA_6, PA_5, PB_6, "sd"); + char numberrfid[100]; + FILE *fp1 = fopen("/sd/valeur_rfid.txt", "r"); + fgets(numberrfid, 100, fp1); + + if(fp1 == NULL) + { + error("Impossible d'ouvrir le fichier pour la lecture\n\r"); + } + flag = 2; + printf("Lecture code rfid\n\r"); + enableEEPROMWriting(); + sscanf(numberrfid, "%d", &rfid1); + writeEEPROMWord(adresserfid, rfid1); + lecture=readEEPROMWord(adresserfid); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r", rfid1); + sscanf(numberrfid+8, "%d", &rfid2); + writeEEPROMWord(adresserfid+8, rfid2); + lecture=readEEPROMWord(adresserfid+8); + printf ("eeprom: %d\n\r",lecture);; + printf ("carte : %d\n\r", rfid2); + sscanf(numberrfid+17, "%d", &rfid3); + writeEEPROMWord(adresserfid+16, rfid3); + lecture=readEEPROMWord(adresserfid+16); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r", rfid3); + sscanf(numberrfid+25, "%d", &rfid4); + writeEEPROMWord(adresserfid+24, rfid4); + lecture=readEEPROMWord(adresserfid+24); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r", rfid4); + sscanf(numberrfid+34, "%d", &rfid5); + writeEEPROMWord(adresserfid+32, rfid5); + lecture=readEEPROMWord(adresserfid+32); + printf ("eeprom: %d\n\r",lecture); + printf ("carte : %d\n\r", rfid5); + fclose(fp1); + printf("Lecture finie!\n\r"); + disableEEPROMWriting(); + } + } + } + return; +} +int main() +{ + pc.baud(9600); + ledmasse = 1; + SetupGenie(); + genieAttachEventHandler(&myGenieEventHandler); + genieWriteContrast(15); + + while(1) + { + if (flag == 1) + { + led1 = 1; + led2 = 1; + led3 = 1; + led4 = 1; + led5 = 0; + led6 = 0; + led7 = 0; + led8 = 0; + wait(1); + if (chrono == 0) + { + chrono=tab[i]; + i=i+1; + } + } + + else if(flag == 0) + { + led1 = 0; + led2 = 0; + led3 = 0; + led4 = 0; + led5 = 1; + led6 = 1; + led7 = 1; + led8 = 1; + chrono=tab[i]; + wait(1); + } + else if(flag == 2) + { + if(rfid.read() == rfid1) + { + printf("RFID Tag number : %d\n\r", rfid.read()); + genieWriteObject(GENIE_OBJ_LED, 0x00, 1); + } + } + /*if(rfid.read() == rfid1) + { + genieWriteObject(GENIE_OBJ_LED, 0x00, chrono); + }*/ + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_genie.cpp Wed May 05 08:13:43 2021 +0000 @@ -0,0 +1,617 @@ + +#include "mbed.h" +#include "mbed_genie.h" + +DigitalOut genieReset(PC_7); //genie reset pin on pin 8 of the mbed + +Serial screen(PC_10,PC_11); +Serial pcusb(USBTX,USBRX); +Timer t; + + + +void _genieFlushEventQueue (void); +void _handleError (void); +void _geniePutchar (uint8_t c); +uint8_t _genieGetchar (void); +void _genieSetLinkState (uint16_t newstate); +uint16_t _genieGetLinkState (void); +bool _genieEnqueueEvent (uint8_t * data); +////////////////////////////////////////////////////////////// +// A structure to hold up to MAX_GENIE_EVENTS events receive +// from the display +// +static genieEventQueueStruct _genieEventQueue; + +////////////////////////////////////////////////////////////// +// Pointer to the user's event handler function +// +static genieUserEventHandlerPtr _genieUserHandler = NULL; + + +////////////////////////////////////////////////////////////// +// Simple 5-deep stack for the link state, this allows +// genieDoEvents() to save the current state, receive a frame, +// then restore the state +// +static uint8_t _genieLinkStates[5] = {GENIE_LINK_IDLE}; +// +// Stack pointer +// +static uint8_t *_genieLinkState = &_genieLinkStates[0]; + + +////////////////////////////////////////////////////////////// +// Number of mS the genieGetChar() function will wait before +// giving up on the display +static int _genieTimeout = TIMEOUT_PERIOD; + + +////////////////////////////////////////////////////////////// +// Number of times we have had a timeout +static int _genieTimeouts = 0; + + +////////////////////////////////////////////////////////////// +// Global error variable +static int _genieError = ERROR_NONE; + + + + +static uint8_t rxframe_count = 0; + + +////////////////////////////////////////////////////////////// +// Number of fatal errors encountered +static int _genieFatalErrors = 0; +////////////////////// genieGetEventData //////////////////////// +// +// Returns the LSB and MSB of the event's data combined into +// a single uint16 +// +// The data is transmitted from the display in big-endian format +// and stored the same so the user can't just access it as an int +// directly from the structure. +// +uint16_t genieGetEventData (genieFrame * e) { + return (e->reportObject.data_msb << 8) + e->reportObject.data_lsb; +} + + + + +//////////////////////// genieEventIs /////////////////////////// +// +// Compares the cmd, object and index fields of the event's +// structure. +// +// Returns: TRUE if all the fields match the caller's parms +// FALSE if any of them don't +// +bool genieEventIs(genieFrame * e, uint8_t cmd, uint8_t object, uint8_t index) { + + + return (e->reportObject.cmd == cmd && + e->reportObject.object == object && + e->reportObject.index == index); + + +} + +////////////////////// _geniePushLinkState ////////////////////// +// +// Push a link state onto a FILO stack +// +void _geniePushLinkState (uint8_t newstate) { + + + _genieLinkState++; + _genieSetLinkState(newstate); + + +} + + +////////////////////// _geniePopLinkState ////////////////////// +// +// Pop a link state from a FILO stack +// +void _geniePopLinkState (void) { + if (_genieLinkState > &_genieLinkStates[0]) { + *_genieLinkState = 0xFF; + _genieLinkState--; + } +} + +///////////////// _genieFlushSerialInput /////////////////// +// +// Removes and discards all characters from the currently +// used serial port's Rx buffer. +// +void _genieFlushSerialInput(void) { + do { + _genieGetchar(); + } while (_genieError != ERROR_NOCHAR); +} + +///////////////////////// _handleError ///////////////////////// +// +// So far really just a debugging aid, but can be enhanced to +// help recover from errors. +// +void _handleError (void) { +// Serial2.write (_genieError + (1<<5)); +// if (_genieError == GENIE_NAK) genieResync(); +} + + + + +////////////////////// _genieFlushEventQueue //////////////////// +// +// Reset all the event queue variables and start from scratch. +// +void _genieFlushEventQueue(void) { + _genieEventQueue.rd_index = 0; + _genieEventQueue.wr_index = 0; + _genieEventQueue.n_events = 0; +} +bool GenieReadable(void){ + if (screen.readable()) + { + return TRUE; + } + else + { + return FALSE; + } +} +///////////////////////// genieDoEvents ///////////////////////// +// +// This is the heart of the Genie comms state machine. +// +uint16_t genieDoEvents (void) { + uint8_t c; + static uint8_t rx_data[6]; + static uint8_t checksum = 0; + + if (GenieReadable()) + { + c = _genieGetchar(); + //pc.putc(c); + + //////////////////////////////////////////// + // + // If there are no characters to process and we have + // queued events call the user's handler function. + // + if (_genieError == ERROR_NOCHAR) { + //pc.printf("EventCalled!\n\r"); + if (_genieEventQueue.n_events > 0 && _genieUserHandler!= NULL) (_genieUserHandler)(); + return GENIE_EVENT_NONE; + } + + /////////////////////////////////////////// + // + // Main state machine + // + switch (_genieGetLinkState()) { + case GENIE_LINK_IDLE: + switch (c) { + case GENIE_REPORT_EVENT: + // event frame out of the blue, set the link state + // and fall through to the frame-accumulate code + // at the end of this function + _geniePushLinkState(GENIE_LINK_RXEVENT); + break; + + default: + // error, bad character, no other character + // is acceptable in this state + return GENIE_EVENT_RXCHAR; + + } + break; + + case GENIE_LINK_WFAN: + switch (c) { + + + case GENIE_ACK: + _geniePopLinkState(); + return GENIE_EVENT_RXCHAR; + + + case GENIE_NAK: + _geniePopLinkState(); + _genieError = ERROR_NAK; + _handleError(); + return GENIE_EVENT_RXCHAR; + + case GENIE_REPORT_EVENT: + // event frame out of the blue while waiting for an ACK + // save/set the link state and fall through to the + // frame-accumulate code at the end of this function + _geniePushLinkState(GENIE_LINK_RXEVENT); + break; + + + case GENIE_REPORT_OBJ: + default: + // error, bad character + return GENIE_EVENT_RXCHAR; + } + break; + + + case GENIE_LINK_WF_RXREPORT: // waiting for the first byte of a report + switch (c) { + + case GENIE_REPORT_EVENT: + // event frame out of the blue while waiting for the first + // byte of a report frame + // save/set the link state and fall through to the + // frame-accumulate code at the end of this function + _geniePushLinkState(GENIE_LINK_RXEVENT); + break; + + + case GENIE_REPORT_OBJ: + // first byte of a report frame + // replace the GENIE_LINK_WF_RXREPORT link state + // with GENIE_LINK_RXREPORT to indicate that we + // are now receiving a report frame + _geniePopLinkState(); + _geniePushLinkState(GENIE_LINK_RXREPORT); + break; + + + case GENIE_ACK: + case GENIE_NAK: + default: + // error, bad character + return GENIE_EVENT_RXCHAR; + // break; + } + + + case GENIE_LINK_RXREPORT: // already receiving report + case GENIE_LINK_RXEVENT: // already receiving event + default: + break; + + } + + + /////////////////////////////////////////////////////// + // We get here if we are in the process of receiving + // a report or event frame. Accumulate GENIE_FRAME_SIZE + // bytes into a local buffer then queue them as a frame + // into the event queue + // + if (_genieGetLinkState() == GENIE_LINK_RXREPORT || \ + _genieGetLinkState() == GENIE_LINK_RXEVENT) { + + checksum = (rxframe_count == 0) ? c : checksum ^ c; + + + rx_data[rxframe_count] = c; + + + if (rxframe_count == GENIE_FRAME_SIZE -1) { + //pc.printf("FrameReceived!\n\r"); + // all bytes received, if the CS is good + // queue the frame and restore the link state + if (checksum == 0) { + _genieEnqueueEvent(rx_data); + if (_genieEventQueue.n_events > 0 && _genieUserHandler!= NULL) (_genieUserHandler)(); + //return GENIE_EVENT_NONE; + rxframe_count = 0; + // revert the link state to whatever it was before + // we started accumulating this frame + _geniePopLinkState(); + return GENIE_EVENT_RXCHAR; + } else { + _genieError = ERROR_BAD_CS; + _handleError(); + } + } + rxframe_count++; + return GENIE_EVENT_RXCHAR; + } + } +} + +////////////////////// genieDequeueEvent /////////////////// +// +// Copy the bytes from a queued input event to a buffer supplied +// by the caller. +// +// Parms: genieFrame * buff, a pointer to the user's buffer +// +// Returns: TRUE if there was an event to copy +// FALSE if not +// +bool genieDequeueEvent(genieFrame * buff) { + + + if (_genieEventQueue.n_events > 0) { + memcpy (buff, &_genieEventQueue.frames[_genieEventQueue.rd_index], + GENIE_FRAME_SIZE); + _genieEventQueue.rd_index++; + _genieEventQueue.rd_index &= MAX_GENIE_EVENTS -1; + _genieEventQueue.n_events--; + return TRUE; + } + return FALSE; +} + + + + + +////////////////////// _genieWaitForIdle //////////////////////// +// +// Wait for the link to become idle or for the timeout period, +// whichever comes first. +// +void _genieWaitForIdle (void) { + uint16_t do_event_result; + long timeout = t.read_ms() + _genieTimeout; + + for ( ; t.read_ms() < timeout;) { + + + do_event_result = genieDoEvents(); + // if there was a character received from the + // display restart the timeout because doEvents + // is in the process of receiving something + if (do_event_result == GENIE_EVENT_RXCHAR) { + timeout = t.read_ms() + _genieTimeout; + return; + } + + if (_genieGetLinkState() == GENIE_LINK_IDLE) { + return; + } + } + _genieError = ERROR_TIMEOUT; + _handleError(); + return; +} + +///////////////////////// genieWriteObject ////////////////////// +// +// Write data to an object on the display +// +uint16_t genieWriteObject (uint16_t object, uint16_t index, uint16_t data) +{ + uint16_t msb, lsb ; + uint8_t checksum ; + + + _genieWaitForIdle(); + + + lsb = data&0xFF; + msb = (data>>8) & 0xFF; + + + _genieError = ERROR_NONE; + + + _geniePutchar(GENIE_WRITE_OBJ) ; checksum = GENIE_WRITE_OBJ ; + _geniePutchar(object) ; checksum ^= object ; + _geniePutchar(index) ; checksum ^= index ; + _geniePutchar(msb) ; checksum ^= msb; + _geniePutchar(lsb) ; checksum ^= lsb; + _geniePutchar(checksum) ; + + + _geniePushLinkState(GENIE_LINK_WFAN); +} + +/////////////////////// genieWriteContrast ////////////////////// +// +// Alter the display contrast (backlight) +// +// Parms: uint8_t value: The required contrast setting, only +// values from 0 to 15 are valid. 0 or 1 for most displays +// and 0 to 15 for the uLCD-43 +// +void genieWriteContrast (uint16_t value) { + unsigned int checksum ; + + + _genieWaitForIdle(); + + + _geniePutchar(GENIE_WRITE_CONTRAST) ; checksum = GENIE_WRITE_CONTRAST ; + _geniePutchar(value) ; checksum ^= value ; + _geniePutchar(checksum) ; + + + _geniePushLinkState(GENIE_LINK_WFAN); + + +} + + +//////////////////////// _genieWriteStrX /////////////////////// +// +// Non-user function used by genieWriteStr() and genieWriteStrU() +// +static int _genieWriteStrX (uint16_t code, uint16_t index, char *string) +{ + char *p ; + unsigned int checksum ; + int len = strlen (string) ; + + + if (len > 255) + return -1 ; + + + _genieWaitForIdle(); + + + _geniePutchar(code) ; checksum = code ; + _geniePutchar(index) ; checksum ^= index ; + _geniePutchar((unsigned char)len) ; checksum ^= len ; + for (p = string ; *p ; ++p) { + _geniePutchar (*p) ; + checksum ^= *p ; + } + _geniePutchar(checksum) ; + + + _geniePushLinkState(GENIE_LINK_WFAN); + + + return 0 ; +} +/////////////////////// genieWriteStr //////////////////////// +// +// Write a string to the display (ASCII) +// +uint16_t genieWriteStr (uint16_t index, char *string) { + + return _genieWriteStrX (GENIE_WRITE_STR, index, string); +} + + +/////////////////////// genieWriteStrU //////////////////////// +// +// Write a string to the display (Unicode) +// +uint16_t genieWriteStrU (uint16_t index, char *string) { + + + return _genieWriteStrX (GENIE_WRITE_STRU, index, string); + + +} +/////////////////// genieAttachEventHandler ////////////////////// +// +// "Attaches" a pointer to the users event handler by writing +// the pointer into the variable used by doEVents() +// +void genieAttachEventHandler (genieUserEventHandlerPtr handler) { + _genieUserHandler = handler; +} + + +////////////////////// _genieEnqueueEvent /////////////////// +// +// Copy the bytes from a buffer supplied by the caller +// to the input queue +// +// Parms: uint8_t * data, a pointer to the user's data +// +// Returns: TRUE if there was an empty location in the queue +// to copy the data into +// FALSE if not +// Sets: ERROR_REPLY_OVR if there was no room in the queue +// +bool _genieEnqueueEvent (uint8_t * data) { + + + if (_genieEventQueue.n_events < MAX_GENIE_EVENTS-2) { + memcpy (&_genieEventQueue.frames[_genieEventQueue.wr_index], data, + GENIE_FRAME_SIZE); + _genieEventQueue.wr_index++; + _genieEventQueue.wr_index &= MAX_GENIE_EVENTS -1; + _genieEventQueue.n_events++; + return TRUE; + } else { + _genieError = ERROR_REPLY_OVR; + _handleError(); + return FALSE; + } +} +///////////////////// _genieSetLinkState //////////////////////// +// +// Set the logical state of the link to the display. +// +// Parms: uint16_t newstate, a value to be written to the +// link's _genieLinkState variable. Valid values are +// GENIE_LINK_IDLE 0 +// GENIE_LINK_WFAN 1 // waiting for Ack or Nak +// GENIE_LINK_WF_RXREPORT 2 // waiting for a report frame +// GENIE_LINK_RXREPORT 3 // receiving a report frame +// GENIE_LINK_RXEVENT 4 // receiving an event frame +// GENIE_LINK_SHDN 5 +// +void _genieSetLinkState (uint16_t newstate) { + + *_genieLinkState = newstate; + + + if (newstate == GENIE_LINK_RXREPORT || \ + newstate == GENIE_LINK_RXEVENT) + rxframe_count = 0; +} + + +/////////////////////// _genieGetLinkState ////////////////////// +// +// Get the current logical state of the link to the display. +// +uint16_t _genieGetLinkState (void) { + return *_genieLinkState; +} + +/////////////////////// _geniePutchar /////////////////////////// +// +// Output the supplied character to the Genie display over +// the selected serial port +// +void _geniePutchar (uint8_t c) { + // if (screen != NULL) + screen.putc(c); +} + + +//////////////////////// _genieGetchar ////////////////////////// +// +// Get a character from the selected Genie serial port +// +// Returns: ERROR_NOHANDLER if an Rx handler has not +// been defined +// ERROR_NOCHAR if no bytes have beeb received +// The char if there was one to get +// Sets: _genieError with any errors encountered +// +uint8_t _genieGetchar() { + uint16_t result; + + + _genieError = ERROR_NONE; + + return (screen.getc()); +} + +void RxIrqHandler(void) +{ + do + { + genieDoEvents(); + } + while(screen.readable ()); +} + + +void TickerIrq(void) +{ +} + + +void SetupGenie(void) +{ + screen.baud(9600); + pcusb.baud(9600); + screen.attach(&RxIrqHandler,Serial::RxIrq); + t.start(); + // EventChk.attach(&TickerIrq,0.05); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_genie.h Wed May 05 08:13:43 2021 +0000 @@ -0,0 +1,136 @@ +#undef GENIE_DEBUG + +#define GENIE_VERSION "GenieMbed 17-Nov-2013" + +// Genie commands & replys: + +#define GENIE_ACK 0x06 +#define GENIE_NAK 0x15 + +#define TIMEOUT_PERIOD 500 +#define RESYNC_PERIOD 100 + +#define GENIE_READ_OBJ 0 +#define GENIE_WRITE_OBJ 1 +#define GENIE_WRITE_STR 2 +#define GENIE_WRITE_STRU 3 +#define GENIE_WRITE_CONTRAST 4 +#define GENIE_REPORT_OBJ 5 +#define GENIE_REPORT_EVENT 7 + +// Objects +// the manual says: +// Note: Object IDs may change with future releases; it is not +// advisable to code their values as constants. + +#define GENIE_OBJ_DIPSW 0 +#define GENIE_OBJ_KNOB 1 +#define GENIE_OBJ_ROCKERSW 2 +#define GENIE_OBJ_ROTARYSW 3 +#define GENIE_OBJ_SLIDER 4 +#define GENIE_OBJ_TRACKBAR 5 +#define GENIE_OBJ_WINBUTTON 6 +#define GENIE_OBJ_ANGULAR_METER 7 +#define GENIE_OBJ_COOL_GAUGE 8 +#define GENIE_OBJ_CUSTOM_DIGITS 9 +#define GENIE_OBJ_FORM 10 +#define GENIE_OBJ_GAUGE 11 +#define GENIE_OBJ_IMAGE 12 +#define GENIE_OBJ_KEYBOARD 13 +#define GENIE_OBJ_LED 14 +#define GENIE_OBJ_LED_DIGITS 15 +#define GENIE_OBJ_METER 16 +#define GENIE_OBJ_STRINGS 17 +#define GENIE_OBJ_THERMOMETER 18 +#define GENIE_OBJ_USER_LED 19 +#define GENIE_OBJ_VIDEO 20 +#define GENIE_OBJ_STATIC_TEXT 21 +#define GENIE_OBJ_SOUND 22 +#define GENIE_OBJ_TIMER 23 +#define GENIE_OBJ_SPECTRUM 24 +#define GENIE_OBJ_SCOPE 25 +#define GENIE_OBJ_TANK 26 +#define GENIE_OBJ_USERIMAGES 27 +#define GENIE_OBJ_PINOUTPUT 28 +#define GENIE_OBJ_PININPUT 29 +#define GENIE_OBJ_4DBUTTON 30 +#define GENIE_OBJ_ANIBUTTON 31 +#define GENIE_OBJ_COLORPICKER 32 +#define GENIE_OBJ_USERBUTTON 33 + +// Structure to store replys returned from a display + +#define GENIE_FRAME_SIZE 6 +struct genieFrameReportObj { + uint8_t cmd; + uint8_t object; + uint8_t index; + uint8_t data_msb; + uint8_t data_lsb; +}; + +///////////////////////////////////////////////////////////////////// +// The Genie frame definition +// +// The union allows the data to be referenced as an array of uint8_t +// or a structure of type genieFrameReportObj, eg +// +// genieFrame f; +// f.bytes[4]; +// f.reportObject.data_lsb +// +// both methods get the same byte +// +union genieFrame { + uint8_t bytes[GENIE_FRAME_SIZE]; + genieFrameReportObj reportObject; +}; + +#define MAX_GENIE_EVENTS 16 // MUST be a power of 2 +#define MAX_GENIE_FATALS 10 + +struct genieEventQueueStruct { + genieFrame frames[MAX_GENIE_EVENTS]; + uint8_t rd_index; + uint8_t wr_index; + uint8_t n_events; +}; + +typedef void (*geniePutCharFuncPtr) (uint8_t c, uint32_t baud); +typedef uint16_t (*genieGetCharFuncPtr) (void); +typedef void (*genieUserEventHandlerPtr) (void); + +#define ERROR_NONE 0 +#define ERROR_TIMEOUT -1 // 255 0xFF +#define ERROR_NOHANDLER -2 // 254 0xFE +#define ERROR_NOCHAR -3 // 253 0xFD +#define ERROR_NAK -4 // 252 0xFC +#define ERROR_REPLY_OVR -5 // 251 0xFB +#define ERROR_RESYNC -6 // 250 0xFA +#define ERROR_NODISPLAY -7 // 249 0xF9 +#define ERROR_BAD_CS -8 // 248 0xF8 + +#define GENIE_LINK_IDLE 0 +#define GENIE_LINK_WFAN 1 // waiting for Ack or Nak +#define GENIE_LINK_WF_RXREPORT 2 // waiting for a report frame +#define GENIE_LINK_RXREPORT 3 // receiving a report frame +#define GENIE_LINK_RXEVENT 4 // receiving an event frame +#define GENIE_LINK_SHDN 5 + +#define GENIE_EVENT_NONE 0 +#define GENIE_EVENT_RXCHAR 1 + +#ifndef TRUE +#define TRUE (1==1) +#define FALSE (!TRUE) +#endif + +void SetupGenie(void); +void genieAttachEventHandler (genieUserEventHandlerPtr handler); +extern bool genieDequeueEvent (genieFrame * buff); +extern bool genieEventIs (genieFrame * e, uint8_t cmd, uint8_t object, uint8_t index); +extern uint16_t genieGetEventData (genieFrame * e); +extern uint16_t genieWriteObject (uint16_t object, uint16_t index, uint16_t data); +extern uint16_t genieWriteStr (uint16_t index, char *string); +extern void genieWriteContrast (uint16_t value); +