Baseline for testing

Dependents:   mbed_escm2000

EventLog.cpp

Committer:
foxbrianr
Date:
2019-09-12
Revision:
1:aaddf80105fe
Parent:
0:929bb73983c5
Child:
2:486d068deff9

File content as of revision 1:aaddf80105fe:


#include "mbed.h"
#include "EventLog.h"
#include "stdio.h"




/*-------------------------------------------------------------------
 * define local file system
 *-------------------------------------------------------------------*/
LocalFileSystem local("local");

const char * filename = "/local/events.bin";
    

ESCM_Event::ESCM_Event(): address(0),port(0xFF)
{
    
}

ESCM_Event::ESCM_Event(uint16_t address): address(address),port(0xFF)
{
    setTimeNow();
}

void ESCM_Event::setTimeNow(void)
{
    time_t rawtime;
    struct tm * timeinfo;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );  timeinfo = localtime (&rawtime);
    
    hours   = timeinfo->tm_hour;
    mins    = timeinfo->tm_min;
    secs    = timeinfo->tm_sec;
    year    = timeinfo->tm_year+1900;
    month   = timeinfo->tm_mon + 1;
    day     = timeinfo->tm_mday;
}

void ESCM_Event::getTime (char * buffer) {
    sprintf(buffer,"%02d:%02d %02d/%02d/%04d", hours,mins,month,day,year);
}
    


ESCM_EventLog::ESCM_EventLog() {
    full_=false;
    head_=0;
    tail_=0;

}

ESCM_EventLog::~ESCM_EventLog() {
}

int ESCM_EventLog::init()
{
    full_=false;
    head_=0;
    tail_=0;
    
    printf("Initializing Event Log\n\r");
    
    if ( !load() )
    {
        memset ( events,0,sizeof(ESCM_Event)*MAX_EVENTS);
        // for testing
        for ( int i=0;i<MAX_EVENTS;i++)
        { 
            add(i*2);
        }
        save();
         
    }
    
    return 1;
}

int ESCM_EventLog::load()
{
#if 1
    
    printf("Reading %s ...",filename );
    FILE *input = fopen(filename, "rb");
    if(input!= NULL){
        
        uint16_t code;
        uint16_t size;
        
        fread(&code,  sizeof(uint16_t),1,input);
        fread(&size,  sizeof(uint16_t),1,input);
        
        if (code != 0xFAFA && size > 50 ) {
            return 0;
        }
            
        fread(&head_, sizeof(uint16_t),1,input);
        fread(&tail_, sizeof(uint16_t),1,input);
        
        for (int i=0;i<MAX_EVENTS;i++)
        {
            printf("." );
            fread( &events[i].port,        sizeof(uint16_t),1 , input);
            fread( &events[i].address,     sizeof(uint16_t),1 , input);
            fread( &events[i].hours,       sizeof(uint16_t),1 , input);
            fread( &events[i].mins,        sizeof(uint16_t),1 , input);
            fread( &events[i].secs,        sizeof(uint16_t),1 , input);
            fread( &events[i].day,         sizeof(uint16_t),1 , input);
            fread( &events[i].month,       sizeof(uint16_t),1 , input);
            fread( &events[i].year,        sizeof(uint16_t),1 , input);
            
            //fread(  events[i].timeStr,   sizeof(char)    ,40, input);
        }
        fclose(input);
    }
    else
    {
        printf("Could not Read %s\n\r",filename );
        return 0;
    }
#endif
    return 1;  
}

int ESCM_EventLog::save()
{
#if 1
    printf("Saving %s ...",filename );
    
    FILE *output = fopen(filename, "wb");
    if (output != NULL) {
        
        uint16_t code = 0xFAFA;
        uint16_t size = MAX_EVENTS;
        
        fwrite(&code,  sizeof(uint16_t),1,output);
        fwrite(&size,  sizeof(uint16_t),1,output);
        fwrite(&head_, sizeof(uint16_t),1,output);
        fwrite(&tail_, sizeof(uint16_t),1,output);
        
        for (int i=0;i<MAX_EVENTS;i++)
        {
            //printf("." );    
            fwrite( &events[i].port,        sizeof(uint16_t),1 , output);
            fwrite( &events[i].address,     sizeof(uint16_t),1 , output);
            fwrite( &events[i].hours,       sizeof(uint16_t),1 , output);
            fwrite( &events[i].mins,        sizeof(uint16_t),1 , output);
            fwrite( &events[i].secs,        sizeof(uint16_t),1 , output);
            fwrite( &events[i].day,         sizeof(uint16_t),1 , output);
            fwrite( &events[i].month,       sizeof(uint16_t),1 , output);
            fwrite( &events[i].year,        sizeof(uint16_t),1 , output);
                
        }
        fflush(output);
        fclose(output);
    }
    else
    {
        printf("Could not save %s\n\r",filename );
        return 0;
    }
    
#endif
    
    printf("Done \n\r" );
    return 1;
}

void ESCM_EventLog::display(Serial *pc)
{
    int j = tail_;
    int i = head_ ;
    int count = 0 ;

    pc->printf("\n\r");
    pc->printf("-----------------------------\n\r");
    pc->printf("- Event Log \n\r");
    pc->printf("-----------------------------\n\r");
    pc->printf("%d %d %d \n\r", i,j, full_);
    
    
    while ( count < size() )
    {
        if (--i < 0 ) {
            i =( max_size_ - 1 );
        }
            
        pc->printf("%02d <%02d> %02d :: %02d:%02d:%02d %02d/%02d/%04d \n\r", 
        count, 
        events[i].port, 
        events[i].address, 
        events[i].hours, 
        events[i].mins,
        events[i].secs,
        events[i].month,
        events[i].day,
        events[i].year
        );

        count++;
    }
    pc->printf("-----------------------------\n\r");
}
void ESCM_EventLog::add(uint16_t address, uint16_t port)
{
    
    
    ESCM_Event newEvent;
    newEvent.address = address;
    newEvent.port    = port;
    newEvent.setTimeNow();
    //sprintf ( newEvent.timeStr , "%s", "===");
    
    put( newEvent );
    
}

void ESCM_EventLog::add(uint16_t address)
{
    
    
    ESCM_Event newEvent;
    newEvent.address = address;
    newEvent.port    = 0;
    newEvent.setTimeNow();
    //sprintf ( newEvent.timeStr , "%s", "===");
    
    put( newEvent );
    
}

void ESCM_EventLog::add(uint16_t address, char* timeStamp)
{
    ESCM_Event newEvent;
    newEvent.address = address;
    newEvent.setTimeNow();
    //sprintf ( newEvent.timeStr , "%-16s", timeStamp);
    
    put( newEvent );
    
}

ESCM_Event * ESCM_EventLog::index (int pos ){


    ESCM_Event * result = NULL;
    
    if (!empty())
    {
        if (pos < size() || pos >= 0 ) {
            
            int index = (head_ - 1 - pos );
            
            if (index < 0 )
                index += max_size_;
            
            result = &(events[index]); 
        }
    }
    
    return result;
    
}