research application on sending data to headend

Dependencies:   DataStore JobScheduler NetworkServices W5500Interface nanopb protocol

See "main.cpp" documentation on "API Documentation" tab for details about application.

source/main.cpp

Committer:
sgnezdov
Date:
2017-08-04
Revision:
19:40f5bcec121e
Parent:
17:b79ce8109995
Child:
20:5b52a42b9a5d

File content as of revision 19:40f5bcec121e:

#include "mbed.h"

#include "mbed-trace/mbed_trace.h"
#define TRACE_GROUP  "main"

#include "scheduler.h"
#include "schedules.h"
#include "jobService.h"
#include "netstack.h"
#include "config.h"
#include "lceProxy.h"

#include "jobTestPrint.h"
#include "jobFakeADC.h"
#include "jobSchedulesUpload.h"
#include "jobTestUpload.h"

 // These are necessary only if thread safety is needed
static Mutex TracingLock;
static void tracingWait()
{
    TracingLock.lock();
}
static void tracingRelease()
{
    TracingLock.unlock();
}

static bool initTime()
{
    struct tm clock;
    clock.tm_year = 2001 - 1900;
    clock.tm_mon = 0;
    clock.tm_mday = 1;
    clock.tm_hour = 13;
    clock.tm_min = 30;
    clock.tm_sec = 0;
    // time_t is in seconds
    time_t time = mktime(&clock);
    if (time == (time_t) - 1) {
        error("Error setting clock.");
        return false;
    }
    set_time(time);
    printf("Time is set to: %s\n", ctime(&time));
    return true;
}

int main()
{
    Serial pc(USBTX, USBRX);
    pc.baud(115200);

    printf("\n==Borsch==\n");
    
//    if (initTime() == false) {
//        printf("Application terminated: initTime has failed\n");
//        exit(1);
//    }
    
    /* Setup tracing */
    mbed_trace_mutex_wait_function_set( tracingWait ); // only if thread safety is needed
    mbed_trace_mutex_release_function_set( tracingRelease ); // only if thread safety is needed
    mbed_trace_init();       // initialize the trace library
    
    tr_info("**Started**");    //-> "[INFO][main]: this is an info msg"
    osThreadId_t tid = osThreadGetId();
    tr_debug("Main thread ID: 0x%X", tid);
    
    Config conf("Nucleo1");

    uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x45, 0x56, 0x67};
    NetworkInterface* nif = initNetworkStack(mac_addr);
    if (nif == NULL) {
        tr_error("**Terminated**");
        exit(0);
    }
    
    LceProxy lce(*nif, conf);
    
    JobScheduler::JobService js;   
    JobScheduler::Scheduler scheduler(&js);
   
    /* Job Type ID shall match command id defined in ISOM commandTypes.go
    While this rule is not strictly necessary it cuts down on code responsible
    for mapping between our internal IDs to CommandIDs.
    
    addKV(NewCommandMetaData(1, "NO-OP"))
    addKV(NewCommandMetaData(2, "List Schedules"))
    addKV(NewCommandMetaData(3, "Add Schedule"))
    addKV(NewCommandMetaData(4, "Remove Schedule"))
    addKV(NewCommandMetaData(5, "Set STM ADC Schedule"))
    addKV(NewCommandMetaData(31, "Close Valve"))
    addKV(NewCommandMetaData(32, "Open Valve"))
    
    Use range 1000 for unique to STM jobs.
    */

    // command #2 is List Schedules in ISOM.
    JobSchedulesUpload jSchedulesUpload(conf, lce, scheduler);
    js.Register(2, JobSchedulesUpload::RunAdapter, &jSchedulesUpload);
    
    JobTestPrint jTestPrint;
    js.Register(1001, JobTestPrint::RunAdapter, &jTestPrint);
    
    JobFakeADC jFakeADC(lce);
    js.Register(1002, JobFakeADC::RunAdapter, &jFakeADC);
    
    JobTestUpload jTestUpload(lce);
    js.Register(1003, JobTestUpload::RunAdapter, &jTestUpload);

    scheduler.Start();
    
    // inject test case
    time_t nowSecs = time(NULL);
    // NOTE: don't schedule run once with at 0, because 0 means never.
    //JobScheduler::Response<JobScheduler::JobID> res =
    scheduler.JobAdd(1003, new JobScheduler::RunOnceSchedule(nowSecs+1), NULL);
    scheduler.JobAdd(2, new JobScheduler::RunOnceSchedule(nowSecs+2), NULL);
    scheduler.JobAdd(1001, new JobScheduler::RunOnceSchedule(nowSecs+5), NULL);
    
    scheduler.JobAdd(2, new JobScheduler::RunPeriodicSchedule(10, 3), NULL);
    scheduler.JobAdd(1001, new JobScheduler::RunPeriodicSchedule(5, 10), NULL);
    
        //scheduler.JobAdd(1002, new JobScheduler::RunOnceSchedule(1), NULL);
        //scheduler.JobAdd(1001, new JobScheduler::RunOnceSchedule(nowSecs + 2), NULL);
    //res = scheduler.JobAdd(1002, new JobScheduler::RunPeriodicSchedule(2, 5), NULL);
    
    // block forever unless there is a job that calls scheduler.Stop()
    scheduler.WaitToStop();   
    
    /* we can somehow load new application image here and restart */
    
    // indicate clean app termination
    tr_info("**Finished**");    //-> "[INFO][main]: this is an info msg"    
    exit(0);
}