From f1e4a0003bd4a8556a9b17e601bd3d33f14660ff Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Sun, 23 Feb 2020 18:22:37 +0100 Subject: [PATCH] - Some files renamed - Added callback and request for 0x26 routine - Added context structure --- .cproject | 4 +- Debug/makefile | 2 +- Debug/sources.mk | 2 +- include/rte_wx.h | 7 ++- src/main.c | 47 +++++++++++++++--- src/rte_wx.c | 3 +- system/include/umb_master/umb_0x26_status.h | 16 ++++++ system/include/umb_master/umb_context_t.h | 22 +++++++++ .../{umb_client => umb_master}/umb_frame_t.h | 10 ++-- .../umb_client.h => umb_master/umb_master.h} | 18 ++++--- .../{umb_client => umb_master}/umb_retval_t.h | 12 +++-- system/include/umb_master/umb_state_t.h | 19 +++++++ system/src/umb_master/umb_0x26_status.c | 40 +++++++++++++++ .../umb_client.c => umb_master/umb_master.c} | 49 +++++++++++++------ 14 files changed, 207 insertions(+), 44 deletions(-) create mode 100644 system/include/umb_master/umb_0x26_status.h create mode 100644 system/include/umb_master/umb_context_t.h rename system/include/{umb_client => umb_master}/umb_frame_t.h (63%) rename system/include/{umb_client/umb_client.h => umb_master/umb_master.h} (51%) rename system/include/{umb_client => umb_master}/umb_retval_t.h (51%) create mode 100644 system/include/umb_master/umb_state_t.h create mode 100644 system/src/umb_master/umb_0x26_status.c rename system/src/{umb_client/umb_client.c => umb_master/umb_master.c} (71%) diff --git a/.cproject b/.cproject index 8a7cfd1..b3f2b2a 100644 --- a/.cproject +++ b/.cproject @@ -198,7 +198,7 @@ - + @@ -357,7 +357,7 @@ - + diff --git a/Debug/makefile b/Debug/makefile index 0e6ff1a..e3806f6 100644 --- a/Debug/makefile +++ b/Debug/makefile @@ -9,7 +9,7 @@ RM := rm -rf # All of the sources participating in the build are defined here -include sources.mk -include system/src/ve_direct_protocol/subdir.mk --include system/src/umb_client/subdir.mk +-include system/src/umb_master/subdir.mk -include system/src/stm32f1-stdperiph/subdir.mk -include system/src/newlib/subdir.mk -include system/src/drivers/subdir.mk diff --git a/Debug/sources.mk b/Debug/sources.mk index d0ff226..00ae5f1 100644 --- a/Debug/sources.mk +++ b/Debug/sources.mk @@ -35,6 +35,6 @@ system/src/diag \ system/src/drivers \ system/src/newlib \ system/src/stm32f1-stdperiph \ -system/src/umb_client \ +system/src/umb_master \ system/src/ve_direct_protocol \ diff --git a/include/rte_wx.h b/include/rte_wx.h index ebacab7..5bc98ca 100644 --- a/include/rte_wx.h +++ b/include/rte_wx.h @@ -8,7 +8,7 @@ #include "drivers/_dht22.h" #include "drivers/dallas.h" #include "drivers/ms5611.h" -#include "../umb_client/umb_client.h" +#include "../umb_master/umb_master.h" #ifndef RTE_WX_H_ @@ -41,8 +41,11 @@ extern DallasQF rte_wx_current_dallas_qf, rte_wx_error_dallas_qf; extern DallasAverage_t rte_wx_dallas_average; extern ms5611_qf_t rte_wx_ms5611_qf; -#ifdef _UMB_CLIENT +#ifdef _UMB_MASTER + extern umb_frame_t rte_wx_umb; +extern uint8_t rte_wx_last_status; + #endif #ifdef __cplusplus diff --git a/src/main.c b/src/main.c index a06a7f2..454bfe3 100644 --- a/src/main.c +++ b/src/main.c @@ -32,9 +32,6 @@ #include "rte_pv.h" #include "rte_main.h" -//#include "Timer.h" -//#include "BlinkLed.h" - #ifdef _METEO #include #include "drivers/dallas.h" @@ -51,6 +48,8 @@ #include "KissCommunication.h" +#define SOH 0x01 + //#define SERIAL_TX_TEST_MODE // Niebieska dioda -> DCD @@ -109,6 +108,11 @@ uint16_t buffer_len = 0; #ifdef _VICTRON #endif +#ifdef _UMB_MASTER +// return value from UMB related functions +umb_retval_t main_umb_retval = UMB_UNINITIALIZED; +#endif + char after_tx_lock; unsigned short rx10m = 0, tx10m = 0, digi10m = 0, kiss10m = 0; @@ -220,6 +224,15 @@ main(int argc, char* argv[]) dallas_init(GPIOC, GPIO_Pin_11, GPIO_PinSource11, &rte_wx_dallas_average); #endif + #if defined(_UMB_MASTER) + // UMB client cannot be used in the same time with TX20 or analogue anemometer + #undef _ANEMOMETER_TX20 + #undef _ANEMOMETER_ANALOGUE + + // client initialization + umb_master_init(); + #endif + #ifdef _ANEMOMETER_TX20 TX20Init(); #endif @@ -300,7 +313,7 @@ main(int argc, char* argv[]) // getting all meteo measuremenets to be sure that WX frames want be sent with zeros wx_get_all_measurements(); -#ifdef _VICTRON +#if defined _VICTRON && !defined _UMB_MASTER // initializing protocol parser ve_direct_parser_init(&rte_pv_struct, &rte_pv_average); @@ -311,7 +324,13 @@ main(int argc, char* argv[]) // switching UART to receive mode to be ready for data from charging controller srl_receive_data(VE_DIRECT_MAX_FRAME_LN, 0x0D, 0, 0, 0, 0); -#else + +#elif !defined _VICTRON && defined _UMB_MASTER + + srl_receive_data(8, SOH, 0x00, 0, 6, 12); + + +#elif ! defined _VICTRON && !defined _UMB_MASTER // switching UART to receive mode to be ready for KISS frames from host srl_receive_data(100, FEND, FEND, 0, 0, 0); #endif @@ -376,7 +395,7 @@ main(int argc, char* argv[]) rx10m++; } -#ifdef _VICTRON +#if defined _VICTRON // if new KISS message has been received from the host if (srl_rx_state == SRL_RX_DONE || srl_rx_state == SRL_RX_ERROR) { @@ -403,6 +422,22 @@ main(int argc, char* argv[]) srl_receive_data(VE_DIRECT_MAX_FRAME_LN, 0x0D, 0, 0, 0, 0); } +#elif defined _UMB_MASTER + // if some UMB data have been received + if (srl_rx_state == SRL_RX_DONE) { + main_umb_retval = umb_parse_serial_buffer_to_frame(srl_get_rx_buffer(), srl_get_num_bytes_rxed(), &rte_wx_umb); + + if (main_umb_retval != UMB_OK) { + umb_master_callback(&rte_wx_umb); + } + + srl_receive_data(8, SOH, 0x00, 0, 6, 12); + } + + // if there were an error during receiving frame from host, restart rxing once again + if (srl_rx_state == SRL_RX_ERROR) { + srl_receive_data(8, SOH, 0x00, 0, 6, 12); + } #else // if new KISS message has been received from the host if (srl_rx_state == SRL_RX_DONE) { diff --git a/src/rte_wx.c b/src/rte_wx.c index de803de..277037a 100644 --- a/src/rte_wx.c +++ b/src/rte_wx.c @@ -32,8 +32,9 @@ DallasQF rte_wx_current_dallas_qf, rte_wx_error_dallas_qf = DALLAS_QF_UNKNOWN; DallasAverage_t rte_wx_dallas_average; ms5611_qf_t rte_wx_ms5611_qf; -#ifdef _UMB_CLIENT +#ifdef _UMB_MASTER umb_frame_t rte_wx_umb; +uint8_t rte_wx_last_status = 0; #endif void rte_wx_init(void) { diff --git a/system/include/umb_master/umb_0x26_status.h b/system/include/umb_master/umb_0x26_status.h new file mode 100644 index 0000000..62cea7c --- /dev/null +++ b/system/include/umb_master/umb_0x26_status.h @@ -0,0 +1,16 @@ +/* + * umb_0x26_status_request.h + * + * Created on: 23.02.2020 + * Author: mateusz + */ + +#ifndef INCLUDE_UMB_MASTER_UMB_0X26_STATUS_H_ +#define INCLUDE_UMB_MASTER_UMB_0X26_STATUS_H_ + +#include "../umb_master/umb_retval_t.h" + +umb_retval_t umb_0x26_status_request(); +umb_retval_t umb_0x26_status_callback(); + +#endif /* INCLUDE_UMB_MASTER_UMB_0X26_STATUS_H_ */ diff --git a/system/include/umb_master/umb_context_t.h b/system/include/umb_master/umb_context_t.h new file mode 100644 index 0000000..6068825 --- /dev/null +++ b/system/include/umb_master/umb_context_t.h @@ -0,0 +1,22 @@ +/* + * umb_context_t.h + * + * Created on: 23.02.2020 + * Author: mateusz + */ + +#ifndef INCLUDE_UMB_MASTER_UMB_CONTEXT_T_H_ +#define INCLUDE_UMB_MASTER_UMB_CONTEXT_T_H_ + +#include +#include "umb_state_t.h" + +typedef struct umb_context_t { + + int16_t current_routine; + + umb_state_t state; + +} umb_context_t; + +#endif /* INCLUDE_UMB_MASTER_UMB_CONTEXT_T_H_ */ diff --git a/system/include/umb_client/umb_frame_t.h b/system/include/umb_master/umb_frame_t.h similarity index 63% rename from system/include/umb_client/umb_frame_t.h rename to system/include/umb_master/umb_frame_t.h index b496dd2..fee76a5 100644 --- a/system/include/umb_client/umb_frame_t.h +++ b/system/include/umb_master/umb_frame_t.h @@ -5,8 +5,8 @@ * Author: mateusz */ -#ifndef INCLUDE_UMB_CLIENT_UMB_FRAME_T_H_ -#define INCLUDE_UMB_CLIENT_UMB_FRAME_T_H_ +#ifndef INCLUDE_UMB_MASTER_UMB_FRAME_T_H_ +#define INCLUDE_UMB_MASTER_UMB_FRAME_T_H_ #define UMB_FRAME_MAX_PAYLOAD_LN 40 @@ -26,10 +26,10 @@ typedef struct umb_frame_t { uint8_t payload[UMB_FRAME_MAX_PAYLOAD_LN]; - uint8_t checksum_lsb; + uint8_t calculated_checksum_lsb; - uint8_t checksum_msb; + uint8_t calculated_checksum_msb; } umb_frame_t; -#endif /* INCLUDE_UMB_CLIENT_UMB_FRAME_T_H_ */ +#endif /* INCLUDE_UMB_MASTER_UMB_FRAME_T_H_ */ diff --git a/system/include/umb_client/umb_client.h b/system/include/umb_master/umb_master.h similarity index 51% rename from system/include/umb_client/umb_client.h rename to system/include/umb_master/umb_master.h index ea3650c..9414f94 100644 --- a/system/include/umb_client/umb_client.h +++ b/system/include/umb_master/umb_master.h @@ -5,20 +5,24 @@ * Author: mateusz */ -#ifndef INCLUDE_UMB_CLIENT_UMB_CLIENT_H_ -#define INCLUDE_UMB_CLIENT_UMB_CLIENT_H_ +#ifndef INCLUDE_UMB_MASTER_UMB_MASTER_H_ +#define INCLUDE_UMB_MASTER_UMB_MASTER_H_ +#include +#include +#include #include "station_config.h" -#include "umb_frame_t.h" -#include "umb_retval_t.h" -#ifdef _UMB_CLIENT +#ifdef _UMB_MASTER -void umb_client_init(); +extern umb_context_t umb_context; + +void umb_master_init(); umb_retval_t umb_parse_serial_buffer_to_frame(uint8_t* serial_buffer, uint16_t buffer_ln, umb_frame_t* frame); umb_retval_t umb_parse_frame_to_serial_buffer(uint8_t* serial_buffer, uint16_t buffer_ln, umb_frame_t* frame); uint16_t umb_calc_crc(uint16_t crc_buff, uint8_t input); +umb_retval_t umb_master_callback(umb_frame_t* frame); #endif -#endif /* INCLUDE_UMB_CLIENT_UMB_CLIENT_H_ */ +#endif /* INCLUDE_UMB_MASTER_UMB_MASTER_H_ */ diff --git a/system/include/umb_client/umb_retval_t.h b/system/include/umb_master/umb_retval_t.h similarity index 51% rename from system/include/umb_client/umb_retval_t.h rename to system/include/umb_master/umb_retval_t.h index 05a991f..2a44a71 100644 --- a/system/include/umb_client/umb_retval_t.h +++ b/system/include/umb_master/umb_retval_t.h @@ -5,15 +5,19 @@ * Author: mateusz */ -#ifndef INCLUDE_UMB_CLIENT_UMB_RETVAL_T_H_ -#define INCLUDE_UMB_CLIENT_UMB_RETVAL_T_H_ +#ifndef INCLUDE_UMB_MASTER_UMB_RETVAL_T_H_ +#define INCLUDE_UMB_MASTER_UMB_RETVAL_T_H_ typedef enum umb_retval_t { + UMB_UNINITIALIZED = 127, + UMB_OK = 0, UMB_FRAME_TOO_LONG_FOR_TX = -1, UMB_NOT_VALID_FRAME = -2, UMB_TO_ANOTHER_MASTER = -3, UMB_RECV_FRAME_TOO_LONG = -4, - UMB_WRONG_CRC = -5 + UMB_WRONG_CRC = -5, + UMB_BUSY = -6, + UMB_GENERAL_ERROR = -63 }umb_retval_t; -#endif /* INCLUDE_UMB_CLIENT_UMB_RETVAL_T_H_ */ +#endif /* INCLUDE_UMB_MASTER_UMB_RETVAL_T_H_ */ diff --git a/system/include/umb_master/umb_state_t.h b/system/include/umb_master/umb_state_t.h new file mode 100644 index 0000000..2748d5c --- /dev/null +++ b/system/include/umb_master/umb_state_t.h @@ -0,0 +1,19 @@ +/* + * umb_state_t.h + * + * Created on: 23.02.2020 + * Author: mateusz + */ + +#ifndef INCLUDE_UMB_MASTER_UMB_STATE_T_H_ +#define INCLUDE_UMB_MASTER_UMB_STATE_T_H_ + +typedef enum umb_state_t { + UMB_STATUS_IDLE, + UMB_STATUS_SENDING_REQUEST_TO_SLAVE, + UMB_STATUS_WAITING_FOR_RESPONSE, + UMB_STATUS_RESPONSE_AVALIABLE, + UMB_STATUS_ERROR +} umb_state_t; + +#endif /* INCLUDE_UMB_MASTER_UMB_STATE_T_H_ */ diff --git a/system/src/umb_master/umb_0x26_status.c b/system/src/umb_master/umb_0x26_status.c new file mode 100644 index 0000000..07e7d65 --- /dev/null +++ b/system/src/umb_master/umb_0x26_status.c @@ -0,0 +1,40 @@ +/* + * umb_status_request.c + * + * Created on: 23.02.2020 + * Author: mateusz + */ + +#include "../umb_master/umb_master.h" + +#include "station_config.h" + +#include +#include + +umb_retval_t umb_0x26_status_request(umb_frame_t* frame) { + + if (umb_context.state != UMB_STATUS_IDLE && umb_context.state != UMB_STATUS_ERROR) { + return UMB_BUSY; + } + + frame->command_id = 0x26; + frame->slave_class = _UMB_SLAVE_CLASS; + frame->slave_id = _UMB_SLAVE_ID; + frame->lenght = 0; + + memset(frame->payload, 0x00, UMB_FRAME_MAX_PAYLOAD_LN); + + umb_context.state = UMB_STATUS_SENDING_REQUEST_TO_SLAVE; + + return UMB_OK; + +} + +umb_retval_t umb_0x26_status_callback(umb_frame_t* frame) { + + + umb_context.state = UMB_STATUS_IDLE; + + return UMB_OK; +} diff --git a/system/src/umb_client/umb_client.c b/system/src/umb_master/umb_master.c similarity index 71% rename from system/src/umb_client/umb_client.c rename to system/src/umb_master/umb_master.c index d9e8188..6e6e853 100644 --- a/system/src/umb_client/umb_client.c +++ b/system/src/umb_master/umb_master.c @@ -5,11 +5,11 @@ * Author: mateusz */ -#include "../umb_client/umb_client.h" - #include +#include +#include -#ifdef _UMB_CLIENT +#ifdef _UMB_MASTER #define SOH 0x01 #define STX 0x02 @@ -21,8 +21,11 @@ #define MASTER_ID 0x01 #define MASTER_CLASS 0xF0 -void umb_client_init() { +umb_context_t umb_context; +void umb_master_init() { + umb_context.current_routine = -1; + umb_context.state = UMB_STATUS_IDLE; } umb_retval_t umb_parse_serial_buffer_to_frame(uint8_t* serial_buffer, uint16_t buffer_ln, umb_frame_t* frame) { @@ -38,7 +41,7 @@ umb_retval_t umb_parse_serial_buffer_to_frame(uint8_t* serial_buffer, uint16_t b frame->slave_class = serial_buffer[4]; frame->slave_id = serial_buffer[5]; - frame->lenght = serial_buffer[6]; + frame->lenght = serial_buffer[6] - 2; if (serial_buffer[8] != STX) return UMB_NOT_VALID_FRAME; @@ -51,7 +54,7 @@ umb_retval_t umb_parse_serial_buffer_to_frame(uint8_t* serial_buffer, uint16_t b return UMB_RECV_FRAME_TOO_LONG; // Copying payload of the frame from a serial buffer - for (int i = 0; i < frame->lenght - 2; i++) { + for (int i = 0; (i < frame->lenght && i < buffer_ln); i++) { frame->payload[i] = serial_buffer[10 + i]; } @@ -59,18 +62,18 @@ umb_retval_t umb_parse_serial_buffer_to_frame(uint8_t* serial_buffer, uint16_t b crc_from_frame = serial_buffer[frame->lenght + 9] | (serial_buffer[frame->lenght + 10] << 8); // recalculating crc from frame content - for (int j = 0; j < frame->lenght + 8; j++) { + for (int j = 0; j < frame->lenght + 8 + 2; j++) { crc = umb_calc_crc(crc, serial_buffer[j]); } - frame->checksum_lsb = crc & 0xFF; - frame->checksum_msb = (crc & 0xFF00) >> 8; + frame->calculated_checksum_lsb = crc & 0xFF; + frame->calculated_checksum_msb = (crc & 0xFF00) >> 8; - if ( serial_buffer[frame->lenght + 9] != frame->checksum_lsb || - serial_buffer[frame->lenght + 10] != frame->checksum_msb) + if ( serial_buffer[frame->lenght + 9 + 2] != frame->calculated_checksum_lsb || + serial_buffer[frame->lenght + 10 + 2] != frame->calculated_checksum_msb) return UMB_WRONG_CRC; - return 0; + return UMB_OK; } umb_retval_t umb_parse_frame_to_serial_buffer(uint8_t* serial_buffer, uint16_t buffer_ln, umb_frame_t* frame) { @@ -89,12 +92,12 @@ umb_retval_t umb_parse_frame_to_serial_buffer(uint8_t* serial_buffer, uint16_t b serial_buffer[i++] = _UMB_SLAVE_CLASS; serial_buffer[i++] = MASTER_ID; serial_buffer[i++] = MASTER_CLASS; - serial_buffer[i++] = frame->lenght; + serial_buffer[i++] = frame->lenght + 2; serial_buffer[i++] = STX; serial_buffer[i++] = frame->command_id; serial_buffer[i++] = V10; - for (int j = 0; j < frame->lenght - 2; j++) { + for (int j = 0; j < frame->lenght; j++) { serial_buffer[i++] = frame->payload[j]; } @@ -108,7 +111,7 @@ umb_retval_t umb_parse_frame_to_serial_buffer(uint8_t* serial_buffer, uint16_t b serial_buffer[i++] = (uint8_t) (crc & 0xFF00) >> 8; serial_buffer[i++] = EOT; - return 0; + return UMB_OK; } uint16_t umb_calc_crc(uint16_t crc_buff, uint8_t input) { @@ -131,4 +134,20 @@ uint16_t umb_calc_crc(uint16_t crc_buff, uint8_t input) { return (crc_buff); } +/** + * This function is called globally after receiving + */ +umb_retval_t umb_master_callback(umb_frame_t* frame) { + + // looking for a callback to this response + switch (frame->command_id) { + case 0x26: { + umb_0x26_status_callback(frame); + break; + } + } + + return UMB_OK; +} + #endif