|
|
@@ -0,0 +1,249 @@
|
|
|
+#include "nbus_app_driver.h"
|
|
|
+
|
|
|
+ tof_data_t tof_data;
|
|
|
+ imu_data_t imu_data;
|
|
|
+ env_data_t env_data;
|
|
|
+
|
|
|
+ int counter = 0;
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+static nBusAppInterface_t appdrv = {
|
|
|
+ appdrv_init, appdrv_reset, appdrv_getType, appdrv_getSensorCount, appdrv_getData, appdrv_setData, appdrv_hasParam,
|
|
|
+ appdrv_getParam, appdrv_setParam, appdrv_start, appdrv_stop, appdrv_read, appdrv_store, appdrv_calibrate, appdrv_getSensorFormat,
|
|
|
+ appdrv_find, appdrv_device_ready
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+nBusAppInterface_t *getAppdrvDriver()
|
|
|
+{
|
|
|
+ return &appdrv;
|
|
|
+}
|
|
|
+
|
|
|
+void appdrv_init(void *hw_interface, void *hw_config)
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void appdrv_reset()
|
|
|
+{
|
|
|
+ return; // do nothing
|
|
|
+}
|
|
|
+
|
|
|
+nBus_sensorType_t appdrv_getType(uint8_t sensor_index)
|
|
|
+{
|
|
|
+ switch (sensor_index)
|
|
|
+ {
|
|
|
+ case TOF_ID:
|
|
|
+ return TYPE_LENGTH_GAUGE;
|
|
|
+ break;
|
|
|
+ case ACC_ID:
|
|
|
+ return TYPE_ACCELEROMETER;
|
|
|
+ break;
|
|
|
+ case GYR_ID:
|
|
|
+ return TYPE_GYROSCOPE;
|
|
|
+ break;
|
|
|
+ case TMP_ID:
|
|
|
+ return TYPE_THERMOMETER;
|
|
|
+ break;
|
|
|
+ case HUM_ID:
|
|
|
+ return TYPE_HYGROMETER;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return TYPE_UNKNOWN;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+nBus_sensorCount_t appdrv_getSensorCount()
|
|
|
+{
|
|
|
+ return {.read_only_count=APP_SENSOR_CNT, .read_write_count=0};
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t appdrv_getData(uint8_t sensor_index, uint8_t *data)
|
|
|
+{
|
|
|
+ uint16_t data_size = 0;
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, TOF_ID))
|
|
|
+ {
|
|
|
+ read_tof_data(tof_data);
|
|
|
+ //tof_data.payload.x = i++;
|
|
|
+ data_size = _write_sensor_values(data, data_size, TOF_ID, tof_data.payload.coordinates, APP_TOF_VCNT);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, ACC_ID, GYR_ID))
|
|
|
+ {
|
|
|
+ read_imu_data(imu_data);
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, TOF_ID))
|
|
|
+ data_size = _write_sensor_values(data, data_size, ACC_ID, imu_data.payload.acc, APP_ACC_VCNT);
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, GYR_ID))
|
|
|
+ data_size = _write_sensor_values(data, data_size, GYR_ID, imu_data.payload.gyr, APP_GYR_VCNT);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, TMP_ID, HUM_ID))
|
|
|
+ {
|
|
|
+ read_env_data(env_data);
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, TMP_ID))
|
|
|
+ data_size = _write_sensor_values(data, data_size, TMP_ID, &env_data.payload.temp, APP_TMP_VCNT);
|
|
|
+
|
|
|
+ if (_or(sensor_index, ALL_ID, HUM_ID))
|
|
|
+ data_size = _write_sensor_values(data, data_size, HUM_ID, &env_data.payload.hum, APP_HUM_VCNT);
|
|
|
+ }
|
|
|
+
|
|
|
+ counter++;
|
|
|
+
|
|
|
+ return data_size;
|
|
|
+}
|
|
|
+
|
|
|
+nBus_statusType_t appdrv_setData(uint8_t *data, uint8_t count, uint8_t *response)
|
|
|
+{
|
|
|
+ return STATUS_NOT_SUPPORTED;
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t appdrv_hasParam(uint8_t sensor_index, nBus_param_t param_name)
|
|
|
+{
|
|
|
+ return APP_HAS_NO_PARAM;
|
|
|
+}
|
|
|
+
|
|
|
+int32_t appdrv_getParam(uint8_t sensor_index, nBus_param_t param_name)
|
|
|
+{
|
|
|
+ return PARAM_VALUE_NONE;
|
|
|
+}
|
|
|
+
|
|
|
+nBus_statusType_t appdrv_setParam(uint8_t sensor_index, nBus_param_t param_name, int32_t param_value)
|
|
|
+{
|
|
|
+ return STATUS_NOT_SUPPORTED;
|
|
|
+}
|
|
|
+
|
|
|
+nBus_statusType_t appdrv_start(void)
|
|
|
+{
|
|
|
+ counter = 0;
|
|
|
+ i = 0;
|
|
|
+ set_working_mode(true);
|
|
|
+ return STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+nBus_statusType_t appdrv_stop(void)
|
|
|
+{
|
|
|
+ Serial.println(counter);
|
|
|
+ set_working_mode(false);
|
|
|
+ return STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+void appdrv_read(void)
|
|
|
+{
|
|
|
+ return; // do nothing
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t appdrv_store(void)
|
|
|
+{
|
|
|
+ return 0; // do nothing
|
|
|
+}
|
|
|
+
|
|
|
+nBus_statusType_t appdrv_calibrate(uint8_t sensor_index)
|
|
|
+{
|
|
|
+ return STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+nBus_sensorFormat_t appdrv_getSensorFormat(uint8_t sensor_index)
|
|
|
+{
|
|
|
+ switch (sensor_index)
|
|
|
+ {
|
|
|
+ case TOF_ID:
|
|
|
+ return (nBus_sensorFormat_t) {
|
|
|
+ .sign = APP_TOF_VSGN,
|
|
|
+ .unit_multiplier = APP_TOF_ULMUL,
|
|
|
+ .value_multiplier = APP_TOF_VLMUL,
|
|
|
+ .byte_length = APP_TOF_BCNT,
|
|
|
+ .samples = APP_TOF_VCNT
|
|
|
+ };
|
|
|
+ break;
|
|
|
+
|
|
|
+ case ACC_ID:
|
|
|
+ return (nBus_sensorFormat_t) {
|
|
|
+ .sign = APP_ACC_VSGN,
|
|
|
+ .unit_multiplier = APP_ACC_ULMUL,
|
|
|
+ .value_multiplier = APP_ACC_VLMUL,
|
|
|
+ .byte_length = APP_ACC_BCNT,
|
|
|
+ .samples = APP_ACC_VCNT
|
|
|
+ };
|
|
|
+ break;
|
|
|
+
|
|
|
+ case GYR_ID:
|
|
|
+ return (nBus_sensorFormat_t) {
|
|
|
+ .sign = APP_GYR_VSGN,
|
|
|
+ .unit_multiplier = APP_GYR_ULMUL,
|
|
|
+ .value_multiplier = APP_GYR_VLMUL,
|
|
|
+ .byte_length = APP_GYR_BCNT,
|
|
|
+ .samples = APP_GYR_VCNT
|
|
|
+ };
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TMP_ID:
|
|
|
+ return (nBus_sensorFormat_t) {
|
|
|
+ .sign = APP_TMP_VSGN,
|
|
|
+ .unit_multiplier = APP_TMP_ULMUL,
|
|
|
+ .value_multiplier = APP_TMP_VLMUL,
|
|
|
+ .byte_length = APP_TMP_BCNT,
|
|
|
+ .samples = APP_TMP_VCNT
|
|
|
+ };
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HUM_ID:
|
|
|
+ return (nBus_sensorFormat_t) {
|
|
|
+ .sign = APP_HUM_VSGN,
|
|
|
+ .unit_multiplier = APP_HUM_ULMUL,
|
|
|
+ .value_multiplier = APP_HUM_VLMUL,
|
|
|
+ .byte_length = APP_HUM_BCNT,
|
|
|
+ .samples = APP_HUM_VCNT
|
|
|
+ };
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return (nBus_sensorFormat_t) {
|
|
|
+ .sign = 0,
|
|
|
+ .unit_multiplier = 0,
|
|
|
+ .value_multiplier = 0,
|
|
|
+ .byte_length = 0,
|
|
|
+ .samples = 0
|
|
|
+ };
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+nBus_statusType_t appdrv_find(uint8_t enable)
|
|
|
+{
|
|
|
+ return STATUS_NOT_SUPPORTED;
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t appdrv_device_ready()
|
|
|
+{
|
|
|
+ return APP_ALWAYS_READY;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+uint16_t _write_sensor_values(uint8_t *data_out, uint16_t offset_out, uint8_t sid, int16_t *values, uint16_t size)
|
|
|
+{
|
|
|
+ data_out[offset_out++] = sid;
|
|
|
+
|
|
|
+ for (int8_t i = 0; i < size; i++)
|
|
|
+ {
|
|
|
+ data_out[offset_out++] = values[i] & 0xFF;
|
|
|
+ data_out[offset_out++] = values[i] >> 8;
|
|
|
+ }
|
|
|
+
|
|
|
+ return offset_out;
|
|
|
+}
|
|
|
+
|
|
|
+bool _or(uint8_t x, app_sid_t a, app_sid_t b)
|
|
|
+{
|
|
|
+ return x == a || x == b;
|
|
|
+}
|
|
|
+
|
|
|
+bool _or(uint8_t x, app_sid_t a, app_sid_t b, app_sid_t c)
|
|
|
+{
|
|
|
+ return x == a || x == b || x == c;
|
|
|
+}
|