Baseline for testing

AddressMap.cpp

Committer:
foxbrianr
Date:
2019-07-25
Revision:
0:e24f6400a8c8
Child:
1:a2073f60d3a6

File content as of revision 0:e24f6400a8c8:


#include "mbed.h"

#include "AddressMap.h"

#include "stdio.h"
#include "stdlib.h"

#define TEXT_FILE 1

#if TEXT_FILE 
const char * filePath = "/local/addresses.txt";
#else
const char * filePath = "/local/addresses.bin";
#endif


void AddressMap::init()
{
    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++)
    {
        addresses[i].address = i;        
        sprintf(addresses[i].description, "Floor %d" , i);
    }  
}

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 success = 0;
        
#if TEXT_FILE
    FILE *fp = fopen (filePath,"r");
    
    if (fp != NULL) {
        
        int i=0;
        char line[128];
        while (!feof(fp)) {
          
          memset(line,0,sizeof(line));
          fgets(line,sizeof(line),fp);
          
          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++;
          }
          
          i++;
        }
        fclose(fp);
    }
    else
    {
        init();
    }
    
#else
    
    FILE *input = fopen(filePath, "rb");
    if(input){
        
        printf("Reading %s\n\r",filePath );
        int size = MAX_ADDRESSES;
        
        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);
        }
        fclose(input);
        success = 1;
    }
    else
    {
        printf("Could not Read %s\n\r",filename );
    }
#endif
    
    return success;
}



void AddressMap::save()
{
    printf("Saving %s\n\r",filePath );
    
#if TEXT_FILE
    FILE *output = fopen(filePath, "w");
    
    for (int i=0;i<100;i++)
    {
        fprintf(output, "%02d:%s\n\r" ,
            addresses[i].address, addresses[i].description);
    }
    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++)
    {
        printf("." );
        fwrite( &addresses[i].address,     sizeof(uint32_t),1 , output);
        fwrite(  addresses[i].description, sizeof(char)    ,40, output);
    }
    fflush(output);
    fclose(output);
    
#endif
    
    printf("Done \n\r" );
}

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::getString(unsigned char idx )
{
    if (idx < MAX_ADDRESSES )
        return addresses[idx].description;
    else
        return NULL;
}