DLIMIKO il y a 1 an
Parent
commit
872f15dfb4
4 fichiers modifiés avec 198 ajouts et 28 suppressions
  1. 12 12
      include/app_bridge.h
  2. 4 4
      include/app_dummy.h
  3. 4 10
      src/app_dummy.c
  4. 178 2
      src/nbus_slave_sensor_unicast.c

+ 12 - 12
include/app_bridge.h

@@ -1,8 +1,8 @@
 /*
- * app_bridge.h
- *
- *  Created on: Nov 2, 2023
- *      Author: juraj
+* app_bridge.h
+*
+*  Created on: Nov 2, 2023
+*      Author: juraj
  */
 
 #ifndef MODULES_NBUS_INC_APP_BRIDGE_H_
@@ -37,31 +37,31 @@ typedef enum
 } nBus_param_t;
 
 /**
- * @brief Maximálny počet bajtov formátu Q.
+* @brief Maximálny počet bajtov formátu Q.
  */
 #define Q_MAX_SIZE 64
 
 /**
- * @brief Definuje formát dát senzora.
+* @brief Definuje formát dát senzora.
  */
 typedef struct __attribute__((packed))
 {
     /** Bit určujúci či sú dáta znamienkové.
-     * 0 = ungigned, 1 = signed */
+    * 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 */
+    * 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 */
+    * rozsah: 0 - 64 */
     uint8_t q_m : 7;
 
     /** Počet desatinných bitov formátu Qm.n
-     * rozsah: 0 - 64 */
+    * rozsah: 0 - 64 */
     uint8_t q_n : 7;
 } nBus_sensorFormat_t;
 

+ 4 - 4
include/app_dummy.h

@@ -1,8 +1,8 @@
 /*
- * app_dummy.h
- *
- *  Created on: Nov 2, 2023
- *      Author: juraj
+* app_dummy.h
+*
+*  Created on: Nov 2, 2023
+*      Author: juraj
  */
 
 #ifndef INC_APP_DUMMY_H_

+ 4 - 10
src/app_dummy.c

