Sergei G / Mbed OS Borsch

Dependencies:   DataStore JobScheduler NetworkServices W5500Interface nanopb protocol

Committer:
sgnezdov
Date:
Thu Aug 03 20:57:50 2017 +0000
Revision:
16:bef1673b199e
Parent:
15:f83485cc5a2c
Child:
17:b79ce8109995
jobList successfully sends data, but causes stack underflow; added new job to test uploads in the simplest possible way

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgnezdov 11:acaefb63fc6b 1 #include "jobSchedulesUpload.h"
sgnezdov 11:acaefb63fc6b 2
sgnezdov 11:acaefb63fc6b 3 #include "mbed-trace/mbed_trace.h"
sgnezdov 11:acaefb63fc6b 4 #define TRACE_GROUP "scup"
sgnezdov 11:acaefb63fc6b 5
sgnezdov 13:0fdbc14c33e7 6 #include "nanopb/source/protobuf/pb.h"
sgnezdov 13:0fdbc14c33e7 7 #include "nanopb/source/protobuf/pb_encode.h"
sgnezdov 13:0fdbc14c33e7 8 #include "protocol/source/job.pb.h"
sgnezdov 13:0fdbc14c33e7 9 #include <string.h>
sgnezdov 13:0fdbc14c33e7 10 #include "LinkedList.h"
sgnezdov 13:0fdbc14c33e7 11 #include "scheduler.h"
sgnezdov 13:0fdbc14c33e7 12 #include "schedules.h"
sgnezdov 13:0fdbc14c33e7 13
sgnezdov 13:0fdbc14c33e7 14 // encode signature
sgnezdov 13:0fdbc14c33e7 15 // bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
sgnezdov 13:0fdbc14c33e7 16 //bool pbOutStream(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) {
sgnezdov 13:0fdbc14c33e7 17 // return true;
sgnezdov 13:0fdbc14c33e7 18 //}
sgnezdov 13:0fdbc14c33e7 19
sgnezdov 14:65d69aed6540 20 bool fillScheduleData(protocol_Job_ScheduleData_t& pbSchedData, JobScheduler::Appointment& apt) {
sgnezdov 14:65d69aed6540 21 JobScheduler::Job* job = apt.GetJob();
sgnezdov 14:65d69aed6540 22 JobScheduler::ISchedule* schedule = job->GetSchedule();
sgnezdov 13:0fdbc14c33e7 23 int schedType = schedule->ScheduleType();
sgnezdov 13:0fdbc14c33e7 24 switch (schedType) {
sgnezdov 13:0fdbc14c33e7 25 case 1: {
sgnezdov 13:0fdbc14c33e7 26 // protocol_ScheduleType_RunOnce case
sgnezdov 13:0fdbc14c33e7 27 tr_debug("encoding RunOnceSchedule");
sgnezdov 13:0fdbc14c33e7 28 JobScheduler::RunOnceSchedule* s = static_cast<JobScheduler::RunOnceSchedule*>(schedule);
sgnezdov 13:0fdbc14c33e7 29 protocol_RunOnceSchedule pbSched;
sgnezdov 13:0fdbc14c33e7 30 pbSched.AtUnixSec = (uint32_t)s->AtTime();
sgnezdov 14:65d69aed6540 31 // Time should've been pushed to Appointment structure in all cases.
sgnezdov 14:65d69aed6540 32 if (pbSched.AtUnixSec != 0) {
sgnezdov 14:65d69aed6540 33 tr_warn("Run once has not be assigned to appointment yet. AtUnixSec: %d", pbSched.AtUnixSec);
sgnezdov 14:65d69aed6540 34 } else {
sgnezdov 14:65d69aed6540 35 pbSched.AtUnixSec = (uint32_t)apt.GetTime();
sgnezdov 14:65d69aed6540 36 }
sgnezdov 13:0fdbc14c33e7 37 pb_ostream_t stream = pb_ostream_from_buffer(pbSchedData.bytes, sizeof(pbSchedData.bytes));
sgnezdov 13:0fdbc14c33e7 38 pb_encode(&stream, protocol_RunOnceSchedule_fields, &pbSched);
sgnezdov 13:0fdbc14c33e7 39 pbSchedData.size = stream.bytes_written;
sgnezdov 14:65d69aed6540 40 //tr_debug("sizeof(pbSchedData.bytes): %d, AtUnixSec: %d, bytes written: %d", sizeof(pbSchedData.bytes), pbSched.AtUnixSec, stream.bytes_written);
sgnezdov 13:0fdbc14c33e7 41 return true;
sgnezdov 13:0fdbc14c33e7 42 }
sgnezdov 13:0fdbc14c33e7 43 case 2: {
sgnezdov 13:0fdbc14c33e7 44 // protocol_ScheduleType_Periodic case
sgnezdov 13:0fdbc14c33e7 45 tr_debug("encoding RunPeriodicSchedule");
sgnezdov 13:0fdbc14c33e7 46 //JobScheduler::RunPeriodicSchedule* s = static_cast<JobScheduler::RunPeriodicSchedule*>(schedule);
sgnezdov 13:0fdbc14c33e7 47 //protocol_PeriodicSchedule pbSched;
sgnezdov 13:0fdbc14c33e7 48 return true;
sgnezdov 13:0fdbc14c33e7 49 }
sgnezdov 13:0fdbc14c33e7 50 default: {
sgnezdov 13:0fdbc14c33e7 51 tr_error("Unknown schedule type %d", schedType);
sgnezdov 13:0fdbc14c33e7 52 return false;
sgnezdov 13:0fdbc14c33e7 53 }
sgnezdov 13:0fdbc14c33e7 54 }
sgnezdov 13:0fdbc14c33e7 55 }
sgnezdov 13:0fdbc14c33e7 56
sgnezdov 11:acaefb63fc6b 57 void JobSchedulesUpload::Run() {
sgnezdov 11:acaefb63fc6b 58 tr_info("Job Schedules Upload");
sgnezdov 13:0fdbc14c33e7 59
sgnezdov 13:0fdbc14c33e7 60 protocol_JobList pbJobs = protocol_JobList_init_zero;
sgnezdov 13:0fdbc14c33e7 61 strcpy(pbJobs.sn, this->_conf.SerialNumber());
sgnezdov 13:0fdbc14c33e7 62
sgnezdov 13:0fdbc14c33e7 63 {
sgnezdov 14:65d69aed6540 64 LinkedList<JobScheduler::Appointment> apts;
sgnezdov 14:65d69aed6540 65 this->_scheduler.AppointmentList(apts);
sgnezdov 14:65d69aed6540 66 node<JobScheduler::Appointment>* aptn = apts.pop(1);
sgnezdov 13:0fdbc14c33e7 67 int idx = 0;
sgnezdov 15:f83485cc5a2c 68 pbJobs.items_count = 0;
sgnezdov 14:65d69aed6540 69 while (aptn != NULL) {
sgnezdov 14:65d69aed6540 70 JobScheduler::Appointment* apt = aptn->data;
sgnezdov 14:65d69aed6540 71 JobScheduler::Job* job = apt->GetJob();
sgnezdov 13:0fdbc14c33e7 72 tr_debug("adding job ID: %d, type: %d\n", job->GetID(), job->GetTypeID());
sgnezdov 13:0fdbc14c33e7 73 pbJobs.items[idx].ID = job->GetID();
sgnezdov 13:0fdbc14c33e7 74 pbJobs.items[idx].TypeID = job->GetTypeID();
sgnezdov 13:0fdbc14c33e7 75 pbJobs.items[idx].ScheduleTypeID = static_cast<protocol_ScheduleType>(job->GetSchedule()->ScheduleType());
sgnezdov 13:0fdbc14c33e7 76 // pbJobs.items[idx].ScheduleData =
sgnezdov 14:65d69aed6540 77 if (!fillScheduleData(pbJobs.items[idx].ScheduleData, *apt)) {
sgnezdov 13:0fdbc14c33e7 78 tr_error("job error: failed to fill schedule");
sgnezdov 13:0fdbc14c33e7 79 return;
sgnezdov 13:0fdbc14c33e7 80 }
sgnezdov 16:bef1673b199e 81 //tr_debug("schedule data size: %d", pbJobs.items[idx].ScheduleData.size);
sgnezdov 13:0fdbc14c33e7 82 // pbJobs.items[idx].Data =
sgnezdov 15:f83485cc5a2c 83 pbJobs.items_count = idx;
sgnezdov 13:0fdbc14c33e7 84
sgnezdov 14:65d69aed6540 85 apts.remove(1);
sgnezdov 14:65d69aed6540 86 aptn = apts.pop(1);
sgnezdov 13:0fdbc14c33e7 87 idx++;
sgnezdov 13:0fdbc14c33e7 88 }
sgnezdov 13:0fdbc14c33e7 89 }
sgnezdov 13:0fdbc14c33e7 90
sgnezdov 16:bef1673b199e 91 // encode to nothing to detect buffer size
sgnezdov 15:f83485cc5a2c 92 pb_ostream_t sizeStream = {0};
sgnezdov 15:f83485cc5a2c 93 pb_encode(&sizeStream, protocol_JobList_fields, &pbJobs);
sgnezdov 15:f83485cc5a2c 94
sgnezdov 16:bef1673b199e 95 // allocate output buffer and encode into it
sgnezdov 15:f83485cc5a2c 96 uint8_t* outBuf = new uint8_t[sizeStream.bytes_written];
sgnezdov 16:bef1673b199e 97 pb_ostream_t outStream = pb_ostream_from_buffer(outBuf, sizeStream.bytes_written);
sgnezdov 15:f83485cc5a2c 98 pb_encode(&outStream, protocol_JobList_fields, &pbJobs);
sgnezdov 16:bef1673b199e 99
sgnezdov 16:bef1673b199e 100 tr_array(outBuf, outStream.bytes_written);
sgnezdov 16:bef1673b199e 101
sgnezdov 16:bef1673b199e 102 // send CoAP message
sgnezdov 16:bef1673b199e 103 time_t now = time(NULL);
sgnezdov 16:bef1673b199e 104 _lce.SendV1("/uw/joblist", outBuf, outStream.bytes_written, false, now);
sgnezdov 15:f83485cc5a2c 105 delete outBuf;
sgnezdov 11:acaefb63fc6b 106 }
sgnezdov 11:acaefb63fc6b 107
sgnezdov 11:acaefb63fc6b 108
sgnezdov 11:acaefb63fc6b 109