Baseline for testing
AddressMap.cpp
- Committer:
- foxbrianr
- Date:
- 2019-09-12
- Revision:
- 1:a2073f60d3a6
- Parent:
- 0:e24f6400a8c8
- Child:
- 2:180c90fb759c
File content as of revision 1:a2073f60d3a6:
#include "mbed.h" #include "AddressMap.h" #include "stdio.h" #include "stdlib.h" #define TEXT_FILE 0 #define ADDRESS_MAP_VERSION 0xFAFA0001 #if TEXT_FILE const char * filePath = "/local/address.txt"; #else const char * filePath = "/local/address.bin"; #endif int AddressMap::reset() { int result = 0; int i=0; printf("Initializing Default Data\n\r"); addresses[i].address = i; sprintf(addresses[i].description, "Basement", i); i++; #if 0 addresses[i].address = i; sprintf(addresses[i].description, "Lobby", i); i++; #endif int floor = 1; while (i<MAX_ADDRESSES) { addresses[i].address = i; sprintf(addresses[i].description, "Floor %d", floor++); i++; } result = save(); return result; } int AddressMap::init() { int result = 0; int i=0; printf("Initializing Address Map\n\r"); if (!load()) { result = reset(); } else { result = 1; } printf("Complete Init\n\r"); return result; } void trim(const char *input, char *result) { int i, j, k = 0; j = strlen(input)-1; while (input[i] == 0x20 && input[i] != '\0' ) i++; while (input[j] == 0x20 && j>0 ) j--; for (i = 0; i<j; i++) { result[k++] = input[i]; } } int AddressMap::load() { int result = 0; printf("Loading Address Map Data\n\r"); #if TEXT_FILE FILE *input = fopen (filePath,"r"); if (input != NULL) { int i=0; char line[128]; while (!feof(input)) { memset(line,0,sizeof(line)); fgets(line,sizeof(line),input); sscanf(line,"%02d:%20s\n\r", &addresses[i].address, addresses[i].description); printf("[%30s] :: %02d:%20s\n\r", line, addresses[i].address, addresses[i].description); #if 0 printf (line); #endif i++; } fclose(input); result = 1; } else { printf("Error: Cannot read %s\n\r", filePath); result = 0; } #else FILE *input = fopen(filePath, "rb"); if(input){ printf("Reading %s\n\r",filePath ); int format; int size;; fread(&format, sizeof(uint32_t),1,input); fread(&size , sizeof(uint32_t),1,input); if (format == ADDRESS_MAP_VERSION && size == MAX_ADDRESSES) { for (int i=0;i<MAX_ADDRESSES;i++) { printf("." ); fread( &addresses[i].address, sizeof(uint32_t),1 , input); fread( addresses[i].description, sizeof(char) ,MAX_ADDR_LENGTH, input); } result = 1; } else { printf("Error: Wrong version cannot read %s\n\r",filePath ); result = 0; } fclose(input); } else { printf("Error: Cannot read %s\n\r",filePath ); result = 0; } #endif return result; } int AddressMap::save() { int result = 0; printf("Saving %s\n\r",filePath ); #if TEXT_FILE FILE *output = fopen(filePath, "w"); if (output ) { for (int i=0;i<MAX_ADDRESSES;i++) { //printf("." ); fprintf(output, "%02d:%-20s\n\r" , addresses[i].address, addresses[i].description); } fflush(output); fclose(output); result = 1; } else { printf("Error: Cannot write %s\n\r",filePath); result = 0; } #else FILE *output = fopen(filePath, "wb"); if (output!=NULL) { uint32_t format = ADDRESS_MAP_VERSION; uint32_t size = MAX_ADDRESSES; fwrite(&format, sizeof(uint32_t),1,output); fwrite(&size, sizeof(uint32_t),1,output); for (int i=0; i<MAX_ADDRESSES; i++) { printf("." ); fwrite( &addresses[i].address, sizeof(uint32_t),1, output); fwrite( addresses[i].description, sizeof(char),MAX_ADDR_LENGTH, output); } fflush(output); fclose(output); result = 1; } else { printf("Error: Cannot write %s\n\r",filePath); result = 0; } #endif printf("Done \n\r" ); return result; } void AddressMap::display(Serial *pc) { pc->printf("\n\r"); pc->printf("-----------------------------\n\r"); pc->printf("-- Addresses \n\r"); pc->printf("-----------------------------\n\r"); for (int i=0;i<MAX_ADDRESSES;i++) { pc->printf("%02d : [%s]\n\r", addresses[i].address, addresses[i].description); } } void AddressMap::play(Serial *pc, int address) { if (address>=0&&address<MAX_ADDRESSES){ pc->printf("%02d : %s is open\n\r", address, addresses[address].description); } else { pc->printf("%02d : error \n\r", address); } } char* AddressMap::getDescription(unsigned char idx ) { if (idx < MAX_ADDRESSES ) return addresses[idx].description; else return "Invalid Address"; }