mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Implement Support for External Equipment / Emergency Button on Battery Emulator
This commit is contained in:
parent
81cd6780a3
commit
c1a262421b
7 changed files with 76 additions and 5 deletions
|
@ -135,6 +135,14 @@ unsigned long negativeStartTime = 0;
|
||||||
unsigned long timeSpentInFaultedMode = 0;
|
unsigned long timeSpentInFaultedMode = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef EQUIPMENT_STOP_BUTTON
|
||||||
|
volatile unsigned long equipment_button_press_time = 0; // Time when button is pressed
|
||||||
|
const unsigned long equipment_button_long_press_duration = 5000; // 5 seconds for long press
|
||||||
|
int equipment_button_lastState = LOW; // the previous state from the input pin
|
||||||
|
int equipment_button_currentState; // the current reading from the input pin
|
||||||
|
unsigned long equipment_button_pressedTime = 0;
|
||||||
|
unsigned long equipment_button_releasedTime = 0;
|
||||||
|
#endif
|
||||||
TaskHandle_t main_loop_task;
|
TaskHandle_t main_loop_task;
|
||||||
TaskHandle_t connectivity_loop_task;
|
TaskHandle_t connectivity_loop_task;
|
||||||
|
|
||||||
|
@ -163,6 +171,9 @@ void setup() {
|
||||||
|
|
||||||
init_battery();
|
init_battery();
|
||||||
|
|
||||||
|
#ifdef EQUIPMENT_STOP_BUTTON
|
||||||
|
init_equipment_stop_button();
|
||||||
|
#endif
|
||||||
// BOOT button at runtime is used as an input for various things
|
// BOOT button at runtime is used as an input for various things
|
||||||
pinMode(0, INPUT_PULLUP);
|
pinMode(0, INPUT_PULLUP);
|
||||||
|
|
||||||
|
@ -235,6 +246,8 @@ void core_loop(void* task_time_us) {
|
||||||
while (true) {
|
while (true) {
|
||||||
START_TIME_MEASUREMENT(all);
|
START_TIME_MEASUREMENT(all);
|
||||||
START_TIME_MEASUREMENT(comm);
|
START_TIME_MEASUREMENT(comm);
|
||||||
|
monitor_equipment_stop_button();
|
||||||
|
|
||||||
// Input, Runs as fast as possible
|
// Input, Runs as fast as possible
|
||||||
receive_can_native(); // Receive CAN messages from native CAN port
|
receive_can_native(); // Receive CAN messages from native CAN port
|
||||||
#ifdef CAN_FD
|
#ifdef CAN_FD
|
||||||
|
@ -546,6 +559,40 @@ void init_battery() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef EQUIPMENT_STOP_BUTTON
|
||||||
|
|
||||||
|
void monitor_equipment_stop_button() {
|
||||||
|
// read the state of the switch/button:
|
||||||
|
equipment_button_currentState = digitalRead(EQUIPMENT_STOP_PIN);
|
||||||
|
|
||||||
|
if (equipment_button_lastState == LOW && equipment_button_currentState == HIGH) // button is pressed
|
||||||
|
equipment_button_pressedTime = millis();
|
||||||
|
else if (equipment_button_lastState == HIGH && equipment_button_currentState == LOW) { // button is released
|
||||||
|
equipment_button_releasedTime = millis();
|
||||||
|
|
||||||
|
long pressDuration = equipment_button_releasedTime - equipment_button_pressedTime;
|
||||||
|
|
||||||
|
if (pressDuration < equipment_button_long_press_duration) {
|
||||||
|
// Short press detected, trigger emergency stop
|
||||||
|
setBatteryPause(true, true, true);
|
||||||
|
} else {
|
||||||
|
// Long press detected, reset equipment stop state
|
||||||
|
setBatteryPause(false, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the the last state
|
||||||
|
equipment_button_lastState = equipment_button_currentState;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_equipment_stop_button() {
|
||||||
|
|
||||||
|
//using external pulldown resistors
|
||||||
|
pinMode(EQUIPMENT_STOP_PIN, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CAN_FD
|
#ifdef CAN_FD
|
||||||
// Functions
|
// Functions
|
||||||
#ifdef DEBUG_CANFD_DATA
|
#ifdef DEBUG_CANFD_DATA
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
#define MDNSRESPONDER //Enable this line to enable MDNS, allows battery monitor te be found by .local address. Requires WEBSERVER to be enabled.
|
#define MDNSRESPONDER //Enable this line to enable MDNS, allows battery monitor te be found by .local address. Requires WEBSERVER to be enabled.
|
||||||
#define LOAD_SAVED_SETTINGS_ON_BOOT //Enable this line to read settings stored via the webserver on boot (overrides Wifi/battery settings set below)
|
#define LOAD_SAVED_SETTINGS_ON_BOOT //Enable this line to read settings stored via the webserver on boot (overrides Wifi/battery settings set below)
|
||||||
//#define FUNCTION_TIME_MEASUREMENT // Enable this to record execution times and present them in the web UI (WARNING, raises CPU load, do not use for production)
|
//#define FUNCTION_TIME_MEASUREMENT // Enable this to record execution times and present them in the web UI (WARNING, raises CPU load, do not use for production)
|
||||||
|
//#define EQUIPMENT_STOP_BUTTON // Enable this to have a emergengy/equipment stop button connected to board
|
||||||
|
|
||||||
/* MQTT options */
|
/* MQTT options */
|
||||||
// #define MQTT // Enable this line to enable MQTT
|
// #define MQTT // Enable this line to enable MQTT
|
||||||
|
|
|
@ -65,6 +65,9 @@
|
||||||
#define LED_PIN 4
|
#define LED_PIN 4
|
||||||
#define LED_MAX_BRIGHTNESS 40
|
#define LED_MAX_BRIGHTNESS 40
|
||||||
|
|
||||||
|
// Equipment stop pin
|
||||||
|
#define EQUIPMENT_STOP_PIN 35
|
||||||
|
|
||||||
/* ----- Error checks below, don't change (can't be moved to separate file) ----- */
|
/* ----- Error checks below, don't change (can't be moved to separate file) ----- */
|
||||||
#ifndef HW_CONFIGURED
|
#ifndef HW_CONFIGURED
|
||||||
#define HW_CONFIGURED
|
#define HW_CONFIGURED
|
||||||
|
@ -78,6 +81,18 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef EQUIPMENT_STOP_BUTTON
|
||||||
|
#ifdef DUAL_CAN
|
||||||
|
#error EQUIPMENT_STOP_BUTTON and DUAL_CAN cannot coexist due to overlapping GPIO pin usage
|
||||||
|
#endif
|
||||||
|
#ifdef CAN_FD
|
||||||
|
#error EQUIPMENT_STOP_BUTTON and CAN_FD cannot coexist due to overlapping GPIO pin usage
|
||||||
|
#endif
|
||||||
|
#ifdef CHADEMO_BATTERY
|
||||||
|
#error EQUIPMENT_STOP_BUTTON and CHADEMO_BATTERY cannot coexist due to overlapping GPIO pin usage
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef BMW_I3_BATTERY
|
#ifdef BMW_I3_BATTERY
|
||||||
#ifdef CONTACTOR_CONTROL
|
#ifdef CONTACTOR_CONTROL
|
||||||
#error GPIO PIN 25 cannot be used for both BMWi3 Wakeup and contactor control. Disable CONTACTOR_CONTROL
|
#error GPIO PIN 25 cannot be used for both BMWi3 Wakeup and contactor control. Disable CONTACTOR_CONTROL
|
||||||
|
|
|
@ -58,6 +58,9 @@ GPIOs on extra header
|
||||||
#define LED_PIN 4
|
#define LED_PIN 4
|
||||||
#define LED_MAX_BRIGHTNESS 40
|
#define LED_MAX_BRIGHTNESS 40
|
||||||
|
|
||||||
|
// Equipment stop pin
|
||||||
|
#define EQUIPMENT_STOP_PIN 2
|
||||||
|
|
||||||
/* ----- Error checks below, don't change (can't be moved to separate file) ----- */
|
/* ----- Error checks below, don't change (can't be moved to separate file) ----- */
|
||||||
#ifndef HW_CONFIGURED
|
#ifndef HW_CONFIGURED
|
||||||
#define HW_CONFIGURED
|
#define HW_CONFIGURED
|
||||||
|
|
|
@ -239,6 +239,7 @@ void setBatteryPause(bool pause_battery, bool pause_CAN, bool emergency_stop) {
|
||||||
/// @brief handle emulator pause status
|
/// @brief handle emulator pause status
|
||||||
/// @return true if CAN messages should be sent to battery, false if not
|
/// @return true if CAN messages should be sent to battery, false if not
|
||||||
void emulator_pause_state_send_CAN_battery() {
|
void emulator_pause_state_send_CAN_battery() {
|
||||||
|
bool previous_allowed_to_send_CAN = allowed_to_send_CAN;
|
||||||
|
|
||||||
if (emulator_pause_status == NORMAL) {
|
if (emulator_pause_status == NORMAL) {
|
||||||
allowed_to_send_CAN = true;
|
allowed_to_send_CAN = true;
|
||||||
|
@ -256,6 +257,14 @@ void emulator_pause_state_send_CAN_battery() {
|
||||||
}
|
}
|
||||||
|
|
||||||
allowed_to_send_CAN = (!emulator_pause_CAN_send_ON || emulator_pause_status == NORMAL);
|
allowed_to_send_CAN = (!emulator_pause_CAN_send_ON || emulator_pause_status == NORMAL);
|
||||||
|
|
||||||
|
if (previous_allowed_to_send_CAN && !allowed_to_send_CAN) {
|
||||||
|
//completely force stop the CAN communication
|
||||||
|
ESP32Can.CANStop();
|
||||||
|
} else if (!previous_allowed_to_send_CAN && allowed_to_send_CAN) {
|
||||||
|
//resume CAN communication
|
||||||
|
ESP32Can.CANInit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string get_emulator_pause_status() {
|
std::string get_emulator_pause_status() {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define SAFETY_H
|
#define SAFETY_H
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "../../lib/miwagner-ESP32-Arduino-CAN/ESP32CAN.h"
|
||||||
|
|
||||||
#define MAX_CAN_FAILURES 50
|
#define MAX_CAN_FAILURES 50
|
||||||
|
|
||||||
|
|
|
@ -933,9 +933,6 @@ void onOTAStart() {
|
||||||
clear_event(EVENT_OTA_UPDATE_TIMEOUT);
|
clear_event(EVENT_OTA_UPDATE_TIMEOUT);
|
||||||
ota_active = true;
|
ota_active = true;
|
||||||
|
|
||||||
//completely force stop the CAN communication
|
|
||||||
ESP32Can.CANStop();
|
|
||||||
|
|
||||||
ota_timeout_timer.reset();
|
ota_timeout_timer.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -968,8 +965,6 @@ void onOTAEnd(bool success) {
|
||||||
#endif // DEBUG_VIA_USB
|
#endif // DEBUG_VIA_USB
|
||||||
//try to Resume the battery pause and CAN communication
|
//try to Resume the battery pause and CAN communication
|
||||||
setBatteryPause(false, false);
|
setBatteryPause(false, false);
|
||||||
//resume CAN communication
|
|
||||||
ESP32Can.CANInit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue