Переглянути джерело

Merge branch 'MN_CMD_INFO' of gitlab.nsoric.com:sensorical/fw/nbus into MN_CMD_INFO

DLIMIKO 1 рік тому
батько
коміт
f3bb18f52f

+ 7 - 0
README.md

@@ -107,6 +107,13 @@ memory_ec20.init(ONE_WIRE_GPIO_Port, ONE_WIRE_Pin);  //applicatin level function
 nbus_init_memory_driver(&memory_ec20);  // pass memory driver to nBus
 ```
 
+Note: if no memory used, initlialize it as memory dummy driver.
+
+```c
+#include "memory_dummy.h"
+nbus_init_memory_driver(getDummyMemDriver());  // pass dummy memory driver to nBus
+```
+
 ***Run application stack***
 The function ``nbus_stack()`` contains of application loop.
 ```c

+ 20 - 18
include/app_bridge.h

@@ -20,7 +20,7 @@ typedef enum
     TYPE_HUMIDITY,
     TYPE_PRESSURE,
     TYPE_HEART_RATE,
-    TYPE_GNOSTIC_DISTANCE,
+    TYPE_DEVIATION_DISTANCE,
 } nBus_sensorType_t;
 
 typedef enum
@@ -36,11 +36,6 @@ typedef enum
     PARAM_FILTER
 } nBus_param_t;
 
-/**
- * @brief Maximálny počet bajtov formátu Q.
- */
-#define Q_MAX_SIZE 64
-
 /**
  * @brief Definuje formát dát senzora.
  */
@@ -50,19 +45,26 @@ typedef struct __attribute__((packed))
      * 0 = ungigned, 1 = signed */
     uint8_t sign : 1;
 
-    /** Bit určujúci či majú dáta premenlivú dĺžku.
-     * Ak majú premenlivú dĺžku, dátový formát je potom:
-     * | sensor id | data len | data |
-     * 0 = fixed, 1 = variable */
-    uint8_t variable_length : 1;
+    /** Násobok základnej meranej jednotky (mili, micro, kilo, deka, mega, ...)
+     * uložený v logaritmickom tvare (pr. 2 -> 10^2).
+     * @note: povolený rozsah [-64 , +63]
+     */
+    uint8_t unit_multiplier : 7;
+
+    /** Násobok meranej hodnoty uložený v logaritmickom tvare (pr. 1 -> 10^1).
+     * @note: povolený rozsah [-128 , +127]
+     */
+    uint8_t value_multiplier : 8;
 
-    /** Počet celočíselných bitov formátu Qm.n
-     * rozsah: 0 - 64 */
-    uint8_t q_m : 7;
+    /** Počet bajtov meranej hodnoty.
+     * @note: povolený rozsah [1 , 8]
+     */
+    uint8_t byte_length : 4;
 
-    /** Počet desatinných bitov formátu Qm.n
-     * rozsah: 0 - 64 */
-    uint8_t q_n : 7;
+    /** Počet vzoriek meranej hodnoty.
+     * @note: povolený rozsah [1 , 16]
+     */
+    uint8_t samples : 4;
 } nBus_sensorFormat_t;
 
 #define PARAM_VALUE_NONE 0x7FFFFFFF
@@ -89,7 +91,7 @@ typedef struct
     void (*read)(void);
     uint8_t (*store)(void);
     uint8_t (*calibrate)(uint8_t subslaveIndex, uint8_t calibrationParamsNum, uint8_t *calibrationParams);
-    nBus_sensorFormat_t (*getFormat)(uint8_t sensor_index);
+    nBus_sensorFormat_t (*getSensorFormat)(uint8_t sensor_index);
 } nBusAppInterface_t;
 
 #endif /* MODULES_NBUS_INC_APP_BRIDGE_H_ */

+ 1 - 1
include/app_dummy.h

@@ -33,7 +33,7 @@ extern "C"
     void dummy_read(void);
     uint8_t dummy_store(void);
     uint8_t dummy_calibrate(uint8_t subslaveIndex, uint8_t calibrationParamsNum, uint8_t *calibrationParams);
