Sergei G / Mbed OS Borsch

Dependencies:   DataStore JobScheduler NetworkServices W5500Interface nanopb protocol

Revision:
18:133a51becbe1
Parent:
17:b79ce8109995
Child:
20:5b52a42b9a5d
--- a/source/jobSchedulesUpload.cpp	Thu Aug 03 22:44:59 2017 +0000
+++ b/source/jobSchedulesUpload.cpp	Thu Aug 03 23:51:07 2017 +0000
@@ -51,57 +51,67 @@
 void JobSchedulesUpload::Run() {
     tr_info("Job Schedules Upload");
     
-    protocol_JobList pbJobs = protocol_JobList_init_zero;
-//    strcpy(pbJobs.sn, this->_conf.SerialNumber());
+    // if used on the stack like:
+    // protocol_JobList* pbJobsPtr = protocol_JobList_init_zero;
+    // the code terminates with error:
+    //     CMSIS-RTOS error: Stack underflow (status: 0x1, task ID: 0x20002464, task name: )
+    // shortly after quitting this function.
+    
+    protocol_JobList* pbJobsPtr = new protocol_JobList(); // protocol_JobList_init_zero;
+    protocol_JobList& pbJobs = *pbJobsPtr;
+    // tr_debug("pbJobs size: %d", sizeof(pbJobs));
+    
+    strcpy(pbJobs.sn, this->_conf.SerialNumber());
     
-//    {
-//        LinkedList<JobScheduler::Appointment> apts;
-//        this->_scheduler.AppointmentList(apts);
-//        node<JobScheduler::Appointment>* aptn = apts.pop(1);
-//        int idx = 0;
-//        pbJobs.items_count = 0;
-//        while (aptn != NULL) {
-//            JobScheduler::Appointment* apt = aptn->data;
-//            JobScheduler::Job* job = apt->GetJob();
-//            tr_debug("adding job ID: %d, type: %d\n", job->GetID(), job->GetTypeID());
-//            pbJobs.items[idx].ID = job->GetID();
-//            pbJobs.items[idx].TypeID = job->GetTypeID();
-//            pbJobs.items[idx].ScheduleTypeID = static_cast<protocol_ScheduleType>(job->GetSchedule()->ScheduleType());
-//            // pbJobs.items[idx].ScheduleData = 
-//            if (!fillScheduleData(pbJobs.items[idx].ScheduleData, *apt)) {
-//                tr_error("job error: failed to fill schedule");
-//                return;
-//            }
-//            //tr_debug("schedule data size: %d", pbJobs.items[idx].ScheduleData.size);
-//            // pbJobs.items[idx].Data = 
-//            pbJobs.items_count = idx;
-//            
-//            apts.remove(1);
-//            aptn = apts.pop(1);
-//            idx++;
-//        }
-//    }
-//    
-//    // encode to nothing to detect buffer size
-//    pb_ostream_t sizeStream = {0};
-//    pb_encode(&sizeStream, protocol_JobList_fields, &pbJobs);
-//
-//    // allocate output buffer and encode into it
-//    uint8_t* outBuf = new uint8_t[sizeStream.bytes_written];
-//    pb_ostream_t outStream = pb_ostream_from_buffer(outBuf, sizeStream.bytes_written);
-//    pb_encode(&outStream, protocol_JobList_fields, &pbJobs);
-//        
-//    tr_array(outBuf, outStream.bytes_written);
+    {
+        LinkedList<JobScheduler::Appointment> apts;
+        this->_scheduler.AppointmentList(apts);
+        node<JobScheduler::Appointment>* aptn = apts.pop(1);
+        int idx = 0;
+        pbJobs.items_count = 0;
+        while (aptn != NULL) {
+            JobScheduler::Appointment* apt = aptn->data;
+            JobScheduler::Job* job = apt->GetJob();
+            tr_debug("adding job ID: %d, type: %d\n", job->GetID(), job->GetTypeID());
+            pbJobs.items[idx].ID = job->GetID();
+            pbJobs.items[idx].TypeID = job->GetTypeID();
+            pbJobs.items[idx].ScheduleTypeID = static_cast<protocol_ScheduleType>(job->GetSchedule()->ScheduleType());
+            // pbJobs.items[idx].ScheduleData = 
+            if (!fillScheduleData(pbJobs.items[idx].ScheduleData, *apt)) {
+                tr_error("job error: failed to fill schedule");
+                return;
+            }
+            //tr_debug("schedule data size: %d", pbJobs.items[idx].ScheduleData.size);
+            // pbJobs.items[idx].Data = 
+            pbJobs.items_count = idx;
+            
+            apts.remove(1);
+            aptn = apts.pop(1);
+            idx++;
+        }
+    }
+    
+    // encode to nothing to detect buffer size
+    pb_ostream_t sizeStream = {0};
+    pb_encode(&sizeStream, protocol_JobList_fields, &pbJobs);
+
+    // allocate output buffer and encode into it
+    uint8_t* outBuf = new uint8_t[sizeStream.bytes_written];
+    pb_ostream_t outStream = pb_ostream_from_buffer(outBuf, sizeStream.bytes_written);
+    pb_encode(&outStream, protocol_JobList_fields, &pbJobs);
+        
+    tr_array(outBuf, outStream.bytes_written);
 
     // send CoAP message
     time_t now = time(NULL);
     
-    uint8_t msg[] = { 0x0a, 0x07, 0x4e, 0x75, 0x63, 0x6c, 0x65, 0x6f, 0x31 };
-    size_t msgLen = 9;
-    _lce.SendV1("/uw/joblist", msg, msgLen, false, now);
+    //uint8_t msg[] = { 0x0a, 0x07, 0x4e, 0x75, 0x63, 0x6c, 0x65, 0x6f, 0x31 };
+    //size_t msgLen = 9;
+    //_lce.SendV1("/uw/joblist", msg, msgLen, false, now);
     
-    //_lce.SendV1("/uw/joblist", outBuf, outStream.bytes_written, false, now);
-//    delete outBuf;
+    _lce.SendV1("/uw/joblist", outBuf, outStream.bytes_written, false, now);
+    delete outBuf;
+    delete pbJobsPtr;
 }