Ver código fonte

+ cmd info sensor

DLIMIKO 1 ano atrás
pai
commit
6170890fbf
4 arquivos alterados com 53 adições e 0 exclusões
  1. 31 0
      include/app_bridge.h
  2. 1 0
      include/app_dummy.h
  3. 11 0
      src/app_dummy.c
  4. 10 0
      src/nbus_slave_sensor_unicast.c

+ 31 - 0
include/app_bridge.h

@@ -36,6 +36,36 @@ 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.
+ */
+typedef struct __attribute__((packed))
+{
+    /** Bit určujúci či sú dáta znamienkové.
+     * 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;
+
+    /** Počet celočíselných bitov formátu Qm.n
+     * rozsah: 0 - 64 */
+    uint8_t q_m : 7;
+    
+    /** Počet desatinných bitov formátu Qm.n
+     * rozsah: 0 - 64 */
+    uint8_t q_n : 7;
+
+} nBus_sensorFormat_t;
+
 #define PARAM_VALUE_NONE 0x7FFFFFFF
 
 nBus_param_t *nbus_interface_allParams();
@@ -60,6 +90,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);
 } 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_getFormat(uint8_t sensor_index);
 
 #ifdef __cplusplus
 }

+ 11 - 0
src/app_dummy.c

@@ -4,6 +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,
 };
 
 nBusAppInterface_t *getDummyDriver()
@@ -105,3 +106,13 @@ 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
+    };
+}

+ 10 - 0
src/nbus_slave_sensor_unicast.c

@@ -74,6 +74,16 @@ 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;
+    }
+    break;
 
     default: {
         setErrorResponse(nbus, ILLEGAL_FUNCTION);