Quellcode durchsuchen

+ implemented CMD_INFO

DLIMIKO vor 1 Jahr
Ursprung
Commit
da3c663ac8

+ 32 - 0
include/app_bridge.h

@@ -36,6 +36,37 @@ typedef enum
     PARAM_FILTER
 } nBus_param_t;
 
+/**
+ * @brief Definuje formát dát senzora.
+ */
+typedef struct __attribute__((packed))
+{
+    /** Bit určujúci či sú dáta znamienkové.
+     * 0 = ungigned, 1 = signed */
+    uint8_t sign : 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 bajtov meranej hodnoty.
+     * @note: povolený rozsah [1 , 8]
+     */
+    uint8_t byte_length : 4;
+
+    /** Počet vzoriek meranej hodnoty.
+     * @note: povolený rozsah [1 , 16]
+     */
+    uint8_t samples : 4;
+} nBus_sensorFormat_t;
+
 #define PARAM_VALUE_NONE 0x7FFFFFFF
 
 nBus_param_t *nbus_interface_allParams();
@@ -60,6 +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 (*getSensorFormat)(uint8_t sensor_index);
 } nBusAppInterface_t;
 
 #endif /* MODULES_NBUS_INC_APP_BRIDGE_H_ */

+ 1 - 0
include/app_dummy.h

@@ -33,6 +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_getSensorFormat(uint8_t sensor_index);
 
 #ifdef __cplusplus
 }

+ 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 - 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

+ 26 - 2
src/app_dummy.c

@@ -2,8 +2,9 @@
 #include <stdint.h>
 
 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_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_getSensorFormat,
 };
 
 nBusAppInterface_t *getDummyDriver()
@@ -105,3 +106,26 @@ uint8_t dummy_calibrate(uint8_t subslaveIndex, uint8_t calibrationParamsNum, uin
 {
     return 0;
 }
+
+nBus_sensorFormat_t dummy_getSensorFormat(uint8_t sensor_index)
+{
+    switch (sensor_index)
+    {
+    case 1:
+        return (nBus_sensorFormat_t){
+            .sign = 0, .unit_multiplier = -3, .value_multiplier = -6, .byte_length = 4, .samples = 4};
+        break;
+    case 2:
+        return (nBus_sensorFormat_t){
+            .sign = 0, .unit_multiplier = -4, .value_multiplier = -7, .byte_length = 4, .samples = 4};
+        break;
+    case 3:
+        return (nBus_sensorFormat_t){
+            .sign = 1, .unit_multiplier = 3, .value_multiplier = 6, .byte_length = 4, .samples = 4};
+        break;
+    case 4:
+        return (nBus_sensorFormat_t){
+            .sign = 1, .unit_multiplier = 4, .value_multiplier = 7, .byte_length = 4, .samples = 4};
+        break;
+    }
+}

+ 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;

+ 17 - 0
src/nbus_slave_sensor_unicast.c

@@ -75,6 +75,23 @@ void nbus_slave_unicastToSensorGet(nBus_TypeDef *nbus)
     }
     break;
 
+    case CMD_INFO: {
+        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;
+
     default: {
         setErrorResponse(nbus, ILLEGAL_FUNCTION);
     }