Преглед изворни кода

error codes, global broadcast

Juraj Ďuďák пре 2 година
родитељ
комит
de7658d78c
6 измењених фајлова са 197 додато и 61 уклоњено
  1. 1 0
      Inc/nbus_app.h
  2. 74 0
      Inc/nbus_cmd.h
  3. 1 0
      Inc/nbus_impl.h
  4. 18 23
      Inc/nbus_types.h
  5. 40 31
      Src/nbus_app.c
  6. 63 7
      Src/nbus_impl.c

+ 1 - 0
Inc/nbus_app.h

@@ -14,6 +14,7 @@
 void nbus_init(Peripheral_typeDef *periph);
 void nbus_cb_UART_RX(UART_HandleTypeDef *huart);
 void nbus_cb_TIM_periodElapsed(TIM_HandleTypeDef *htim);
+void nbus_cb_TIM_periodElapsed_base(TIM_HandleTypeDef *htim);
 void receiveOneByte();
 void process_request();
 

+ 74 - 0
Inc/nbus_cmd.h

@@ -30,4 +30,78 @@
 #define CMD_DATA		0x0C
 #define CMD_SYNC		0x0D
 
+#define OK_CODE 				(0x00)
+#define ILLEGAL_FUNCTION 		(0x01)
+#define ILLEGAL_DEVICE_ADDRESS 	(0x02)
+#define ILLEGAL_DATA_VALUE 		(0x03)
+#define SLAVE_DEVICE_FAILURE 	(0x04)
+#define ACKNOWLEDGE 			(0x05)
+#define DEVICE_BUSY 			(0x06)
+#define PARAM_NOT_IMPLEMENTED 	(0x10)
+#define ERR_VALUE_WRITE 		(0x11)
+#define DEVICE_LOW_VOLTAGE 		(0x12)
+
+/**
+ * Chyba pri vykonaní príkazu v subslave, napr. ak senzor nie je pripojený.
+ * Scope: subslave
+ */
+#define GENERIC_SUBSLAVE_ERROR (0x13)
+
+/**
+ * Chyba pri inicializácii. Je potrebné resetnúť senzor.
+ * Scope: subslave
+ */
+#define ERR_SUBSLAVE_INIT_FAIL (0x14)
+
+/**
+ * Vlastná chyba subslave.
+ * Scope: subslave
+ */
+#define SUBSLAVE_CUSTOM_ERR_1 (0x1A)
+
+/**
+ * Vlastná chyba subslave.
+ * Scope: subslave
+ */
+#define SUBSLAVE_CUSTOM_ERR_2 (0x1B)
+
+/**
+ * Vlastná chyba subslave.
+ * Scope: subslave
+ */
+#define SUBSLAVE_CUSTOM_ERR_3 (0x1C)
+
+/**
+ * Vlastná chyba subslave.
+ * Scope: subslave
+ */
+#define SUBSLAVE_CUSTOM_ERR_4 (0x1D)
+
+/**
+ * Vlastná chyba subslave.
+ * Scope: subslave
+ */
+#define SUBSLAVE_CUSTOM_ERR_5 (0x1E)
+
+/**
+ * Vlastná chyba subslave.
+ * Scope: subslave
+ */
+#define SUBSLAVE_CUSTOM_ERR_6 (0x1F)
+
+/**
+ * Chyba pri načítaní údajov - zariadenie je výstupné.
+ * Scope: uBus
+ */
+#define ERR_OUTPUT_ONLY (0x21)
+
+/**
+ * Chyba pri nastavení údajov - zariadenie je vstupné.
+ * Scope: uBus
+ */
+#define ERR_INPUT_ONLY (0x22)
+
+
+
+
 #endif

+ 1 - 0
Inc/nbus_impl.h

@@ -11,6 +11,7 @@
 #include "nbus_cmd.h"
 
 //nBusCommandType_t get_request_type();
+nBus_functionCode_t* nbus_unicastToSensor(nBus_TypeDef *nbus, nBus_functionCode_t *code);
 nBus_functionCode_t* nbus_unicastToModule(nBus_TypeDef *nBus, nBus_functionCode_t *code);
 void nbus_broadcast(nBus_TypeDef *nBus, nBusCommandType_t request_type);
 #endif

+ 18 - 23
Inc/nbus_types.h

