| | |
| | | #define MAX_SENSOR_NUM 32 |
| | | |
| | | static uint16_t gpioStore; |
| | | static int left_turn_signal, right_turn_signal; |
| | | static bool left_turn_signal, right_turn_signal; |
| | | |
| | | enum { |
| | | SENSOR_SEATBELT, |
| | |
| | | |
| | | inline static int BX(int value); |
| | | static void WriteCarStatus(uint16_t id, int value); |
| | | static void LRLightTimeout(union sigval sig); |
| | | static void ChangeLRLight(int light); |
| | | |
| | | static void ConfirmTurnSigalLater(union sigval sig); |
| | | static void flashBeamLightClose(union sigval sig); |
| | | |
| | |
| | | |
| | | memset(&Sensor, 0, sizeof(Sensor)); |
| | | |
| | | left_turn_signal = right_turn_signal = 0; |
| | | left_turn_signal = right_turn_signal = false; |
| | | |
| | | pthread_mutex_init(&sonser_mutex, NULL); |
| | | pthread_mutex_init(&status_rw_mutex, NULL); |
| | |
| | | } |
| | | } |
| | | |
| | | static void LRLightTimeout(union sigval sig) |
| | | { |
| | | AppTimer_delete(LRLightTimeout); |
| | | if (!left_turn_signal && !right_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, OFF_LIGHT); |
| | | } else if (left_turn_signal && right_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, HAZARD_LIGHTS); |
| | | } else if (left_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, LEFT_TURN_LIGHT); |
| | | } else { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, RIGHT_TURN_LIGHT); |
| | | } |
| | | } |
| | | |
| | | static void ChangeLRLight(int light) |
| | | { |
| | | DEBUG("ChangeLRLight %d %d", left_turn_signal, right_turn_signal); |
| | | if (!left_turn_signal && !right_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, OFF_LIGHT); |
| | | } else if (left_turn_signal && right_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, HAZARD_LIGHTS); |
| | | } else if (left_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, LEFT_TURN_LIGHT); |
| | | } else { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, RIGHT_TURN_LIGHT); |
| | | } |
| | | |
| | | AppTimer_delete(LRLightTimeout); |
| | | AppTimer_add(LRLightTimeout, 1500); |
| | | } |
| | | |
| | | static void ConfirmTurnSigalLater(union sigval sig) |
| | | { |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | |
| | | ChangeLRLight(sig.sival_int); |
| | | DEBUG("确认转向灯 左 %d 右 %d", left_turn_signal, right_turn_signal); |
| | | |
| | | if (!left_turn_signal && !right_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, OFF_LIGHT); |
| | | } else if (left_turn_signal && right_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, HAZARD_LIGHTS); |
| | | } else if (left_turn_signal) { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, LEFT_TURN_LIGHT); |
| | | } else { |
| | | WriteCarStatus(TURN_SIGNAL_LAMP, RIGHT_TURN_LIGHT); |
| | | } |
| | | } |
| | | |
| | | static void flashBeamLightClose(union sigval sig) |
| | |
| | | DEBUG("状态改变 %d = %d", id, value); |
| | | switch (id) { |
| | | case SENSOR_LEFT_TURN_SIGNAL: { |
| | | left_turn_signal = value; |
| | | left_turn_signal = (bool) (value > 0); |
| | | |
| | | if (left_turn_signal) { |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | if (right_turn_signal) { |
| | | // 判定为双闪 |
| | | AppTimer_add(ConfirmTurnSigalLater, 500, HAZARD_LIGHTS); |
| | | } else { |
| | | AppTimer_add(ConfirmTurnSigalLater, 200, LEFT_TURN_LIGHT); |
| | | } |
| | | } else { |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | if (right_turn_signal) |
| | | AppTimer_add(ConfirmTurnSigalLater, 1500, RIGHT_TURN_LIGHT); |
| | | else |
| | | AppTimer_add(ConfirmTurnSigalLater, 1500, OFF_LIGHT); |
| | | } |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | |
| | | AppTimer_add(ConfirmTurnSigalLater, left_turn_signal? 100 : 1100); |
| | | break; |
| | | } |
| | | case SENSOR_RIGHT_TURN_SIGNAL: { |
| | | right_turn_signal = value; |
| | | right_turn_signal = (bool) (value > 0); |
| | | |
| | | if (right_turn_signal) { |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | if (left_turn_signal) { |
| | | // 判定为双闪 |
| | | AppTimer_add(ConfirmTurnSigalLater, 500, HAZARD_LIGHTS); |
| | | } else { |
| | | AppTimer_add(ConfirmTurnSigalLater, 200, RIGHT_TURN_LIGHT); |
| | | } |
| | | } else { |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | if (left_turn_signal) |
| | | AppTimer_add(ConfirmTurnSigalLater, 1500, LEFT_TURN_LIGHT); |
| | | else |
| | | AppTimer_add(ConfirmTurnSigalLater, 1500, OFF_LIGHT); |
| | | } |
| | | AppTimer_delete(ConfirmTurnSigalLater); |
| | | |
| | | AppTimer_add(ConfirmTurnSigalLater, right_turn_signal? 100 : 1100); |
| | | break; |
| | | } |
| | | case SENSOR_FOG_LIGHT: { |