/* Testprogram for accessing struct in flash memory MRU JR 091105 */ #include #include typedef uint8_t (*PROCFNP)(char *); typedef struct namefnpntr { PGM_P namestr; PROCFNP procfnp; } NAMEFNPNTR; /* functions for evaluating the GPS sentences */ uint8_t procPGALM(char *str) { return 0; } uint8_t procPGRMC(char *str) { return 0; } uint8_t procPGRMC1(char *str) { return 0; } uint8_t procPGRMI(char *str) { return 0; } uint8_t procPGRMO(char *str) { return 0; } /* Strings in program memory */ const char PROGMEM pgmPGALM[] = "PGALM"; const char PROGMEM pgmPGRMC[] = "PGRMC"; const char PROGMEM pgmPGRMC1[] = "PGRMC1"; const char PROGMEM pgmPGRMI[] = "PGRMI"; const char PROGMEM pgmPGRMO[] = "PGRMO"; /* Table in flash memory */ const NAMEFNPNTR namefntab[] PROGMEM = { {pgmPGALM, procPGALM}, {pgmPGRMC, procPGRMC}, {pgmPGRMC1, procPGRMC1}, {pgmPGRMI, procPGRMI}, {pgmPGRMO, procPGRMO} }; #define NAMEFNCNT 5 int8_t procGPS(char *chrp, NAMEFNPNTR *namefnp) { uint8_t i; /* pointer to current struct in name/func table */ void *pgmp; PROCFNP procfnpntr; /* search the table for the sentence name, note that the table is in the program space */ for (i = 0; i < NAMEFNCNT; i++) { pgmp = (void *) pgm_read_word(&(namefnp[i].namestr[0])); if (strcmp_P(&chrp[1], pgmp) != 0) /* sentence name starts at 1 */ { pgmp = (void *) &namefnp[i].procfnp; procfnpntr = (PROCFNP) pgm_read_word(pgmp); return procfnpntr(chrp); /* process the sentence */ } } /* for table entry */ return 0; } /* global variable */ char RXstr[82] = "$GPRMC,235958,A,5007.0000,N,0830.0000,E," "005.1,010.2,311208,002.3,W,A*1B\r\n"; int main(void) { (void) procGPS(RXstr, (NAMEFNPNTR *) &namefntab); return 0; }