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";
}