This will generate the message for the programme
Dependencies: MODSERIAL Nanopb
main.cpp
- Committer:
- omatthews
- Date:
- 2019-08-30
- Revision:
- 2:b46d53a5f931
- Parent:
- 1:fa8f59ecc52a
- Child:
- 3:3888b5ecad7e
File content as of revision 2:b46d53a5f931:
#include "mbed.h" #include "pb.h" #include "pb_decode.h" #include "pb_encode.h" #include "memspcr.pb.h" #include "MODSERIAL.h" #include <vector> #include <iterator> MODSERIAL pc(PA_9, PA_10, 512); //mcu TX, RX, 512 byte TX and RX buffers uint8_t buffer[512]; size_t message_length; bool status; int i = 0; unsigned int c; memspcr_ExperimentConfiguration exp_config = memspcr_ExperimentConfiguration_init_zero; int buffer_length; int n_points; std::vector<memspcr_ThermalStep> profile; //Parameters float resistance[9] = {0.45,0.525,0.525,0.555,0.555,0.525,0.525,0.555}; int elapsed_time_ms[9] = {0,5000,10000,10001,15000,15001,20000}; int camera_offset_ms[9] = {0,0,250,0,100,100,100,200}; void write_message() { pc.printf("%d ",message_length); wait_ms(20); for (int i = 0; i < message_length; i++) { pc.printf("%02X ",buffer[i]); } } void encode_message() { pb_ostream_t ostream = pb_ostream_from_buffer(buffer, sizeof(buffer)); status = pb_encode(&ostream, memspcr_ExperimentConfiguration_fields, &exp_config); message_length = ostream.bytes_written; if (!status) { pc.printf("Encoding failed: %s\n", PB_GET_ERROR(&ostream)); } } bool encode_callback(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) { vector <memspcr_ThermalStep> * elements = (vector <memspcr_ThermalStep> *)(*arg); vector <memspcr_ThermalStep>::iterator it; for (it = elements->begin(); it < elements->end(); it ++) { if (!pb_encode_tag_for_field(stream, field)) { printf("Encode callback error: %s\n", PB_GET_ERROR(stream)); return false; } if(!pb_encode_submessage(stream, memspcr_ThermalStep_fields, &(*it))) return false; } return true; } int main() { /* This is the buffer where we will store our message. */ pc.baud(115200); n_points = sizeof(resistance)/sizeof(float); buffer_length = sizeof(buffer)/sizeof(uint8_t); //Prepare message for (i = 0; i < n_points; i++) { memspcr_ThermalStep step = memspcr_ThermalStep_init_zero; step.resistance = resistance[i]; step.elapsed_time_ms = elapsed_time_ms[i]; step.camera_offset_ms = camera_offset_ms[i]; profile.push_back(step); } //Set set points exp_config.profile.arg = &profile; exp_config.profile.funcs.encode = encode_callback; exp_config.thermal.guard_drive_ratio = 0.26; exp_config.thermal.adc_settling_time_us = 60; exp_config.thermal.pid_kp = 4; exp_config.thermal.pid_integral_time = 0.75; exp_config.thermal.control_loop_interval_ms = 4; exp_config.optics.pre_trigger_ms = 1; exp_config.optics.on_time_ms = 1; exp_config.optics.led_pwm = 0.5; exp_config.fluidics.pressure_setpoint = 0.4; exp_config.fluidics.pressure_hysterisis = 0.01; exp_config.logging_interval_ms = 100; exp_config.selected_heater = memspcr_ExperimentConfiguration_Heater_MAIN; encode_message(); write_message(); return 0; }