@@ -2,9 +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_getFormat,
+    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()
@@ -109,11 +109,5 @@ uint8_t dummy_calibrate(uint8_t subslaveIndex, uint8_t calibrationParamsNum, uin
 
 nBus_sensorFormat_t dummy_getFormat(uint8_t sensor_index)
 {
-    return (nBus_sensorFormat_t)
-    {
-        .sign = 0,
-        .variable_length = 0,
-        .q_m = 32,
-        .q_n = 0
-    };
+    return (nBus_sensorFormat_t){.sign = 0, .variable_length = 0, .q_m = 32, .q_n = 0};
 }

+ 178 - 2
src/nbus_slave_sensor_unicast.c

@@ -2,6 +2,166 @@
 
 #if MODULE_SLAVE == 1
 
+void nbus_slave_unicastToSensorGet(nBus_TypeDef *nbus)
+{
+  switch (nbus->function_code.function)
+  {
+  case CMD_SENSOR_TYPE: {
+    nBus_sensorType_t t = nbus->interface->getType(nbus->sensorInfo.address);
+    if (t == TYPE_UNKNOWN)
+    {
+      setErrorResponse(nbus, ILLEGAL_DEVICE_ADDRESS);
+      break;
+    }
+    nbus->tx_buffer[4] = t;
+    nbus->tx_length += 1;
+  }
+  break;
+
+  case CMD_PARAM: {
+    if (nbus->rx_length >= 5)
+    {
+      if (nbus->interface->hasParam(nbus->sensorInfo.address, (nBus_param_t)nbus->rx_buffer[3]) == 0)
+      {
+        setErrorResponse(nbus, PARAM_NOT_IMPLEMENTED);
+        break;
+      }
+      nbus->tx_buffer[4] = nbus->rx_buffer[3];
+      int32_t param_value = nbus->interface->getParam(nbus->sensorInfo.address, (nBus_param_t)nbus->rx_buffer[3]);
+      nbus->tx_buffer[5] = (uint8_t)(param_value & 0xFF);
+      nbus->tx_buffer[6] = (uint8_t)((param_value >> 8) & 0xFF);
+      nbus->tx_buffer[7] = (uint8_t)((param_value >> 16) & 0xFF);
+      nbus->tx_buffer[8] = (uint8_t)((param_value >> 24) & 0xFF);
+      nbus->tx_length += 5;
+    }
+    else
+    {
+      nBus_param_t *params = nbus_interface_allParams();
+      for (uint8_t i = 0; i < nbus_interface_allParamsCount(); i++)
+      {
+        if (nbus->interface->hasParam(nbus->sensorInfo.address, params[i]))
+        {
+          int32_t param_value = nbus->interface->getParam(nbus->sensorInfo.address, params[i]);
+          nbus->tx_buffer[4 + 5 * i] = params[i];
+          // nbus->tx_buffer[5+2*i] =
+          // nbus->interface->getParam(nbus->sensorInfo.address, params[i]);
+          nbus->tx_buffer[5 + 5 * i] = (uint8_t)(param_value & 0xFF);
+          nbus->tx_buffer[6 + 5 * i] = (uint8_t)((param_value >> 8) & 0xFF);
+          nbus->tx_buffer[7 + 5 * i] = (uint8_t)((param_value >> 16) & 0xFF);
+          nbus->tx_buffer[8 + 5 * i] = (uint8_t)((param_value >> 24) & 0xFF);
+
+          nbus->tx_length += 5;
+        }
+      }
+    }
+  }
+  break;
+
+  case CMD_DATA: {
+    if (nbus->measure_active == MEASURE_RUNNING)
+    {
+      uint8_t cnt = nbus->interface->getData(nbus->sensorInfo.address, &nbus->tx_buffer[4]);
+      if (cnt == 0)
+      {
+        setErrorResponse(nbus, DEVICE_BUSY);
+        // return;
+      }
+      nbus->tx_length += cnt;
+    }
+    else
+    {
+      setErrorResponse(nbus, DEVICE_NOT_READY);
+    }
+  }
+  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);
+  }
+  }
+}
+
+void nbus_slave_unicastToSensorSet(nBus_TypeDef *nbus)
+{
+  int32_t param_value;
+  switch (nbus->function_code.function)
+  {
+  case CMD_PARAM: {
+    if (!nbus->interface->hasParam(nbus->sensorInfo.address, (nBus_param_t)nbus->rx_buffer[3]))
+    {
+      setErrorResponse(nbus, PARAM_NOT_IMPLEMENTED);
+      break;
+    }
+
+    param_value =
+        nbus->rx_buffer[4] | nbus->rx_buffer[5] << 8 | nbus->rx_buffer[6] << 16 << nbus->rx_buffer[7] << 23;
+    nBus_param_t p =
+        nbus->interface->setParam(nbus->sensorInfo.address, (nBus_param_t)nbus->rx_buffer[3], param_value);
+    if (p == PARAM_NONE)
+    {
+      setErrorResponse(nbus, ILLEGAL_DATA_VALUE);
+      break;
+    }
+    nbus->tx_buffer[4] = OK_CODE;
+    nbus->tx_length += 1;
+  }
+  break;
+
+  case CMD_CALIBRATE: {
+    nbus->hw_platform->led_on();
+    if (1 == nbus->interface->calibrate(nbus->sensorInfo.address, 0, NULL))
+    {
+      nbus->tx_buffer[4] = 1;
+      nbus->tx_length += 1;
+    }
+    else
+    {
+      setErrorResponse(nbus, ILLEGAL_DEVICE_ADDRESS);
+    }
+    nbus->hw_platform->led_off();
+    break;
+  }
+
+  case CMD_DATA: {
+    nbus->tx_buffer[4] = nbus->interface->setData(&nbus->rx_buffer[3]);
+    if (nbus->tx_buffer[4] != OK_CODE)
+    {
+      nbus->function_code.error = 1;
+    }
+    nbus->tx_length += 1;
+  }
+  break;
+
+  case CMD_STORE: {
+    nBus_param_t *all_params = nbus_interface_allParams();
+    for (uint32_t i = 0; i < nbus_interface_allParamsCount(); i++)
+    {
+      if (nbus->interface->hasParam(nbus->sensorInfo.address, all_params[i]))
+      {
+        sensor_store_param(nbus, nbus->sensorInfo.address, all_params[i]);
+        // param_value = nbus->interface->getParam(nbus->sensorInfo.address,
+        // all_params[i]);
+        // nbus->memoryInterface->storeParam(nbus->sensorInfo.address,
+        // all_params[i], param_value);
+      }
+    }
+
+    nbus->tx_buffer[4] = 1;
+    nbus->tx_length += 1;
+  }#include "nbus_slave.h"
+
+#if MODULE_SLAVE == 1
+
 void nbus_slave_unicastToSensorGet(nBus_TypeDef *nbus)
 {
     switch (nbus->function_code.function)
@@ -74,10 +234,10 @@ 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        
+        // 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;
@@ -173,4 +333,20 @@ void sensor_store_param(nBus_TypeDef *nbus, uint8_t sensor_index, uint8_t param_
     nbus->memoryInterface->storeParam(sensor_index, param_name, param_value);
 }
 
+#endif
+
+  break;
+
+  default: {
+    setErrorResponse(nbus, ILLEGAL_FUNCTION);
+  }
+  }
+}
+
+void sensor_store_param(nBus_TypeDef *nbus, uint8_t sensor_index, uint8_t param_name)
+{
+  uint32_t param_value = nbus->interface->getParam(sensor_index, param_name);
+  nbus->memoryInterface->storeParam(sensor_index, param_name, param_value);
+}
+
 #endif