Sergei G / Mbed OS Borsch

Dependencies:   DataStore JobScheduler NetworkServices W5500Interface nanopb protocol

Committer:
sgnezdov
Date:
Thu Aug 03 18:15:49 2017 +0000
Revision:
14:65d69aed6540
Parent:
13:0fdbc14c33e7
Child:
15:f83485cc5a2c
fixed runAt in job list by populating time scheduled from appointment

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 14:65d69aed6540 68 while (aptn != NULL) {
sgnezdov 14:65d69aed6540 69 JobScheduler::Appointment* apt = aptn->data;
sgnezdov 14:65d69aed6540 70 JobScheduler::Job* job = apt->GetJob();
sgnezdov 13:0fdbc14c33e7 71 tr_debug("adding job ID: %d, type: %d\n", job->GetID(), job->GetTypeID());
sgnezdov 13:0fdbc14c33e7 72 pbJobs.items[idx].ID = job->GetID();
sgnezdov 13:0fdbc14c33e7 73 pbJobs.items[idx].TypeID = job->GetTypeID();
sgnezdov 13:0fdbc14c33e7 74 pbJobs.items[idx].ScheduleTypeID = static_cast<protocol_ScheduleType>(job->GetSchedule()->ScheduleType());
sgnezdov 13:0fdbc14c33e7 75 // pbJobs.items[idx].ScheduleData =
sgnezdov 14:65d69aed6540 76 if (!fillScheduleData(pbJobs.items[idx].ScheduleData, *apt)) {
sgnezdov 13:0fdbc14c33e7 77 tr_error("job error: failed to fill schedule");
sgnezdov 13:0fdbc14c33e7 78 return;
sgnezdov 13:0fdbc14c33e7 79 }
sgnezdov 13:0fdbc14c33e7 80 tr_debug("schedule data size: %d", pbJobs.items[idx].ScheduleData.size);
sgnezdov 13:0fdbc14c33e7 81 // pbJobs.items[idx].Data =
sgnezdov 13:0fdbc14c33e7 82
sgnezdov 14:65d69aed6540 83 apts.remove(1);
sgnezdov 14:65d69aed6540 84 aptn = apts.pop(1);
sgnezdov 13:0fdbc14c33e7 85 idx++;
sgnezdov 13:0fdbc14c33e7 86 }
sgnezdov 13:0fdbc14c33e7 87 }
sgnezdov 13:0fdbc14c33e7 88
sgnezdov 13:0fdbc14c33e7 89 // protocol_Job job;
sgnezdov 11:acaefb63fc6b 90 // time_t now = time(NULL);
sgnezdov 11:acaefb63fc6b 91 //tr_debug("ADC created time is: %s\n", ctime(&now));
sgnezdov 11:acaefb63fc6b 92 // struct AdcMsg msg;
sgnezdov 11:acaefb63fc6b 93 // convert seconds to nanoseconds
sgnezdov 11:acaefb63fc6b 94 // msg.Created = now * 1e9;
sgnezdov 11:acaefb63fc6b 95 // tr_debug("Current time: %x sec, %llx nanosecs", now, msg.Created);
sgnezdov 11:acaefb63fc6b 96 // // swapt for byte order
sgnezdov 11:acaefb63fc6b 97 // msg.Created = swap_uint64(msg.Created); // swap_uint64(msg.Created);
sgnezdov 11:acaefb63fc6b 98 // msg.Mask = 0x80; // 0x80 bits: 1000 0000
sgnezdov 11:acaefb63fc6b 99 // for (int i = 0; i < 8; i++) {
sgnezdov 11:acaefb63fc6b 100 // msg.Chs[i].Raw = 0;
sgnezdov 11:acaefb63fc6b 101 // msg.Chs[i].V = 0;
sgnezdov 11:acaefb63fc6b 102 // }
sgnezdov 11:acaefb63fc6b 103 // msg.Chs[0].Raw = swap_uint32(_next++);
sgnezdov 11:acaefb63fc6b 104 // msg.Chs[0].V = msg.Chs[0].Raw;
sgnezdov 11:acaefb63fc6b 105 // /test can be used to send to test endpoint that responds with
sgnezdov 11:acaefb63fc6b 106 // a short hardcoded string
sgnezdov 11:acaefb63fc6b 107 // /uw/adc - to send adc version 1
sgnezdov 11:acaefb63fc6b 108 // _lce.SendV1("/uw/adc", (uint8_t*)&msg, sizeof(msg), false, now);
sgnezdov 11:acaefb63fc6b 109 }
sgnezdov 11:acaefb63fc6b 110
sgnezdov 11:acaefb63fc6b 111
sgnezdov 11:acaefb63fc6b 112