diff options
Diffstat (limited to 'src/slave.c')
| -rw-r--r-- | src/slave.c | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/src/slave.c b/src/slave.c index 7bcceac..f5096f3 100644 --- a/src/slave.c +++ b/src/slave.c @@ -43,6 +43,7 @@ UART_HandleTypeDef huart1; uint8_t cmd_str[128]; uint8_t str_ptr = 0; pb_byte_t str_buf[18]; +uint8_t data_idx = 0; /* Function prototypes */ void SystemClock_Config(void); @@ -150,7 +151,7 @@ int main(void) else if (SOR_buf[0] == 2) { uint8_t CTS_buf[] = {0x0, 0x1}; uint8_t len_buf[4], *MDR_buf, *data_buf; - /* _datapoint datapoints[16]; */ + _datapoint datapoints[16]; HAL_I2C_Slave_Transmit(&hi2c1, CTS_buf, 2, 10000); sprintf((char*)debug_buf, "Sent CTS\r\n"); @@ -171,18 +172,27 @@ int main(void) HAL_I2C_Slave_Transmit(&hi2c1, CTS_buf, 2, 10000); HAL_I2C_Slave_Receive(&hi2c1, MDR_buf, MDR_len, 10000); HAL_I2C_Slave_Receive(&hi2c1, data_buf, data_len, 10000); - - _datapoint datapoint_message; + s2m_MDR_response MDR_message; + s2m_data data_message; + data_idx = 0; + data_message.datapoints.funcs.decode = decode_data_callback; + data_message.datapoints.arg = (void*)datapoints; + pb_istream_t MDR_istream = pb_istream_from_buffer(MDR_buf, MDR_len); pb_istream_t data_istream = pb_istream_from_buffer(data_buf, data_len); - + pb_decode(&MDR_istream, s2m_MDR_response_fields, &MDR_message); - pb_decode(&data_istream, _datapoint_fields, &datapoint_message); - - sprintf((char*)debug_buf, "Got data from %ld, running version %f\r\n\tdata 0: %f\r\n", MDR_message.module_id, MDR_message.MDR_version, datapoint_message.data); - HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100); - memset(debug_buf, 0, 128); + if (!pb_decode(&data_istream, s2m_data_fields, &data_message)){ + sprintf((char*)debug_buf, "Data decode error\r\n"); + HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100); + memset(debug_buf, 0, 128); + } + else { + sprintf((char*)debug_buf, "Got data from %ld\r\n\tEntity: %ld, data : %f, unit: %ld\r\n", MDR_message.module_id, datapoints[0].entity_id, datapoints[0].data, datapoints[0].unit_id); + HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100); + memset(debug_buf, 0, 128); + } } else if (SOR_buf[0] == 3) { uint8_t CTS_buf[] = {0x0, 0x1}, len_buf[4], *cmd_buf; @@ -307,7 +317,7 @@ bool encode_subscription_callback(pb_ostream_t *ostream, const pb_field_t *field { if(ostream!=NULL && field->tag == s2m_MDR_response_subscriptions_tag) { _subscriptions subs; - subs.module_id = 0xd; + subs.module_id = 0x4; subs.has_module_id=true; subs.has_entity_id=false; subs.has_module_class=false; @@ -332,6 +342,8 @@ bool encode_datapoint_callback(pb_ostream_t *ostream, const pb_field_t *field, v _datapoint datapoint = _datapoint_init_zero; datapoint.entity_id = 1; datapoint.data = 20.70+((float)i/100); + datapoint.unit_id = 1; + datapoint.has_unit_id = true; if (!pb_encode_tag_for_field(ostream, field)) return false; if (!pb_encode_submessage(ostream, _datapoint_fields, &datapoint)) @@ -362,6 +374,36 @@ bool decode_cmd_string_callback(pb_istream_t *istream, const pb_field_t *field, return true; } +bool decode_data_callback(pb_istream_t *istream, const pb_field_t *field, void **args) +{ + _datapoint loc_datapoint = _datapoint_init_zero; + _datapoint *datapoint = *args; + + if (!pb_decode(istream, _datapoint_fields, &loc_datapoint)) + return false; + + datapoint[data_idx].data = datapoint[data_idx].entity_id = 0; + + datapoint[data_idx].entity_id = loc_datapoint.entity_id; + datapoint[data_idx].data = loc_datapoint.data; + + if (loc_datapoint.has_channel_id) { + datapoint[data_idx].has_channel_id = true; + datapoint[data_idx].channel_id = loc_datapoint.channel_id; + } + if (loc_datapoint.has_unit_id) { + datapoint[data_idx].has_unit_id = true; + datapoint[data_idx].unit_id = loc_datapoint.unit_id; + } + if (loc_datapoint.has_timestamp) { + datapoint[data_idx].has_timestamp = true; + datapoint[data_idx].timestamp = loc_datapoint.timestamp; + } + + data_idx++; + return true; +} + /** * @brief System Clock Configuration * @retval None |
