mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Add jaguar to build system
This commit is contained in:
parent
32e86ea00c
commit
c4e5748312
3 changed files with 90 additions and 66 deletions
1
.github/workflows/compile-all-batteries.yml
vendored
1
.github/workflows/compile-all-batteries.yml
vendored
|
@ -37,6 +37,7 @@ jobs:
|
|||
- BYD_ATTO_3_BATTERY
|
||||
- CHADEMO_BATTERY
|
||||
- IMIEV_CZERO_ION_BATTERY
|
||||
- JAGUAR_IPACE_BATTERY
|
||||
- KIA_HYUNDAI_64_BATTERY
|
||||
- KIA_HYUNDAI_HYBRID_BATTERY
|
||||
- NISSAN_LEAF_BATTERY
|
||||
|
|
|
@ -207,7 +207,6 @@ dd09
|
|||
|
||||
*/
|
||||
|
||||
|
||||
/* TODO: Actually use a proper keepalive message */
|
||||
CAN_frame_t ipace_keep_alive = {.FIR = {.B =
|
||||
{
|
||||
|
@ -217,7 +216,6 @@ CAN_frame_t ipace_keep_alive = {.FIR = {.B =
|
|||
.MsgID = 0x063,
|
||||
.data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
||||
|
||||
|
||||
CAN_frame_t ipace_7e4 = {.FIR = {.B =
|
||||
{
|
||||
.DLC = 8,
|
||||
|
@ -226,7 +224,6 @@ CAN_frame_t ipace_7e4 = {.FIR = {.B =
|
|||
.MsgID = 0x7e4,
|
||||
.data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
||||
|
||||
|
||||
void print_units(char* header, int value, char* units) {
|
||||
Serial.print(header);
|
||||
Serial.print(value);
|
||||
|
@ -235,39 +232,36 @@ void print_units(char* header, int value, char* units) {
|
|||
|
||||
void update_values_battery() { /* This function puts fake values onto the parameters sent towards the inverter */
|
||||
|
||||
datalayer.battery.status.real_soc = 5000; // 50.00%
|
||||
datalayer.battery.status.real_soc = 5000; //TODO: Map
|
||||
|
||||
datalayer.battery.status.soh_pptt = 9900; // 99.00%
|
||||
datalayer.battery.status.soh_pptt = 9900; //TODO: Map
|
||||
|
||||
//datalayer.battery.status.voltage_dV = 3700; // 370.0V , value set in startup in .ino file, editable via webUI
|
||||
datalayer.battery.status.voltage_dV = 3700; //TODO: Map
|
||||
|
||||
datalayer.battery.status.current_dA = 0; // 0 A
|
||||
datalayer.battery.status.current_dA = 0; //TODO: Map
|
||||
|
||||
datalayer.battery.info.total_capacity_Wh = 30000; // 30kWh
|
||||
datalayer.battery.info.total_capacity_Wh = 85000; // 85kWh usable
|
||||
|
||||
datalayer.battery.status.remaining_capacity_Wh = 15000; // 15kWh
|
||||
|
||||
datalayer.battery.status.cell_max_voltage_mV = 3596;
|
||||
datalayer.battery.status.cell_max_voltage_mV = 3596; //TODO: Map
|
||||
|
||||
datalayer.battery.status.cell_min_voltage_mV = 3500;
|
||||
datalayer.battery.status.cell_min_voltage_mV = 3500; //TODO: Map
|
||||
|
||||
datalayer.battery.status.active_power_W = 0; // 0W
|
||||
datalayer.battery.status.active_power_W = 0; //TODO: Map
|
||||
|
||||
datalayer.battery.status.temperature_min_dC = 50; // 5.0*C
|
||||
datalayer.battery.status.temperature_min_dC = 50; //TODO: Map
|
||||
|
||||
datalayer.battery.status.temperature_max_dC = 60; // 6.0*C
|
||||
datalayer.battery.status.temperature_max_dC = 60; //TODO: Map
|
||||
|
||||
datalayer.battery.status.max_discharge_power_W = 5000; // 5kW
|
||||
datalayer.battery.status.max_discharge_power_W = 5000; //TODO: Map
|
||||
|
||||
datalayer.battery.status.max_charge_power_W = 5000; // 5kW
|
||||
datalayer.battery.status.max_charge_power_W = 5000; //TODO: Map
|
||||
|
||||
for (int i = 0; i < 97; ++i) {
|
||||
for (int i = 0; i < 107; ++i) {
|
||||
datalayer.battery.status.cell_voltages_mV[i] = 3500 + i;
|
||||
}
|
||||
|
||||
//Fake that we get CAN messages
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
|
||||
/*Finally print out values to serial if configured to do so*/
|
||||
#ifdef DEBUG_VIA_USB
|
||||
Serial.println("FAKE Values going to inverter");
|
||||
|
@ -285,22 +279,57 @@ void update_values_battery() { /* This function puts fake values onto the parame
|
|||
}
|
||||
|
||||
void receive_can_battery(CAN_frame_t rx_frame) {
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
|
||||
// Do not log noisy startup messages - there are many !
|
||||
if (rx_frame.MsgID == 0 && rx_frame.FIR.B.DLC == 8 &&
|
||||
rx_frame.data.u8[0] == 0 &&
|
||||
rx_frame.data.u8[1] == 0 &&
|
||||
rx_frame.data.u8[2] == 0 &&
|
||||
rx_frame.data.u8[3] == 0 &&
|
||||
rx_frame.data.u8[4] == 0 &&
|
||||
rx_frame.data.u8[5] == 0 &&
|
||||
rx_frame.data.u8[6] == 0x80 &&
|
||||
rx_frame.data.u8[7] == 0) {
|
||||
if (rx_frame.MsgID == 0 && rx_frame.FIR.B.DLC == 8 && rx_frame.data.u8[0] == 0 && rx_frame.data.u8[1] == 0 &&
|
||||
rx_frame.data.u8[2] == 0 && rx_frame.data.u8[3] == 0 && rx_frame.data.u8[4] == 0 && rx_frame.data.u8[5] == 0 &&
|
||||
rx_frame.data.u8[6] == 0x80 && rx_frame.data.u8[7] == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Discard non-interesting can messages
|
||||
switch (rx_frame.MsgID) { // These messages are periodically transmitted by the battery
|
||||
case 0x080:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
break;
|
||||
case 0x100:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
break;
|
||||
case 0x102:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
break;
|
||||
case 0x104:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
break;
|
||||
case 0x10A:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
break;
|
||||
case 0x198:
|
||||
break;
|
||||
case 0x1C4:
|
||||
break;
|
||||
case 0x220:
|
||||
break;
|
||||
case 0x222:
|
||||
break;
|
||||
case 0x248:
|
||||
break;
|
||||
case 0x308:
|
||||
break;
|
||||
case 0x424:
|
||||
break;
|
||||
case 0x448:
|
||||
break;
|
||||
case 0x449:
|
||||
break;
|
||||
case 0x464:
|
||||
break;
|
||||
case 0x522:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Discard non-interesting can messages so they do not get logged via serial
|
||||
if (rx_frame.MsgID < 0x500) {
|
||||
return;
|
||||
}
|
||||
|
@ -340,11 +369,9 @@ void send_can_battery() {
|
|||
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
||||
previousMillis500 = currentMillis;
|
||||
|
||||
|
||||
CAN_frame_t msg;
|
||||
int err;
|
||||
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
|
||||
|
@ -368,8 +395,6 @@ void send_can_battery() {
|
|||
// car response: 7EC 11 fa 59 04 c0 64 88 28
|
||||
// response:
|
||||
|
||||
|
||||
|
||||
msg = {.FIR = {.B =
|
||||
{
|
||||
.DLC = 8,
|
||||
|
@ -389,17 +414,14 @@ void send_can_battery() {
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
// TODO -1 is an error !!
|
||||
|
||||
Serial.print("sending 7e4 err:");
|
||||
Serial.println(err);
|
||||
|
||||
|
||||
Serial.print("sending 7e4_2 err:");
|
||||
Serial.println(err);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
on car this is ... 10x messages of 0x522 01 12 0 3f 0 0 0 0
|
||||
|
@ -418,19 +440,17 @@ on car this is ... 10x messages of 0x522 01 12 0 3f 0 0 0 0
|
|||
|
||||
|
||||
*/
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void setup_battery(void) { // Performs one time setup at startup
|
||||
#ifdef DEBUG_VIA_USB
|
||||
Serial.println("Jaguar iPace TODOkWh battery selected"); // TODO add kWh
|
||||
Serial.println("Jaguar iPace 90kWh battery selected");
|
||||
#endif
|
||||
|
||||
// TODO check values
|
||||
datalayer.battery.info.max_design_voltage_dV =
|
||||
4040; // 404.4V, over this, charging is not possible (goes into forced discharge)
|
||||
datalayer.battery.info.min_design_voltage_dV = 2450; // 245.0V under this, discharging further is disabled
|
||||
datalayer.battery.info.number_of_cells = 108;
|
||||
datalayer.battery.info.max_design_voltage_dV = 4546;
|
||||
datalayer.battery.info.min_design_voltage_dV = 3230;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -459,6 +459,9 @@ String processor(const String& var) {
|
|||
#ifdef IMIEV_CZERO_ION_BATTERY
|
||||
content += "I-Miev / C-Zero / Ion Triplet";
|
||||
#endif
|
||||
#ifdef JAGUAR_IPACE_BATTERY
|
||||
content += "Jaguar I-PACE";
|
||||
#endif
|
||||
#ifdef KIA_HYUNDAI_64_BATTERY
|
||||
content += "Kia/Hyundai 64kWh";
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue