Baseline for testing

AddressMap.cpp

Committer:
foxbrianr
Date:
2019-09-27
Revision:
3:573403f12cdd
Parent:
2:180c90fb759c

File content as of revision 3:573403f12cdd:

/**************************************************************************//**
 * @file     AddressMap.cpp
 * @brief    Base class for storage of Address Mapping data.
 * @version: V1.0
 * @date:    9/17/2019

 *
 * @note
 * Copyright (C) 2019 E3 Design. All rights reserved.
 *
 * @par
 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768
 * processor based microcontroller for the ESCM 2000 Monitor and Display.  
 *  *
 * @par
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 ******************************************************************************/
#include "mbed.h"
#include "AddressMap.h"
#include "stdio.h"
#include "stdlib.h"

#define ADDRESS_MAP_VERSION 0xFAFA0001

const char * filePath = "/local/address.bin";

/******************************************************************************/
int AddressMap::reset()
{
    int result = 0;
    int i=0;
    
    printf("Initializing Default Data\n\r");

#if 0
    addresses[i].address = i;
    sprintf(addresses[i].description, "Basement", i);
    i++;
    addresses[i].address = i;
    sprintf(addresses[i].description, "Lobby", i);
    i++;
#endif
    int floor = 0;
    while (i<MAX_ADDRESSES) {
        addresses[i].address = i;
        sprintf(addresses[i].description, "Unit %d", i);
        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;

}

/******************************************************************************/
int AddressMap::load()
{   
    int result = 0;
        
    printf("Loading Address Map Data\n\r");
        
    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++)
            {
                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;        
    }
    
    return result;
}



/******************************************************************************/
int AddressMap::save()
{
    int result = 0;
    printf("Saving %s\n\r",filePath );
    

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


/******************************************************************************/
char* AddressMap::getDescription(unsigned char idx )
{
    if (idx < MAX_ADDRESSES && idx >= 0 )
        return addresses[idx].description;
    else
        return "Invalid Address";
}
/******************************************************************************/