-    nBus_sensorFormat_t dummy_getFormat(uint8_t sensor_index);
+    nBus_sensorFormat_t dummy_getSensorFormat(uint8_t sensor_index);
 
 #ifdef __cplusplus
 }

+ 36 - 0
include/memory_dummy.h

@@ -0,0 +1,36 @@
+/*
+ * memory_dummy.h
+ *
+ *  Created on: July 13, 2024
+ *      Author: Matus Necas
+ */
+
+#ifndef INC_MEM_DUMMY_H_
+#define INC_MEM_DUMMY_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "nbus_memory.h"
+
+    nBus_MemoryDriver *getDummyMemDriver();
+
+    uint8_t dummy_mem_init(void *gpio_port, uint16_t gpio_pin);
+    uint32_t dummy_mem_read_word(uint16_t address);
+    uint16_t dummy_mem_read_half_word(uint16_t address);
+    uint8_t dummy_mem_read_byte(uint16_t address);
+
+    uint8_t dummy_mem_write_data(uint8_t *data, uint16_t address, uint8_t length);
+
+    uint8_t dummy_mem_read_id(uint8_t *data);
+    uint32_t dummy_mem_get_capacity(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INC_MEM_DUMMY_H_ */

+ 1 - 0
include/nbus_cmd.h

@@ -37,6 +37,7 @@
 #define INFO_MODULE_HW 0xE4
 #define INFO_MODULE_FW 0xE5 // ?
 #define INFO_MODULE_MEMORY_ID 0xE6
+#define SENSOR_FORMAT 0xE7
 
 #define PARAM_SENSOR_SAMPLERATE 0x41
 #define PARAM_SENSOR_LPF 0x42

+ 1 - 0
include/nbus_master_module.h

@@ -8,6 +8,7 @@
 #ifndef MODULES_NBUS_INC_NBUS_MASTER_MODULE_H_
 #define MODULES_NBUS_INC_NBUS_MASTER_MODULE_H_
 
+#include "nbus_cmd.h"
 #include "nbus_config.h"
 #include "nbus_types.h"
 

+ 1 - 1
include/nbus_memory.h

@@ -16,7 +16,7 @@
 #define MODULE_PARAM_SIZE 4
 
 #define GET_PARAM_ADDRESS(sensor, param)                                                                               \
-    (MODULE_SENSORS_ADDRESS_OFFSET + (sensor)*MODULE_PARAMS_COUNT * MODULE_PARAM_SIZE + (param)*MODULE_PARAM_SIZE)
+    (MODULE_SENSORS_ADDRESS_OFFSET + (sensor) * MODULE_PARAMS_COUNT * MODULE_PARAM_SIZE + (param) * MODULE_PARAM_SIZE)
 
 #define PARAMETER_VALID 0b10
 #define PARAMETER_UNSET 0b01

+ 1 - 6
src/app_dummy.c

@@ -4,7 +4,7 @@
 nBusAppInterface_t dummy_driver = {
     dummy_init,    dummy_reset,    dummy_getType,  dummy_getSensorCount, dummy_getData,
     dummy_setData, dummy_hasParam, dummy_getParam, dummy_setParam,       dummy_start,
-    dummy_stop,    dummy_read,     dummy_store,    dummy_calibrate,      dummy_getFormat,
+    dummy_stop,    dummy_read,     dummy_store,    dummy_calibrate,      dummy_getSensorFormat,
 };
 
 nBusAppInterface_t *getDummyDriver()
@@ -106,8 +106,3 @@ uint8_t dummy_calibrate(uint8_t subslaveIndex, uint8_t calibrationParamsNum, uin
 {
     return 0;
 }
-
-nBus_sensorFormat_t dummy_getFormat(uint8_t sensor_index)
-{
-    return (nBus_sensorFormat_t){.sign = 0, .variable_length = 0, .q_m = 32, .q_n = 0};
-}

+ 54 - 0
src/memory_dummy.c

@@ -0,0 +1,54 @@
+#include "memory_dummy.h"
+
+nBus_MemoryDriver dummy_memory = {
+    dummy_mem_init,       dummy_mem_read_word, dummy_mem_read_half_word, dummy_mem_read_byte,
+    dummy_mem_write_data, dummy_mem_read_id,   dummy_mem_get_capacity,
+};
+
+nBus_MemoryDriver *getDummyMemDriver()
+{
+    return &dummy_memory;
+}
+
+uint8_t dummy_mem_init(void *gpio_port, uint16_t gpio_pin)
+{
+    return 1;
+}
+
+uint32_t dummy_mem_read_word(uint16_t address)
+{
+    return 0xFFFFFFFF;
+}
+
+uint16_t dummy_mem_read_half_word(uint16_t address)
+{
+    return 0xFFFF;
+}
+uint8_t dummy_mem_read_byte(uint16_t address)
+{
+    return 0xFF;
+}
+
+uint8_t dummy_mem_write_data(uint8_t *data, uint16_t address, uint8_t length)
+{
+    return 0;
+}
+
+uint8_t dummy_mem_read_id(uint8_t *data)
+{
+    data[0] = 0xFF;
+    data[1] = 0xFF;
+    data[2] = 0xFF;
+    data[3] = 0xFF;
+    data[4] = 0xFF;
+    data[5] = 0xFF;
+    data[6] = 0xFF;
+    data[7] = 0xFF;
+
+    return 8;
+}
+
+uint32_t dummy_mem_get_capacity(void)
+{
+    return 0;
+}

+ 9 - 8
src/nbus_app.c

@@ -146,10 +146,6 @@ static void process_request()
             nbus_slave_unicastToModuleSet(&nBus);
         }
     }
