// // Created by fctom on 2020/2/13. // #include #include "car_sensor.h" #include "../driver_test.h" #include "../defs.h" #include "../common/apptimer.h" #include "../jni_log.h" #define DEBUG(fmt, args...) LOGD(" <%s>: " fmt, __func__, ##args) #define MAX_SENSOR_NUM 32 static uint16_t gpioStore = 0; static int engine_rpm = 0; static struct sensor_cfg { int gpioId; int funId; int validLvl; int currValue; } SensorConfig[MAX_SENSOR_NUM]; static int SensorNum = 0; static pthread_mutex_t sonser_mutex = PTHREAD_MUTEX_INITIALIZER; void CarSensorInit(void) { gpioStore = 0; SensorNum = 0; memset(SensorConfig, 0, sizeof(SensorConfig)); pthread_mutex_init(&sonser_mutex, NULL); } void SetSensorCfg(int (*sensor)[3], int sensorNum) { DEBUG("加入传感器配置 sensorNum %d", sensorNum); pthread_mutex_lock(&sonser_mutex); SensorNum = sensorNum; for (int i = 0; i < sensorNum; ++i) { SensorConfig[i].gpioId = sensor[i][0]; SensorConfig[i].funId = sensor[i][1]; if (sensor[i][2] > 0) { SensorConfig[i].validLvl = 1; } else { SensorConfig[i].validLvl = 0; } if (gpioStore & BV(SensorConfig[i].gpioId)) { SensorConfig[i].currValue = 1; } else { SensorConfig[i].currValue = 0; } } pthread_mutex_unlock(&sonser_mutex); } void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t engine) { uint16_t chg = 0; int reportSensor[MAX_SENSOR_NUM]; int reportValue[MAX_SENSOR_NUM]; int reportNum = 0; pthread_mutex_lock(&sonser_mutex); chg = gpioStore^gpio; gpioStore = gpio; engine_rpm = engine; for (int i = 0; i < SensorNum; ++i) { if (chg & BV(SensorConfig[i].gpioId)) { if (gpio & BV(SensorConfig[i].gpioId)) { SensorConfig[i].currValue = 1; } else { SensorConfig[i].currValue = 0; } reportSensor[reportNum] = SensorConfig[i].funId; reportValue[reportNum] = (SensorConfig[i].validLvl == SensorConfig[i].currValue)?1:0; reportNum++; } } reportSensor[reportNum] = SENSOR_ENGINE_RPM; reportValue[reportNum] = engine; reportNum++; pthread_mutex_unlock(&sonser_mutex); SensorChanged(reportSensor, reportValue, reportNum); } int ReadSensor(uint16_t sensor_id) { int ret = -1; pthread_mutex_lock(&sonser_mutex); for (int i = 0; i < SensorNum; ++i) { if (sensor_id == SensorConfig[i].funId) { ret = (SensorConfig[i].validLvl == SensorConfig[i].currValue)?1:0; } } if (sensor_id == SENSOR_ENGINE_RPM) { ret = engine_rpm; } pthread_mutex_unlock(&sonser_mutex); return ret; }