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;
}