-
-    nBus.tx_buffer[3] = *(uint8_t *)&nBus.function_code;
-    nBus.tx_buffer[nBus.tx_length - 1] = crc8x_fast(&nBus.tx_buffer[1], nBus.tx_length - 2);
-    nBus.tx_buffer[0] = nBus.tx_length;
 #endif
 
 #if MODULE_MASTER == 1
@@ -162,6 +158,9 @@ static void process_request()
         nbus_master_unicastToModuleSet(&nBus);
     }
 #endif
+    nBus.tx_buffer[3] = *(uint8_t *)&nBus.function_code;
+    nBus.tx_buffer[nBus.tx_length - 1] = crc8x_fast(&nBus.tx_buffer[1], nBus.tx_length - 2);
+    nBus.tx_buffer[0] = nBus.tx_length;
 }
 
 static void nbus_blink_LED(uint8_t delay)
@@ -291,9 +290,8 @@ void nbus_init_memory_driver(nBus_MemoryDriver *memDriver)
 void nbus_stack(void)
 {
 
-    nbus_blink_LED(50);
-
 #if USE_ARDUINO_FRAMWORK == 0
+    nbus_blink_LED(50);
     while (1)
 #endif
     {
@@ -302,10 +300,13 @@ void nbus_stack(void)
 
             process_request();
             nBus.uart_state = UART_RX_WAIT;
-
+#if MODULE_SLAVE == 1
             send_response();
+#endif
 #if MODULE_MASTER == 1
-            receive_slave_response();
+            // test
+            send_response();
+            // receive_slave_response();
 #endif
         }
 

+ 17 - 21
src/nbus_master_module.c

@@ -10,36 +10,32 @@
 
 #if MODULE_MASTER == 1
 
+inline void setErrorResponse(nBus_TypeDef *nbus, uint8_t code)
+{
+    nbus->function_code.error = 1;
+    nbus->tx_buffer[4] = code;
+    nbus->tx_length += 1;
+}
+
 void nbus_master_unicastToModuleSet(nBus_TypeDef *nbus)
 {
 }
 
 void nbus_master_unicastToModuleGet(nBus_TypeDef *nbus)
 {
-    //		case CMD_SYNC:
+    switch (nbus->function_code.function)
     {
-        if (nbus->rx_length < 11)
+    case CMD_ECHO: {
+        for (uint8_t i = 3; i < nbus->rx_length - 1; i++)
         {
-            return;
+            nbus->tx_buffer[i + 1] = nbus->rx_buffer[i] + 1;
         }
-
-        // 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.Date = nbus->rx_buffer[5];
-        // sDate.Month = nbus->rx_buffer[4];
-        // sDate.Year = nbus->rx_buffer[3];
-
-        // HAL_RTC_SetDate(nbus->periph->rtc, &sDate, RTC_FORMAT_BCD);
+        nbus->tx_length += (nbus->rx_length - 4);
+        break;
+    }
+    default: {
+        setErrorResponse(nbus, ILLEGAL_FUNCTION);
+    }
     }
-    //		break;
 }
 #endif

+ 3 - 3
src/nbus_memory.c

@@ -37,20 +37,20 @@ uint8_t ubus_memory_write4B(uint32_t data, uint16_t adr)
     memory_buffer[0] = data >> 24;
     memory_buffer[1] = (data >> 16) & 0xFF;
     memory_buffer[2] = (data >> 8) & 0xFF;
-    memory_buffer[3] = (data)&0xFF;
+    memory_buffer[3] = (data) & 0xFF;
     return memoryImplementation->write_data(memory_buffer, adr, 4);
 }
 
 uint8_t ubus_memory_write2B(uint16_t data, uint16_t adr)
 {
     memory_buffer[0] = (data >> 8) & 0xFF;
-    memory_buffer[1] = (data)&0xFF;
+    memory_buffer[1] = (data) & 0xFF;
     return memoryImplementation->write_data(memory_buffer, adr, 2);
 }
 
 uint8_t ubus_memory_write1B(uint8_t data, uint16_t adr)
 {
-    memory_buffer[0] = (data)&0xFF;
+    memory_buffer[0] = (data) & 0xFF;
     return memoryImplementation->write_data(memory_buffer, adr, 1);
 }
 

