Baseline for testing

Revision:
1:a2073f60d3a6
Parent:
0:e24f6400a8c8
Child:
2:180c90fb759c
--- a/AddressMap.cpp	Thu Jul 25 00:43:23 2019 +0000
+++ b/AddressMap.cpp	Thu Sep 12 11:28:05 2019 +0000
@@ -6,28 +6,58 @@
 #include "stdio.h"
 #include "stdlib.h"
 
-#define TEXT_FILE 1
-
+#define TEXT_FILE 0
+#define ADDRESS_MAP_VERSION 0xFAFA0001
 #if TEXT_FILE 
-const char * filePath = "/local/addresses.txt";
+const char * filePath = "/local/address.txt";
 #else
-const char * filePath = "/local/addresses.bin";
+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;
+}
 
 
-void AddressMap::init()
+int AddressMap::init()
 {
+    int result = 0;
     int i=0;
-    printf("Initializing Default Data\n\r");
-        
-    addresses[i].address = i;        
-    sprintf(addresses[i].description, "Basement %d" , i);
     
-    for (int i=1;i<100;i++)
+    printf("Initializing Address Map\n\r");
+    if (!load())
+    {
+        result = reset();
+    } 
+    else
     {
-        addresses[i].address = i;        
-        sprintf(addresses[i].description, "Floor %d" , i);
-    }  
+        result = 1;
+    }
+    
+    printf("Complete Init\n\r");
+    return result;
+
 }
 
 void trim(const char *input, char *result)
@@ -46,41 +76,45 @@
 
 int AddressMap::load()
 {   
-    int success = 0;
+    int result = 0;
         
+    printf("Loading Address Map Data\n\r");
+    
 #if TEXT_FILE
-    FILE *fp = fopen (filePath,"r");
+    FILE *input = fopen (filePath,"r");
     
-    if (fp != NULL) {
+    if (input != NULL) {
         
         int i=0;
         char line[128];
-        while (!feof(fp)) {
+        while (!feof(input)) {
           
           memset(line,0,sizeof(line));
-          fgets(line,sizeof(line),fp);
+          
+          fgets(line,sizeof(line),input);
           
-          int    t = 0;
-          char * p = strtok (line,",:");
-          while (p!= NULL)
-          {
-            if (t==0) {
-                addresses[i].address = atoi(p);
-            } else if (t==1){
-                trim(p,addresses[i].description);
-            } else {
-            }
-            p = strtok (NULL, ",:");
-            t++;
-          }
-          
+          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(fp);
+        fclose(input);
+        result = 1;        
     }
     else
     {
-        init();
+        printf("Error: Cannot read %s\n\r", filePath);
+        result = 0;        
     }
     
 #else
@@ -89,64 +123,96 @@
     if(input){
         
         printf("Reading %s\n\r",filePath );
-        int size = MAX_ADDRESSES;
+        int format;
+        int size;;
         
-        fread(&size, sizeof(uint32_t),1,input);
+        fread(&format, sizeof(uint32_t),1,input);
+        fread(&size  , sizeof(uint32_t),1,input);
         
-        for (int i=0;i<100;i++)
-        {
-            printf("." );
-            fread( &addresses[i].address,     sizeof(uint32_t),1 , input);
-            fread(  addresses[i].description, sizeof(char)    ,40, 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);
-        success = 1;
     }
     else
     {
-        printf("Could not Read %s\n\r",filename );
+        printf("Error: Cannot read %s\n\r",filePath );
+        result = 0;        
     }
 #endif
     
-    return success;
+    return result;
 }
 
 
 
-void AddressMap::save()
+int AddressMap::save()
 {
+    int result = 0;
     printf("Saving %s\n\r",filePath );
     
 #if TEXT_FILE
     FILE *output = fopen(filePath, "w");
     
-    for (int i=0;i<100;i++)
+    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
     {
-        fprintf(output, "%02d:%s\n\r" ,
-            addresses[i].address, addresses[i].description);
+        printf("Error: Cannot write %s\n\r",filePath);
+        result = 0;
     }
-    fflush(output);
-    fclose(output);
 #else
 
     FILE *output = fopen(filePath, "wb");
-    
-    int size = MAX_ADDRESSES;
-    
-    fwrite(&size, sizeof(uint32_t),1,output);
-    
-    for (int i=0;i<100;i++)
+
+    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("." );
-        fwrite( &addresses[i].address,     sizeof(uint32_t),1 , output);
-        fwrite(  addresses[i].description, sizeof(char)    ,40, output);
+        printf("Error: Cannot write %s\n\r",filePath);
+        result = 0;
     }
-    fflush(output);
-    fclose(output);
-    
 #endif
     
     printf("Done \n\r" );
+    return result;
 }
 
 void AddressMap::display(Serial *pc)
@@ -176,10 +242,10 @@
 }
 
 
-char* AddressMap::getString(unsigned char idx )
+char* AddressMap::getDescription(unsigned char idx )
 {
     if (idx < MAX_ADDRESSES )
         return addresses[idx].description;
     else
-        return NULL;
+        return "Invalid Address";
 }