/*
Function: Funciton to encode as nanoPB messages based off message ID
Output: Lenght of bytes that were encoded
*/
int pb_encode_data(MessageID id, uint8_t *rawData,
uint8_t data_len, pb_ostream_t stream ){
// use case switch since number of message types will increase drastically as we evolve messaging api
switch(id){
case MessageID_ACCEL:
{
Acceleration message = Acceleration_init_zero;
memcpy(&message.data[0], &rawData[0], data_len);
if (!pb_encode(&stream, Acceleration_fields, &message)) {
return 0;
}else{
return stream.bytes_written;
}
}
case MessageID_TIME:
{
OdrFreqData message = OdrFreqData_init_zero;
msg_sample_rate_monitor_t *pmsg_sample_rate_monitor;
pmsg_sample_rate_monitor = (msg_sample_rate_monitor_t *)rawData;
message.odr_frequency_tenth_hz = pmsg_sample_rate_monitor->odr_frequency_tenth_hz;
message.odr_delta_tenth_hz = pmsg_sample_rate_monitor->odr_delta_tenth_hz;
if (!pb_encode(&stream, OdrFreqData_fields, &message)) {
return 0;
}else{
LOG_INF("Bytes Written: %d", stream.bytes_written);
return stream.bytes_written;
}
// pbMessage.message = &message;
}
break;
case MessageID_FORCE:
break;
case MessageID_TEMP:
break;
case MessageID_BAT:
break;
default:
return NULL;
}
}
/*
Function: Generic Handler to encode data into nanoPB messages
Output: Pointer to Encoded Data Buffer
*/
static uint8_t * message_encode(MessageID id, uint8_t *rawData,
uint8_t len, size_t * message_length){
static uint8_t buffer[Acceleration_size] = {0}; // allocate large buffer the size of Acceleration size (the largest dataset)
// static size_t message_length;
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
*message_length = pb_encode_data(id,rawData,len,stream);
if ( message_length > 0){
return buffer;
}else{
return NULL;
}
}