/**
******************************************************************************
* File Name : modbus_lcd.c
* Description : This file provides code for the configuration
* of modbus for lcd comm.
******************************************************************************
* @attention
*
*
© Copyright (c) 2019 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include
#include "modbus.h"
#include "device_param.h"
#include "malloc.h"
#include "temp.h"
#include "asutil.h"
#include "brtc.h"
#include "can_comm.h"
#include "dflash_sf1.h"
#include "date_calc.h"
#include "io.h"
/* Defines -------------------------------------------------------------------*/
/* Type declarations ---------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
s16 GetPackRegisterToLcd(u16 reg_addr, u8 dno);
/* Private functions ---------------------------------------------------------*/
s16 GetRegisterToLcd(u16 reg_addr)
{
s16 result = 0;
if (reg_addr >= 0xA000) {
// Pack 10 data
result = GetPackRegisterToLcd(reg_addr, 9);
} else if (reg_addr >= 0x9000) {
// Pack 9 data
result = GetPackRegisterToLcd(reg_addr, 8);
} else if (reg_addr >= 0x8000) {
// Pack 8 data
result = GetPackRegisterToLcd(reg_addr, 7);
} else if (reg_addr >= 0x7000) {
// Pack 7 data
result = GetPackRegisterToLcd(reg_addr, 6);
} else if (reg_addr >= 0x6000) {
// Pack 6 data
result = GetPackRegisterToLcd(reg_addr, 5);
} else if (reg_addr >= 0x5000) {
// Pack 5 data
result = GetPackRegisterToLcd(reg_addr, 4);
} else if (reg_addr >= 0x4000) {
// Pack 4 data
result = GetPackRegisterToLcd(reg_addr, 3);
} else if (reg_addr >= 0x3000) {
// Pack 3 data
result = GetPackRegisterToLcd(reg_addr, 2);
} else if (reg_addr >= 0x2000) {
// Pack 2 data
result = GetPackRegisterToLcd(reg_addr, 1);
} else if (reg_addr >= 0x1000) {
// Pack 1 data
result = GetPackRegisterToLcd(reg_addr, 0);
}
return result;
}
s16 FindMaxTemp(void)
{
u16 i;
s16 result = 0;
for (i = 0; i < DEVICE_MAX_TEMP; i++)
{
if (i == 0) result = device_value.Temp.temperature[i];
else
{
if (result < device_value.Temp.temperature[i])
result = device_value.Temp.temperature[i];
}
}
return result;
}
s16 GetMaxTemperature(void)
{
u16 i;
s16 result = 0;
for (i = 0; i < DEVICE_MAX_TEMP; i++)
{
if (i == 0) result = device_value.Temp.temperature[i];
else
{
if (result < device_value.Temp.temperature[i])
result = device_value.Temp.temperature[i];
}
}
return result;
}
s16 GetMinTemperature(void)
{
u16 i;
s16 result = 0;
for (i = 0; i < DEVICE_MAX_TEMP; i++) {
if (i == 0) result = device_value.Temp.temperature[i];
else {
if (result > device_value.Temp.temperature[i])
result = device_value.Temp.temperature[i];
}
}
return result;
}
s16 GetAvgTemperature(void)
{
u16 i;
s32 sum = 0;
s16 result = 0;
for (i = 0; i < DEVICE_MAX_TEMP; i++) {
sum += device_value.Temp.temperature[i];
}
result = (s16)(sum / DEVICE_MAX_TEMP);
return result;
}
s16 GetPackRegisterToLcd(u16 reg_addr, u8 dno)
{
s16 result = 0;
if (dno >= DEVICE_MAX_CELL)
return result;
switch (reg_addr & 0x0FFF) {
case 0: result = (s16)device_value.BatVoltage; break; // 0000 0.00V
case 1: result = (s16)(device_value.Current); break; // 0001 0.1A
case 3: // 0003 CELL #1 mV
case 4: // 0004 CELL #2 mV
case 5: // 0005 CELL #3 mV
case 6: // 0006 CELL #4 mV
case 7: // 0007 CELL #5 mV
case 8: // 0008 CELL #6 mV
case 9: // 0009 CELL #7 mV
case 10: // 0010 CELL #8 mV
case 11: // 0011 CELL #9 mV
case 12: // 0012 CELL #10 mV
case 13: // 0013 CELL #11 mV
case 14: // 0014 CELL #12 mV
case 15: // 0015 CELL #13 mV
case 16: // 0016 CELL #14 mV
case 17: result = (s16)device_value.Cell.voltage[(reg_addr & 0x0FFF) - 3]; // 0017 CELL #15
break;
case 18: // 0018 TEMP #1 0.1C
case 19: // 0019 TEMP #2 0.1C
case 20: // 0020 TEMP #3 0.1C
case 21: // 0021 TEMP #4 0.1C
case 22: // 0022 TEMP #5 0.1C
case 23: result = (s16)device_value.Temp.temperature[(reg_addr & 0x0FFF) - 18]; // 0023 TEMP #6 0.1C
break;
// case 24: result = (s16)device_value.Temp.status[6].temp; break; // 0024
// case 25: result = (s16)device_value.Temp.status[7].temp; break; // 0025
case 26: result = (s16)device_value.RelativeStateOfCharge; break; // 0026
case 32: result = (s16)device_param.sbs.data.Full_Charge_Capacity; break; // 32 : Design Capacity
case 37: result = (s16)device_value.Cell.avg.Max.value; break;
case 38: result = (s16)device_value.Cell.avg.Min.value; break;
case 39: result = (s16)device_value.Cell.avg.avg; break;
case 40: result = (s16)device_value.Cell.avg.avg; break;
case 41: result = device_status.alarm_status; break; // 41 : Alarm Status
case 42: result = device_status.warning.value; break; // 42 : Warning
case 43: result = device_status.protection.value; break; // 43 : Protection
case 44: result = device_status.op_status; break; // 44 : Operating Status
case 45: result = GetCanCommState(); break; // 45 : Commfail
case 46: result = device_status.cellbalance.value; break; // 46 : cell balance status
// case 50: result = (s16)((UnixTimeStamp >> 16) & 0x0000FFFF);break; // 0050 : UnixTimeStamp MSB
// case 51: result = (s16)((UnixTimeStamp >> 0) & 0x0000FFFF);break; // 0051 : UnixTimeStamp LSB
case 52: result = device_value.Cell.avg.Max.num; break; // 0052 : Max Cell Number
case 53: result = device_value.Cell.avg.Min.num; break; // 0053 : Min Cell Number
case 54: result = device_value.Temp.avg.Max.value; break; // 0054 : Max Temp
case 55: result = device_value.Temp.avg.Min.value; break; // 0055 : Min Temp
case 56: result = device_value.Temp.avg.Max.num; break; // 0056 : Max Temp Number
case 57: result = device_value.Temp.avg.Min.num; break; // 0057 : Min Temp Number
case 58: result = device_value.Temp.avg.avg; break; // 0058 : Average Temperature Number
case 60: result = (s16)device_param.safety.voltage.CUV_Threshold; break; // 0061 : Low cell voltage protection data
case 61: result = (s16)device_param.safety.voltage.CUV_Warning; break; // 0060 : Low cell voltage warning data
case 62: result = (s16)device_param.safety.voltage.CUV_Recovery; break; // 0062 : Low cell voltage recovery data
case 63: result = (s16)device_param.safety.voltage.SUV_Threshold; break; // 0064 : Low voltage protection data
case 64: result = (s16)device_param.safety.voltage.SUV_Warning; break; // 0063 : Low voltage warning data
case 65: result = (s16)device_param.safety.voltage.SUV_Recovery; break; // 0065 : Low voltage recovery data
case 66: result = (s16)device_param.safety.voltage.COV_Threshold; break; // 0067 : Over cell voltage protection data
case 67: result = (s16)device_param.safety.voltage.COV_Warning; break; // 0066 : Over cell voltage warning data
case 68: result = (s16)device_param.safety.voltage.COV_Recovery; break; // 0068 : Over cell voltage recovery data
case 69: result = (s16)device_param.safety.voltage.SOV_Threshold; break; // 0070 : Over voltage protection data
case 70: result = (s16)device_param.safety.voltage.SOV_Warning; break; // 0069 : Over voltage warning data
case 71: result = (s16)device_param.safety.voltage.SOV_Recovery; break; // 0071 : Over voltage recovery data
case 72: result = (s16)device_param.safety.current.OC_Chg_Threshold; break; // 0072 : Charge over current threshold
case 73: result = (s16)device_param.safety.current.OC_Chg_Warning; break; // 0073 : Charge over current warning
case 74: result = (s16)device_param.safety.current.OC_Chg_Recovery; break; // 0074 : Charge Over current recovery
case 76: result = (s16)device_param.safety.current.OC_Dsg_Threshold; break; // 0076 : Discharge over current threshold
case 77: result = (s16)device_param.safety.current.OC_Dsg_Warning; break; // 0077 : Discharge over current warning
case 78: result = (s16)device_param.safety.current.OC_Dsg_Recovery; break; // 0078 : Discharge Over current recovery
case 80: result = (s16)device_param.safety.temperature.OT_Chg_Threshold; break; // 0080 : Charge high temperature threshold
case 81: result = (s16)device_param.safety.temperature.OT_Chg_Warning; break; // 0081 : Charge high temperature warning
case 82: result = (s16)device_param.safety.temperature.OT_Chg_Recovery; break; // 0082 : Charge high temperature recovery
case 84: result = (s16)device_param.safety.temperature.OT_Dsg_Threshold; break; // 0084 : Discharge high temperature threshold
case 85: result = (s16)device_param.safety.temperature.OT_Dsg_Warning; break; // 0085 : Discharge high temperature warning
case 86: result = (s16)device_param.safety.temperature.OT_Dsg_Recovery; break; // 0086 : Discharge high temperature recovery
case 88: result = (s16)device_param.safety.soc.Low_Soc_Warning; break; // 0088 : Low SOC Warning
case 89: result = (s16)device_param.safety.soc.Low_Soc_Recovery; break; // 0089 : Low SOC Recovery
}
return result;
}
s16 SetMainRegisterLCD(u16 reg_addr, s16 reg_value)
{
s16 result = 0;
switch (reg_addr) {
case 60: device_param.safety.voltage.CUV_Threshold = reg_value; break; // 60 : Low cell voltage protection data
case 61: device_param.safety.voltage.CUV_Warning = reg_value; break; // 61 : Low cell voltage warning data
case 62: device_param.safety.voltage.CUV_Recovery = reg_value; break; // 62 : Low cell voltage recovery data
case 63: device_param.safety.voltage.SUV_Threshold = reg_value; break; // 63 : Low voltage protection data
case 64: device_param.safety.voltage.SUV_Warning = reg_value; break; // 64 : Low voltage warning data
case 65: device_param.safety.voltage.SUV_Recovery = reg_value; break; // 65 : Low voltage recovery data
case 66: device_param.safety.voltage.COV_Threshold = reg_value; break; // 66 : Over cell voltage protection data
case 67: device_param.safety.voltage.COV_Warning = reg_value; break; // 67 : Over cell voltage warning data
case 68: device_param.safety.voltage.COV_Recovery = reg_value; break; // 68 : Over cell voltage recovery data
case 69: device_param.safety.voltage.SOV_Threshold = reg_value; break; // 69 : Over voltage protection data
case 70: device_param.safety.voltage.SOV_Warning = reg_value; break; // 70 : Over voltage warning data
case 71: device_param.safety.voltage.SOV_Recovery = reg_value; break; // 71 : Over voltage recovery data
case 72: device_param.safety.current.OC_Chg_Threshold = reg_value; break; // 72 : Charge over current threshold
case 73: device_param.safety.current.OC_Chg_Warning = reg_value; break; // 73 : Charge over current warning
case 74: device_param.safety.current.OC_Chg_Recovery = reg_value; break; // 74 : Charge Over current recovery
case 76: device_param.safety.current.OC_Dsg_Threshold = reg_value; break; // 76 : Discharge over current threshold
case 77: device_param.safety.current.OC_Dsg_Warning = reg_value; break; // 77 : Discharge over current warning
case 78: device_param.safety.current.OC_Dsg_Recovery = reg_value; break; // 78 : Discharge Over current recovery
case 80: device_param.safety.temperature.OT_Chg_Threshold = reg_value; break; // 80 : Charge high temperature threshold
case 81: device_param.safety.temperature.OT_Chg_Warning = reg_value; break; // 81 : Charge high temperature warning
case 82: device_param.safety.temperature.OT_Chg_Recovery = reg_value; break; // 82 : Charge high temperature recovery
case 84: device_param.safety.temperature.OT_Dsg_Threshold = reg_value; break; // 84 : Discharge high temperature threshold
case 85: device_param.safety.temperature.OT_Dsg_Warning = reg_value; break; // 85 : Discharge high temperature warning
case 86: device_param.safety.temperature.OT_Dsg_Recovery = reg_value; break; // 86 : Discharge high temperature recovery
case 88: device_param.safety.soc.Low_Soc_Warning = reg_value; break;
case 89: device_param.safety.soc.Low_Soc_Warning = reg_value; break;
case 200: SetTime.year = reg_value; break; // _TTIME
case 201: SetTime.month = reg_value; break; // _TTIME
case 202: SetTime.date = reg_value; break; // _TTIME
case 203: SetTime.hour = reg_value; break; // _TTIME
case 204: SetTime.min = reg_value; break; // _TTIME
case 205: SetTime.sec = reg_value;
RTC_TimeSet(&SetTime);
break;
case 50: // TimeStamp MSB Set
SetUpTimeStamp(reg_value, 1);
break;
case 51: // TimeStamp LSB Set
SetUpTimeStamp(reg_value, 0);
break;
case 0x4000: // Buzzer Hold
Alarm_Buzzer_Update();
break;
case 0x4001:
SF1_InitData();
break;
case 0x9000: // Reset
Sys_Soft_Reset();
while(1);
}
return result;
}
s16 SetPackRegisterLCD(u16 reg_addr, s16 reg_value, u8 tno)
{
s16 result = 0;
switch (reg_addr) {
case 50: // TimeStamp MSB Set
SetUpTimeStamp(reg_value, 1);
break;
case 51: // TimeStamp LSB Set
SetUpTimeStamp(reg_value, 0);
break;
case 0x4000: // Buzzer Hold
// Alarm_Buzzer_Update();
break;
case 0x9000: // Reset
Sys_Soft_Reset();
while(1);
}
return result;
}
s16 SetRegisterLCD(u16 reg_addr, s16 reg_value)
{
s16 result = 0;
if (reg_addr < 0x1000)
{
result = SetMainRegisterLCD(reg_addr, reg_value);
}
else if (reg_addr < 0x2000)
{
result = SetPackRegisterLCD(reg_addr, reg_value, 0);
}
else if (reg_addr < 0x3000)
{
result = SetPackRegisterLCD(reg_addr, reg_value, 1);
}
else if (reg_addr < 0x4000)
{
result = SetPackRegisterLCD(reg_addr, reg_value, 2);
}
else
{
result = SetMainRegisterLCD(reg_addr, reg_value);
}
return result;
}