+ 15 - 1
src/nbus_slave_module_unicast.c

@@ -1,5 +1,4 @@
 #include "nbus_slave.h"
-
 #if MODULE_SLAVE == 1
 
 void nbus_slave_unicastToModuleGet(nBus_TypeDef *nbus)
@@ -118,6 +117,21 @@ void nbus_slave_unicastToModuleGet(nBus_TypeDef *nbus)
             uint8_t n = nbus->memoryInterface->getId(&nbus->tx_buffer[4]);
             nbus->tx_length += n;
         }
+        case SENSOR_FORMAT: {
+            uint8_t sensor_cnt = nbus->interface->getSensorCount();
+            nBus_sensorFormat_t format;
+
+            for (int8_t i = 0; i < sensor_cnt; ++i)
+            {
+                format = nbus->interface->getSensorFormat(i + 1);
+                nbus->tx_buffer[4 * i + 4] = i + 1;
+                nbus->tx_buffer[4 * i + 5] = (format.sign << 7) | format.unit_multiplier;
+                nbus->tx_buffer[4 * i + 6] = format.value_multiplier;
+                nbus->tx_buffer[4 * i + 7] = (format.byte_length << 4) | format.samples;
+            }
+
+            nbus->tx_length += 4 * sensor_cnt;
+        }
         }
     }
     break;

+ 13 - 6
src/nbus_slave_sensor_unicast.c

@@ -76,12 +76,19 @@ void nbus_slave_unicastToSensorGet(nBus_TypeDef *nbus)
     break;
 
     case CMD_INFO: {
-        nBus_sensorFormat_t format = nbus->interface->getFormat(nbus->sensorInfo.address);
-        // const uint8_t *data = (const uint8_t*)&format; doesnt work, missaligned data
-        uint16_t data = format.sign << 15 | format.variable_length << 14 | format.q_m << 7 | format.q_n;
-        nbus->tx_buffer[4] = data >> 8;
-        nbus->tx_buffer[5] = data & 0xFF;
-        nbus->tx_length += 2;
+        switch (nbus->rx_buffer[3])
+        {
+        case SENSOR_FORMAT: {
+            nBus_sensorFormat_t format = nbus->interface->getSensorFormat(nbus->sensorInfo.address);
+
+            nbus->tx_buffer[4] = nbus->sensorInfo.address;
+            nbus->tx_buffer[5] = (format.sign << 7) | format.unit_multiplier;
+            nbus->tx_buffer[6] = format.value_multiplier;
+            nbus->tx_buffer[7] = (format.byte_length << 4) | format.samples;
+
+            nbus->tx_length += 4;
+        }
+        }
     }
     break;