567 lines
38 KiB
C
567 lines
38 KiB
C
/*
|
|
Copyright 2017 - 2018 Danny Bokma danny@diebie.nl
|
|
Copyright 2019 - 2020 Kevin Dionne kevin.dionne@ennoid.me
|
|
|
|
This file is part of the DieBieMS/ENNOID-BMS firmware.
|
|
|
|
The DieBieMS/ENNOID-BMS firmware is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
The DieBieMS/ENNOID-BMS firmware is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "modCommands.h"
|
|
|
|
// Private variables
|
|
static uint8_t modCommandsSendBuffer[PACKET_MAX_PL_LEN];
|
|
static void(*modCommandsSendFunction)(unsigned char *data, unsigned int len) = 0;
|
|
bool jumpBootloaderTrue;
|
|
modConfigGeneralConfigStructTypedef *modCommandsGeneralConfig;
|
|
modConfigGeneralConfigStructTypedef *modCommandsToBeSendConfig;
|
|
modConfigGeneralConfigStructTypedef modCommandsConfigStorage;
|
|
modPowerElectronicsPackStateTypedef *modCommandsGeneralState;
|
|
|
|
void modCommandsInit(modPowerElectronicsPackStateTypedef *generalState,modConfigGeneralConfigStructTypedef *configPointer) {
|
|
modCommandsGeneralConfig = configPointer;
|
|
modCommandsGeneralState = generalState;
|
|
jumpBootloaderTrue = false;
|
|
}
|
|
|
|
void modCommandsSetSendFunction(void(*func)(unsigned char *data, unsigned int len)) {
|
|
modCommandsSendFunction = func;
|
|
}
|
|
|
|
void modCommandsSendPacket(unsigned char *data, unsigned int len) {
|
|
if (modCommandsSendFunction) {
|
|
modCommandsSendFunction(data, len);
|
|
}
|
|
}
|
|
|
|
void modCommandsProcessPacket(unsigned char *data, unsigned int len) {
|
|
if (!len) {
|
|
return;
|
|
}
|
|
|
|
uint64_t RawSerial;
|
|
uint32_t* RawSerialPtr;
|
|
float RawSerialPtrfl;
|
|
|
|
|
|
COMM_PACKET_ID packet_id;
|
|
int32_t ind = 0;
|
|
uint16_t flash_res;
|
|
uint32_t new_app_offset;
|
|
uint32_t delayTick;
|
|
uint8_t cellPointer;
|
|
uint8_t auxPointer;
|
|
uint8_t expPointer;
|
|
uint8_t i;
|
|
|
|
packet_id = (COMM_PACKET_ID) data[0];
|
|
data++;
|
|
len--;
|
|
|
|
|
|
switch (packet_id) {
|
|
case COMM_FW_VERSION:
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_FW_VERSION;
|
|
modCommandsSendBuffer[ind++] = FW_VERSION_MAJOR;
|
|
modCommandsSendBuffer[ind++] = FW_VERSION_MINOR;
|
|
strcpy((char*)(modCommandsSendBuffer + ind), HW_NAME);
|
|
ind += strlen(HW_NAME) + 1;
|
|
memcpy(modCommandsSendBuffer + ind, STM32_UUID, 12);
|
|
ind += 12;
|
|
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
case COMM_JUMP_TO_BOOTLOADER:
|
|
jumpBootloaderTrue = true;
|
|
delayTick = HAL_GetTick();
|
|
break;
|
|
case COMM_ERASE_NEW_APP:
|
|
ind = 0;
|
|
flash_res = modFlashEraseNewAppData(libBufferGet_uint32(data, &ind));
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_ERASE_NEW_APP;
|
|
modCommandsSendBuffer[ind++] = flash_res == HAL_OK ? true : false;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
case COMM_WRITE_NEW_APP_DATA:
|
|
ind = 0;
|
|
new_app_offset = libBufferGet_uint32(data, &ind);
|
|
flash_res = modFlashWriteNewAppData(new_app_offset, data + ind, len - ind);
|
|
//flash_res = 0;
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_WRITE_NEW_APP_DATA;
|
|
modCommandsSendBuffer[ind++] = flash_res == HAL_OK ? 1 : 0;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
case COMM_GET_VALUES:
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_GET_VALUES;
|
|
|
|
libBufferAppend_float32(modCommandsSendBuffer, modCommandsGeneralState->packVoltage, 1e3, &ind);
|
|
libBufferAppend_float32(modCommandsSendBuffer, modCommandsGeneralState->packCurrent, 1e3, &ind);
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, (uint8_t)round(modCommandsGeneralState->SoC), &ind);
|
|
|
|
libBufferAppend_float32(modCommandsSendBuffer, modCommandsGeneralState->cellVoltageHigh, 1e3, &ind);
|
|
libBufferAppend_float32(modCommandsSendBuffer, modCommandsGeneralState->cellVoltageAverage, 1e3, &ind);
|
|
libBufferAppend_float32(modCommandsSendBuffer, modCommandsGeneralState->cellVoltageLow, 1e3, &ind);
|
|
libBufferAppend_float32(modCommandsSendBuffer, modCommandsGeneralState->cellVoltageMisMatch, 1e3, &ind);
|
|
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->loCurrentLoadVoltage, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->loCurrentLoadCurrent, 1e1, &ind);
|
|
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->chargerVoltage, 1e1, &ind);
|
|
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->tempBatteryHigh, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->tempBatteryAverage, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->tempBatteryLow, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->tempBMSHigh, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->tempBMSAverage, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->tempBMSLow, 1e1, &ind);
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->humidity, 1e1, &ind);
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, (uint8_t)modCommandsGeneralState->operationalState, &ind);
|
|
libBufferAppend_uint8(modCommandsSendBuffer, (uint8_t)modCommandsGeneralState->chargeBalanceActive, &ind); // Indicator for charging
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, (uint8_t)modCommandsGeneralState->faultState, &ind);
|
|
|
|
modCommandsSendBuffer[ind++] = modCommandsGeneralConfig->CANID;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
|
|
break;
|
|
case COMM_GET_BMS_CELLS:
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_GET_BMS_CELLS;
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsGeneralConfig->noOfCellsSeries*modCommandsGeneralConfig->noOfParallelModules, &ind); // Cell count
|
|
for(cellPointer = 0; cellPointer < modCommandsGeneralConfig->noOfCellsSeries*modCommandsGeneralConfig->noOfParallelModules; cellPointer++){
|
|
if(modCommandsGeneralState->cellVoltagesIndividual[cellPointer].cellBleedActive)
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->cellVoltagesIndividual[cellPointer].cellVoltage*-1.0f, 1e3, &ind); // Individual cells
|
|
else
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->cellVoltagesIndividual[cellPointer].cellVoltage, 1e3, &ind); // Individual cells
|
|
}
|
|
|
|
modCommandsSendBuffer[ind++] = modCommandsGeneralConfig->CANID;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
case COMM_GET_BMS_AUX:
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_GET_BMS_AUX;
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsGeneralConfig->cellMonitorICCount*modCommandsGeneralConfig->noOfTempSensorPerModule, &ind); // Total aux count
|
|
for(auxPointer = 0; auxPointer < modCommandsGeneralConfig->cellMonitorICCount*modCommandsGeneralConfig->noOfTempSensorPerModule; auxPointer++){
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->auxVoltagesIndividual[auxPointer].auxVoltage, 1e1, &ind); // Individual aux
|
|
}
|
|
|
|
modCommandsSendBuffer[ind++] = modCommandsGeneralConfig->CANID;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
case COMM_GET_BMS_EXP_TEMP:
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = COMM_GET_BMS_EXP_TEMP;
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsGeneralConfig->noOfExpansionBoard*modCommandsGeneralConfig->noOfTempSensorPerExpansionBoard, &ind); // Total aux count
|
|
for(expPointer = 0; expPointer < modCommandsGeneralConfig->noOfExpansionBoard*modCommandsGeneralConfig->noOfTempSensorPerExpansionBoard; expPointer++){
|
|
libBufferAppend_float16(modCommandsSendBuffer, modCommandsGeneralState->expVoltagesIndividual[expPointer].expVoltage, 1e1, &ind); // Individual aux
|
|
}
|
|
|
|
modCommandsSendBuffer[ind++] = modCommandsGeneralConfig->CANID;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
case COMM_SET_MCCONF:
|
|
ind = 0;
|
|
modCommandsGeneralConfig->noOfCellsSeries = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->noOfCellsParallel = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->noOfParallelModules = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->batteryCapacity = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellHardUnderVoltage = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellHardOverVoltage = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellLCSoftUnderVoltage = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellSoftOverVoltage = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellBalanceDifferenceThreshold = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellBalanceStart = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellBalanceAllTime = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->cellThrottleUpperStart = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellThrottleLowerStart = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellThrottleUpperMargin = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->cellThrottleLowerMargin = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->packVoltageDataSource = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->packCurrentDataSource = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->buzzerSignalSource = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->buzzerSignalPersistant = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->shuntLCFactor = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->voltageLCFactor = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->voltageLCOffset = libBufferGet_int16(data,&ind); // 2
|
|
modCommandsGeneralConfig->loadVoltageFactor = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->loadVoltageOffset = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->chargerVoltageFactor = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->chargerVoltageOffset = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->throttleChargeIncreaseRate = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->throttleDisChargeIncreaseRate = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->cellBalanceUpdateInterval = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->maxSimultaneousDischargingCells = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->timeoutDischargeRetry = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->hysteresisDischarge = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->timeoutChargeRetry = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->hysteresisCharge = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->timeoutChargeCompleted = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->timeoutChargingCompletedMinimalMismatch = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->maxMismatchThreshold = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->chargerEnabledThreshold = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->timeoutChargerDisconnected = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->minimalPrechargePercentage = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->timeoutLCPreCharge = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->maxAllowedCurrent = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBattDischargingMax = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBattDischargingMin = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBattChargingMax = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBattChargingMin = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBattCoolingMax = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBattCoolingMin = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBMSMax = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->allowedTempBMSMin = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->displayTimeoutBatteryDead = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->displayTimeoutBatteryError = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->displayTimeoutBatteryErrorPreCharge = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->displayTimeoutSplashScreen = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->displayStyle = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->maxUnderAndOverVoltageErrorCount = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->maxUnderAndOverTemperatureErrorCount = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->notUsedCurrentThreshold = libBufferGet_float32_auto(data,&ind); // 4
|
|
modCommandsGeneralConfig->notUsedTimeout = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->stateOfChargeStoreInterval = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->stateOfChargeMethod = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->CANID = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->CANIDStyle = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->canBusSpeed = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->emitStatusOverCAN = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->emitStatusProtocol = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->tempEnableMaskBMS = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->tempEnableMaskBattery = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->tempEnableMaskExpansion = libBufferGet_uint32(data,&ind); // 4
|
|
modCommandsGeneralConfig->noOfTempSensorPerModule = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->noOfExpansionBoard = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->noOfTempSensorPerExpansionBoard= libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->LCUseDischarge = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->LCUsePrecharge = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->allowChargingDuringDischarge = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->allowForceOn = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->pulseToggleButton = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->useCANSafetyInput = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->useCANDelayedPowerDown = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->NTCTopResistor[modConfigNTCGroupLTCExt] = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->NTC25DegResistance[modConfigNTCGroupLTCExt] = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->NTCBetaFactor[modConfigNTCGroupLTCExt] = libBufferGet_uint16(data,&ind);// 2
|
|
modCommandsGeneralConfig->NTCTopResistor[modConfigNTCGroupMasterPCB] = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->NTC25DegResistance[modConfigNTCGroupMasterPCB] = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->NTCBetaFactor[modConfigNTCGroupMasterPCB] = libBufferGet_uint16(data,&ind);// 2
|
|
modCommandsGeneralConfig->NTCTopResistor[modConfigNTCGroupExp] = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->NTC25DegResistance[modConfigNTCGroupExp] = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->NTCBetaFactor[modConfigNTCGroupExp] = libBufferGet_uint16(data,&ind);// 2
|
|
modCommandsGeneralConfig->cellMonitorType = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->cellMonitorICCount = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->externalEnableOperationalState = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->chargeEnableOperationalState = libBufferGet_uint8(data,&ind); // 1
|
|
modCommandsGeneralConfig->powerDownDelay = libBufferGet_uint32(data,&ind);// 4
|
|
modCommandsGeneralConfig->humidityICType = libBufferGet_uint8(data,&ind); // 1
|
|
|
|
modCommandsGeneralConfig->chargeBatteryOutputChecked = libBufferGet_uint8(data, &ind);
|
|
modCommandsGeneralConfig->brushOrShuntOutputChecked = libBufferGet_uint8(data, &ind);
|
|
modCommandsGeneralConfig->brushOrShuntMode = libBufferGet_uint8(data, &ind);
|
|
modCommandsGeneralConfig->brushUsageSocThreshold = libBufferGet_uint16(data, &ind);
|
|
modCommandsGeneralConfig->shuntChargingContactorDelay = libBufferGet_uint16(data, &ind);
|
|
modCommandsGeneralConfig->coolingOutputChecked = libBufferGet_uint8(data, &ind);
|
|
modCommandsGeneralConfig->coolingStartThreshold = libBufferGet_int16(data, &ind);
|
|
modCommandsGeneralConfig->coolingStopThreshold = libBufferGet_int16(data, &ind);
|
|
modCommandsGeneralConfig->heatingOutputChecked = libBufferGet_uint8(data, &ind);
|
|
modCommandsGeneralConfig->heatingStartThreshold = libBufferGet_int16(data, &ind);
|
|
modCommandsGeneralConfig->heatingStopThreshold = libBufferGet_int16(data, &ind);
|
|
|
|
modCommandsGeneralConfig->floatCurrentK1 = libBufferGet_float32_auto(data,&ind);
|
|
modCommandsGeneralConfig->floatCurrentK2 = libBufferGet_float32_auto(data,&ind);
|
|
|
|
// RawSerialPtr = modCommandsGeneralConfig->displayTimeoutBatteryDead;
|
|
// RawSerial = *RawSerialPtr;
|
|
// RawSerial = RawSerial<<32;
|
|
// RawSerialPtr = modCommandsGeneralConfig->displayTimeoutBatteryError;
|
|
// RawSerial+=*RawSerialPtr;
|
|
|
|
RawSerialPtrfl = modCommandsGeneralConfig->notUsedCurrentThreshold;
|
|
RawSerial = ceil(RawSerialPtrfl);
|
|
modCommandsGeneralConfig->serialNumber = RawSerial;
|
|
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = packet_id;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
|
|
modconfigHardwareLimitsApply(modCommandsGeneralConfig);
|
|
|
|
break;
|
|
case COMM_GET_MCCONF:
|
|
case COMM_GET_MCCONF_DEFAULT:
|
|
if(packet_id == COMM_GET_MCCONF_DEFAULT){
|
|
modConfigLoadDefaultConfig(&modCommandsConfigStorage);
|
|
modCommandsToBeSendConfig = &modCommandsConfigStorage;
|
|
}else{
|
|
modCommandsToBeSendConfig = modCommandsGeneralConfig;
|
|
}
|
|
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = packet_id;
|
|
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->noOfCellsSeries ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->noOfCellsParallel ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->noOfParallelModules ,&ind); // 1
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->batteryCapacity ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellHardUnderVoltage ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellHardOverVoltage ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellLCSoftUnderVoltage ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellSoftOverVoltage ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellBalanceDifferenceThreshold ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellBalanceStart ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->cellBalanceAllTime ,&ind); // 1
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellThrottleUpperStart ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellThrottleLowerStart ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellThrottleUpperMargin ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->cellThrottleLowerMargin ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->packVoltageDataSource ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->packCurrentDataSource ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->buzzerSignalSource ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->buzzerSignalPersistant ,&ind); // 1
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->shuntLCFactor ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->voltageLCFactor ,&ind); // 4
|
|
libBufferAppend_int16( modCommandsSendBuffer,modCommandsToBeSendConfig->voltageLCOffset ,&ind); // 2
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->loadVoltageFactor ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->loadVoltageOffset ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->chargerVoltageFactor ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->chargerVoltageOffset ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->throttleChargeIncreaseRate ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->throttleDisChargeIncreaseRate ,&ind); // 1
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->cellBalanceUpdateInterval ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->maxSimultaneousDischargingCells ,&ind); // 1
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->timeoutDischargeRetry ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->hysteresisDischarge ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->timeoutChargeRetry ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->hysteresisCharge ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->timeoutChargeCompleted ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->timeoutChargingCompletedMinimalMismatch,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->maxMismatchThreshold ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->chargerEnabledThreshold ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->timeoutChargerDisconnected ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->minimalPrechargePercentage ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->timeoutLCPreCharge ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->maxAllowedCurrent ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBattDischargingMax ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBattDischargingMin ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBattChargingMax ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBattChargingMin ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBattCoolingMax ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBattCoolingMin ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBMSMax ,&ind); // 4
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->allowedTempBMSMin ,&ind); // 4
|
|
|
|
//libBufferAppend_uint64( modCommandsSendBuffer,modCommandsToBeSendConfig->serialNumber , &ind); // 8
|
|
RawSerial=modCommandsToBeSendConfig->serialNumber;
|
|
// modCommandsToBeSendConfig->displayTimeoutBatteryDead = RawSerial;
|
|
// modCommandsToBeSendConfig->displayTimeoutBatteryError = RawSerial<<32;
|
|
|
|
modCommandsToBeSendConfig->notUsedCurrentThreshold = (float) RawSerial;
|
|
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->displayTimeoutBatteryDead ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->displayTimeoutBatteryError ,&ind); // 4
|
|
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->displayTimeoutBatteryErrorPreCharge,&ind);//4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->displayTimeoutSplashScreen ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->displayStyle ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->maxUnderAndOverVoltageErrorCount,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->maxUnderAndOverTemperatureErrorCount,&ind); // 1
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->notUsedCurrentThreshold ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->notUsedTimeout ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->stateOfChargeStoreInterval ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->stateOfChargeMethod ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->CANID ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->CANIDStyle ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->canBusSpeed ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->emitStatusOverCAN ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->emitStatusProtocol ,&ind); // 1
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->tempEnableMaskBMS ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->tempEnableMaskBattery ,&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->tempEnableMaskExpansion ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->noOfTempSensorPerModule ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->noOfExpansionBoard ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->noOfTempSensorPerExpansionBoard ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->LCUseDischarge ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->LCUsePrecharge ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->allowChargingDuringDischarge ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->allowForceOn ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->pulseToggleButton ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->useCANSafetyInput ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->useCANDelayedPowerDown ,&ind); // 1
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->NTCTopResistor[modConfigNTCGroupLTCExt],&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->NTC25DegResistance[modConfigNTCGroupLTCExt],&ind); // 4
|
|
libBufferAppend_uint16( modCommandsSendBuffer,modCommandsToBeSendConfig->NTCBetaFactor[modConfigNTCGroupLTCExt],&ind); // 2
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->NTCTopResistor[modConfigNTCGroupMasterPCB],&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->NTC25DegResistance[modConfigNTCGroupMasterPCB],&ind); // 4
|
|
libBufferAppend_uint16( modCommandsSendBuffer,modCommandsToBeSendConfig->NTCBetaFactor[modConfigNTCGroupMasterPCB],&ind); // 2
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->NTCTopResistor[modConfigNTCGroupExp],&ind); // 4
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->NTC25DegResistance[modConfigNTCGroupExp],&ind); // 4
|
|
libBufferAppend_uint16( modCommandsSendBuffer,modCommandsToBeSendConfig->NTCBetaFactor[modConfigNTCGroupExp],&ind); // 2
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->cellMonitorType ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->cellMonitorICCount ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->externalEnableOperationalState ,&ind); // 1
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->chargeEnableOperationalState ,&ind); // 1
|
|
libBufferAppend_uint32( modCommandsSendBuffer,modCommandsToBeSendConfig->powerDownDelay ,&ind); // 4
|
|
libBufferAppend_uint8( modCommandsSendBuffer,modCommandsToBeSendConfig->humidityICType ,&ind); // 1
|
|
//libBufferAppend_uint64( modCommandsSendBuffer,modCommandsToBeSendConfig->serialNumber , &ind); // 8
|
|
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsToBeSendConfig->chargeBatteryOutputChecked, &ind);
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsToBeSendConfig->brushOrShuntOutputChecked, &ind);
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsToBeSendConfig->brushOrShuntMode, &ind);
|
|
libBufferAppend_uint16(modCommandsSendBuffer, modCommandsToBeSendConfig->brushUsageSocThreshold, &ind);
|
|
libBufferAppend_uint16(modCommandsSendBuffer, modCommandsToBeSendConfig->shuntChargingContactorDelay, &ind);
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsToBeSendConfig->coolingOutputChecked, &ind);
|
|
libBufferAppend_int16(modCommandsSendBuffer, modCommandsToBeSendConfig->coolingStartThreshold, &ind);
|
|
libBufferAppend_int16(modCommandsSendBuffer, modCommandsToBeSendConfig->coolingStopThreshold, &ind);
|
|
libBufferAppend_uint8(modCommandsSendBuffer, modCommandsToBeSendConfig->heatingOutputChecked, &ind);
|
|
libBufferAppend_int16(modCommandsSendBuffer, modCommandsToBeSendConfig->heatingStartThreshold, &ind);
|
|
libBufferAppend_int16(modCommandsSendBuffer, modCommandsToBeSendConfig->heatingStopThreshold, &ind);
|
|
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->floatCurrentK1 ,&ind);
|
|
libBufferAppend_float32_auto( modCommandsSendBuffer,modCommandsToBeSendConfig->floatCurrentK2 ,&ind);
|
|
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
|
|
case COMM_GET_GSM_DATA:
|
|
case COMM_GET_GSM_DEFAULT_DATA:
|
|
if(packet_id == COMM_GET_GSM_DEFAULT_DATA){
|
|
modConfigLoadDefaultConfig(&modCommandsConfigStorage);
|
|
modCommandsToBeSendConfig = &modCommandsConfigStorage;
|
|
}else{
|
|
modCommandsToBeSendConfig = modCommandsGeneralConfig;
|
|
}
|
|
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = packet_id;
|
|
|
|
i=0;
|
|
while (i<250){
|
|
libBufferAppend_uint8(modCommandsSendBuffer,modCommandsToBeSendConfig->Domain_URL[i],&ind);
|
|
i++;
|
|
}
|
|
i=0;
|
|
while (i<250){
|
|
libBufferAppend_uint8(modCommandsSendBuffer,modCommandsToBeSendConfig->Domain_URL_Event[i],&ind);
|
|
i++;
|
|
}
|
|
i=0;
|
|
while (i<50){
|
|
libBufferAppend_uint8(modCommandsSendBuffer,modCommandsToBeSendConfig->GSM_APN[i],&ind);
|
|
i++;
|
|
}
|
|
i=0;
|
|
while (i<50){
|
|
libBufferAppend_uint8(modCommandsSendBuffer,modCommandsToBeSendConfig->GSM_USER[i],&ind);
|
|
i++;
|
|
}
|
|
i=0;
|
|
while (i<50){
|
|
libBufferAppend_uint8(modCommandsSendBuffer,modCommandsToBeSendConfig->GSM_PWD[i],&ind);
|
|
i++;
|
|
}
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
|
|
break;
|
|
case COMM_SET_GSM_DATA:
|
|
ind = 0;
|
|
for (i=0;i<250;i++){
|
|
modCommandsGeneralConfig->Domain_URL[i] = libBufferGet_uint8(data,&ind); // 250
|
|
}
|
|
for (i=0;i<250;i++){
|
|
modCommandsGeneralConfig->Domain_URL_Event[i] = libBufferGet_uint8(data,&ind); // 250
|
|
}
|
|
for (i=0;i<50;i++){
|
|
modCommandsGeneralConfig->GSM_APN[i] = libBufferGet_uint8(data,&ind); // 50
|
|
}
|
|
for (i=0;i<50;i++){
|
|
modCommandsGeneralConfig->GSM_USER[i] = libBufferGet_uint8(data,&ind); // 50
|
|
}
|
|
for (i=0;i<50;i++){
|
|
modCommandsGeneralConfig->GSM_PWD[i] = libBufferGet_uint8(data,&ind); // 50
|
|
}
|
|
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = packet_id;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
UpdateGSMParamsFromConfig();
|
|
//SetParametersFromConfig
|
|
|
|
break;
|
|
case COMM_TERMINAL_CMD:
|
|
data[len] = '\0';
|
|
modTerminalProcessString((char*)data);
|
|
break;
|
|
case COMM_REBOOT:
|
|
modCommandsJumpToMainApplication();
|
|
break;
|
|
case COMM_ALIVE:
|
|
break;
|
|
case COMM_FORWARD_CAN:
|
|
//ni modCANSendBuffer(data[0], data + 1, len - 1, false);
|
|
break;
|
|
case COMM_STORE_BMS_CONF:
|
|
modConfigStoreConfig();
|
|
|
|
ind = 0;
|
|
modCommandsSendBuffer[ind++] = packet_id;
|
|
modCommandsSendPacket(modCommandsSendBuffer, ind);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if(modDelayTick1ms(&delayTick,1000) && jumpBootloaderTrue) jumpToBootLoader();
|
|
}
|
|
|
|
void modCommandsPrintf(const char* format, ...) {
|
|
va_list arg;
|
|
va_start (arg, format);
|
|
int len;
|
|
static char print_buffer[255];
|
|
|
|
print_buffer[0] = COMM_PRINT;
|
|
len = vsnprintf(print_buffer+1, 254, format, arg);
|
|
va_end (arg);
|
|
|
|
if(len > 0) {
|
|
modCommandsSendPacket((unsigned char*)print_buffer, (len<254)? len+1: 255);
|
|
}
|
|
}
|
|
|
|
|
|
void modCommandsJumpToMainApplication(void) {
|
|
NVIC_SystemReset();
|
|
}
|
|
|
|
//void BufferCharStringSend(char *modCommandsSource, uint8_t NumberOfBytes){
|
|
// char SourceBuf[NumberOfBytes];
|
|
//
|
|
// *SourceBuf = modCommandsSource;
|
|
//
|
|
// while (Number0fBytes>0){
|
|
// libBufferAppend_uint8(modCommandsSendBuffer,SourceBuf[Number0fBytes],&ind);
|
|
// }
|
|
//}
|