@@ -63,6 +63,11 @@ typedef struct {
     */
     TIM_HandleTypeDef* uart_timer;
 
+    /**
+    * @brief Časovač časovú značku merania. Rozlíšenie: 0.1ms
+    */
+    TIM_HandleTypeDef* measure_timer;
+
     // doplnkove periferie
 
 #if SELF_MONITORING == 1
@@ -82,6 +87,8 @@ typedef struct {
      */
     McuPin_typeDef* led;
 
+    RTC_HandleTypeDef *rtc;
+
 #if USE_SW_485 == 1
     /**
      * @brief Definícia pinu riadenie smeru komunikácie RS485.
@@ -114,7 +121,6 @@ typedef struct __attribute__((packed)) {
 } nBus_sensorByte_t;
 
 
-
 typedef enum {
 	UART_RX_1B,
 	UART_RX_PAYLOAD,
@@ -145,6 +151,12 @@ typedef enum {
 }nBus_response_t;
 
 
+typedef enum {
+    MEASURE_STOPPED,
+	MEASURE_RUNNING,
+} nBusMeasurementActive_t;
+
+
 /**
 * @brief Základná štruktúra protokolu nBUS.
 *
@@ -156,14 +168,6 @@ typedef struct {
     */
     uint8_t rx_buffer[BUFF_SIZE]; // buffer prijatych znakov
 
-    /** @brief  pomocny RX buffer  */
-    uint8_t tmp_buffer[1];
-
-    /**
-    * @brief Index pre prijímací buffer nBUS.
-    */
-    volatile uint16_t rx_buffer_index; // buffer prijatych znakov
-
     /**
     * @brief Odosielací buffer uBUS.
     */
@@ -192,7 +196,6 @@ typedef struct {
     nBus_functionCode_t function_code;
     volatile nBusCommandType_t request_type;
 
-
     /** @brief Flag pre signalizaciu ukoncenia primu dat cez UART. */
     volatile nBus_Uart_RX_state uart_state;
 
@@ -201,11 +204,15 @@ typedef struct {
     /** @brief CRC8 sucet pre datovy ramec */
     volatile uint8_t CRC8;
 
+    volatile nBusMeasurementActive_t measure_active;
+
     /**
      * @brief Periférie protokolu uBUS.
      */
     Peripheral_typeDef* periph;
 
+    volatile uint32_t data_timebase;
+
 #if USE_USART_DMA_TX == 1
     /**
      * @brief Príznak ukončenia odoslania dát cez DMA
@@ -247,19 +254,7 @@ typedef enum {
     UART_DATA_EMPTY,
 } UART_DataState;
 
-/**
-* @brief Určuje stav senzora
-*/
-typedef enum {
-    /**
-    * Zariadenie je pripojene a pripravene
-    */
-    DEVICE_READY,
-    /**
-    * Zariadenie sa nedetekovalo
-    */
-    DEVICE_ERROR,
-} DeviceReady_TypeDef;
+
 
 
 

+ 40 - 31
Src/nbus_app.c

@@ -4,30 +4,28 @@ nBus_TypeDef nBus;
 
 
 static uint8_t const crc8x_table[] = {
-    0x00, 0x31, 0x62, 0x53, 0xc4, 0xf5, 0xa6, 0x97, 0xb9, 0x88, 0xdb, 0xea, 0x7d,
-    0x4c, 0x1f, 0x2e, 0x43, 0x72, 0x21, 0x10, 0x87, 0xb6, 0xe5, 0xd4, 0xfa, 0xcb,
-    0x98, 0xa9, 0x3e, 0x0f, 0x5c, 0x6d, 0x86, 0xb7, 0xe4, 0xd5, 0x42, 0x73, 0x20,
-    0x11, 0x3f, 0x0e, 0x5d, 0x6c, 0xfb, 0xca, 0x99, 0xa8, 0xc5, 0xf4, 0xa7, 0x96,
-    0x01, 0x30, 0x63, 0x52, 0x7c, 0x4d, 0x1e, 0x2f, 0xb8, 0x89, 0xda, 0xeb, 0x3d,
-    0x0c, 0x5f, 0x6e, 0xf9, 0xc8, 0x9b, 0xaa, 0x84, 0xb5, 0xe6, 0xd7, 0x40, 0x71,
-    0x22, 0x13, 0x7e, 0x4f, 0x1c, 0x2d, 0xba, 0x8b, 0xd8, 0xe9, 0xc7, 0xf6, 0xa5,
-    0x94, 0x03, 0x32, 0x61, 0x50, 0xbb, 0x8a, 0xd9, 0xe8, 0x7f, 0x4e, 0x1d, 0x2c,
-    0x02, 0x33, 0x60, 0x51, 0xc6, 0xf7, 0xa4, 0x95, 0xf8, 0xc9, 0x9a, 0xab, 0x3c,
-    0x0d, 0x5e, 0x6f, 0x41, 0x70, 0x23, 0x12, 0x85, 0xb4, 0xe7, 0xd6, 0x7a, 0x4b,
-    0x18, 0x29, 0xbe, 0x8f, 0xdc, 0xed, 0xc3, 0xf2, 0xa1, 0x90, 0x07, 0x36, 0x65,
-    0x54, 0x39, 0x08, 0x5b, 0x6a, 0xfd, 0xcc, 0x9f, 0xae, 0x80, 0xb1, 0xe2, 0xd3,
-    0x44, 0x75, 0x26, 0x17, 0xfc, 0xcd, 0x9e, 0xaf, 0x38, 0x09, 0x5a, 0x6b, 0x45,
-    0x74, 0x27, 0x16, 0x81, 0xb0, 0xe3, 0xd2, 0xbf, 0x8e, 0xdd, 0xec, 0x7b, 0x4a,
-    0x19, 0x28, 0x06, 0x37, 0x64, 0x55, 0xc2, 0xf3, 0xa0, 0x91, 0x47, 0x76, 0x25,
-    0x14, 0x83, 0xb2, 0xe1, 0xd0, 0xfe, 0xcf, 0x9c, 0xad, 0x3a, 0x0b, 0x58, 0x69,
-    0x04, 0x35, 0x66, 0x57, 0xc0, 0xf1, 0xa2, 0x93, 0xbd, 0x8c, 0xdf, 0xee, 0x79,
-    0x48, 0x1b, 0x2a, 0xc1, 0xf0, 0xa3, 0x92, 0x05, 0x34, 0x67, 0x56, 0x78, 0x49,
-    0x1a, 0x2b, 0xbc, 0x8d, 0xde, 0xef, 0x82, 0xb3, 0xe0, 0xd1, 0x46, 0x77, 0x24,
-    0x15, 0x3b, 0x0a, 0x59, 0x68, 0xff, 0xce, 0x9d, 0xac};
-
-
-uint8_t crc8x_fast(uint8_t crc, void const *mem, uint16_t len) {
-	uint8_t const *data = mem;
+		0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,
+		0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,
+		0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,
+		0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,
+		0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,
+		0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,
+		0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,
+		0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,
+		0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,
+		0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,
+		0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,
+		0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,
+		0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,
+		0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,
+		0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,
+		0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3
+};
+
+
+uint8_t crc8x_fast(void const *mem, uint16_t len) {
+    uint8_t crc = CRC8_INIT_VALUE;
+   	uint8_t const *data = (uint8_t*)mem;
     if (data == NULL)
         return 0xff;
     crc &= 0xff;
@@ -40,9 +38,12 @@ void nbus_init(Peripheral_typeDef *periph){
   nBus.periph = periph;
 
   HAL_TIM_RegisterCallback(nBus.periph->uart_timer, HAL_TIM_PERIOD_ELAPSED_CB_ID, nbus_cb_TIM_periodElapsed);
+  HAL_TIM_RegisterCallback(nBus.periph->measure_timer, HAL_TIM_PERIOD_ELAPSED_CB_ID, nbus_cb_TIM_periodElapsed_base);
   HAL_UART_RegisterCallback(nBus.periph->huart, HAL_UART_RX_COMPLETE_CB_ID, nbus_cb_UART_RX);
 
   nBus.rx_length = 0;
+  nBus.data_timebase = 0;
+  nBus.measure_active = MEASURE_STOPPED;
 
   // init restart timer
   nBus.uart_state = UART_RX_1B;
@@ -65,7 +66,11 @@ inline static void receiveNBytes(uint8_t n){
 inline static void send_response(){
 	if(nBus.send_response == SEND_RESPONSE) {
 		nBus.tx_buffer[0] -= 1;
+#if USE_USART_DMA_TX == 1
 		HAL_UART_Transmit_DMA(nBus.periph->huart, nBus.tx_buffer, nBus.tx_length);
+#else
+		HAL_UART_Transmi(nBus.periph->huart, nBus.tx_buffer, nBus.tx_length, 10);
+#endif
 	}
 }
 
@@ -87,6 +92,10 @@ void nbus_cb_UART_RX(UART_HandleTypeDef *huart){
 
 }
 
+void nbus_cb_TIM_periodElapsed_base(TIM_HandleTypeDef *htim) {
+	HAL_GPIO_TogglePin(nBus.periph->led->port, nBus.periph->led->pin);
+}
+
 void nbus_cb_TIM_periodElapsed(TIM_HandleTypeDef *htim) {
 	if(nBus.uart_state == UART_RX_PAYLOAD) {
 		HAL_TIM_Base_Stop_IT(nBus.periph->uart_timer);
@@ -129,7 +138,7 @@ void process_request(){
 	nBus.tx_buffer[1] = nBus.rx_buffer[0];	// Module address
 	nBus.tx_buffer[2] = nBus.rx_buffer[1];	// Sensor address
 
-	uint8_t crcC = crc8x_fast(0x00, nBus.rx_buffer, nBus.rx_length-1);
+	uint8_t crcC = crc8x_fast(nBus.rx_buffer, nBus.rx_length-1);
 	if(crcC != nBus.rx_buffer[nBus.rx_length-1]){
 		nBus.send_response = NO_RESPONSE;
 		return;
@@ -147,12 +156,12 @@ void process_request(){
 		return;
 	}
 
-	if(nBus.function_code.notReadWrite == REQUEST_GET) {
-		fc->error = 1;
-		nBus.tx_length = META_SIZE;
+	fc->error = 0;
+	nBus.tx_length = META_SIZE;
 
+	if(nBus.function_code.notReadWrite == REQUEST_GET) {
 		if(request_type == UNICAST_TO_SENSOR) {
-
+			fc = nbus_unicastToSensor(&nBus, fc);
 		}
 
 		if(request_type == UNICAST_TO_MODULE) {
@@ -160,10 +169,10 @@ void process_request(){
 		}
 
 		nBus.tx_buffer[3] = *(uint8_t*)&fc;
-		nBus.tx_buffer[nBus.tx_length-1] = crc8x_fast(0x00, &nBus.tx_buffer[1], nBus.tx_length-2);
+		nBus.tx_buffer[nBus.tx_length-1] = crc8x_fast(&nBus.tx_buffer[1], nBus.tx_length-2);
 		nBus.tx_buffer[0] = nBus.tx_length;
 
-	} else {
+	} else {  // else request if REQUEST_SET
 
 	}
 

+ 63 - 7
Src/nbus_impl.c

@@ -1,23 +1,37 @@
 #include "nbus_impl.h"
 
-extern nBus_TypeDef nBus;
 
+nBus_functionCode_t* nbus_unicastToSensor(nBus_TypeDef *nbus, nBus_functionCode_t *code){
+	return code;
+}
 
 nBus_functionCode_t* nbus_unicastToModule(nBus_TypeDef *nbus, nBus_functionCode_t *code){
-	if(nbus->function_code.function == CMD_VERSION) {
-		nbus->tx_buffer[4] = '0';
+
+	switch(nbus->function_code.function){
+	case CMD_VERSION:
+	{
+		nbus->tx_buffer[4] = VERSION_MAJOR;
 		nbus->tx_buffer[5] = '.';
-		nbus->tx_buffer[6] = '1';
+		nbus->tx_buffer[6] = VERSION_MINOR;
 		nbus->tx_length += 3;
-		code->error = 0;
 	}
+	break;
 
-	if(nbus->function_code.function == CMD_ECHO) {
+	case CMD_ECHO:
+	{
 		for(uint8_t i=3 ; i<nbus->rx_length-1 ; i++){
 			nbus->tx_buffer[i+1] = nbus->rx_buffer[i];
 		}
 		nbus->tx_length += (nbus->rx_length-4);
-		code->error = 0;
+	}
+	break;
+
+	default:
+	{
+		code->error = 1;
+		nbus->tx_buffer[4] = ILLEGAL_FUNCTION;
+		nbus->tx_length += 1;
+	}
 	}
 
 	return code;
@@ -30,6 +44,48 @@ void nbus_broadcast(nBus_TypeDef *nbus, nBusCommandType_t request_type){
 	}
 
 	if(request_type == BROADCAST_GLOBAL) {
+		switch(nbus->function_code.function) {
+		case CMD_SYNC:
+		{
+			if(nbus->rx_length < 11){
+				return;
+			}
+
+			RTC_TimeTypeDef sTime = {0};
+			RTC_DateTypeDef sDate = {0};
+
+			sTime.Hours = nbus->rx_buffer[7];
+			sTime.Minutes = nbus->rx_buffer[8];
+			sTime.Seconds = nbus->rx_buffer[9];
+			sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
+			sTime.StoreOperation = RTC_STOREOPERATION_RESET;
+			HAL_RTC_SetTime(nbus->periph->rtc, &sTime, RTC_FORMAT_BCD);
+
+			sDate.WeekDay = nbus->rx_buffer[6];
+			sDate.Month = nbus->rx_buffer[4];
+			sDate.Date = nbus->rx_buffer[5];
+			sDate.Year = nbus->rx_buffer[3];
+
+			HAL_RTC_SetDate(nbus->periph->rtc, &sDate, RTC_FORMAT_BCD);
+
+		}
+		break;
+
+		case CMD_START:
+		{
+			nbus->measure_active = MEASURE_RUNNING;
+		}
+		break;
+
+		case CMD_STOP:
+		{
+			nbus->measure_active = MEASURE_STOPPED;
+		}
+		break;
+
+		default:
+			; // nothing
+		}
 
 	}