Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DataStore JobScheduler NetworkServices W5500Interface nanopb protocol
Diff: source/jobSchedulesUpload.cpp
- Revision:
- 18:133a51becbe1
- Parent:
- 17:b79ce8109995
- Child:
- 20:5b52a42b9a5d
diff -r b79ce8109995 -r 133a51becbe1 source/jobSchedulesUpload.cpp --- 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; }