chargeController/APP/businessLogic/Src/SOE.c

162 lines
3.8 KiB
C

#include "SOE.h"
#include "stdio.h"
#include "parameter.h"
#include "FM_RTC.h"
#include "flash.h"
#define eventsOrderRecordStartAddr 4096
typedef struct _soeDataInfo {
uint16_t mode; //故障类型 2byte
timeInfo time; //时间 6byte
float temp; //故障发生时刻的值 4byte
} soeDataInfo;
#define soeDataInfoSize sizeof(soeDataInfo)
typedef struct _soeSaveInfo {
soeDataInfo data[5];
uint8_t insertPos; //记录插入数据的位置
uint8_t outPos; //记录输出数据的位置
uint8_t count; //记录可插入数据插入数据个数
soeDataInfo *insertData; //指向能插入数据的位置
soeDataInfo *outData; //指向能输出数据的位置
} soeSaveInfo;
typedef struct _soeStorageParameters {
uint16_t len; //soe记录次数
uint16_t pos; //下次soe记录的位置
} soeStorageParameters;
static soeSaveInfo soeInfo = {0};
static soeStorageParameters soeParameters = {0};
/**
* @brief 初始化事件顺序记录
* @param
*/
void eventsOrderRecordStartInit(void)
{
soeInfo.count = 5;
soeInfo.insertPos = 0;
soeInfo.outPos = 0;
soeInfo.outData = NULL;
soeInfo.insertData = &soeInfo.data[soeInfo.insertPos];
// read_Flash((uint8_t *)(&soeParameters), sizeof(soeParameters));
}
/**
* @brief 插入事件顺序记录
* @param
*/
/*
| 故障类型 | temp |
| :-------------------: | :-------: |
| firstStageProtection | 输出电流 |
| secondStageProtection | 输出电流 |
| thirdStageProtection | 输出电流 |
| lowInputLoad | 输出电压 |
| overTemperature | mos管温度 |
| stopTemperature | mos管温度 |
| overchargCurr | 充电电流 |
*/
void insertEventsOrderRecord(eventsOrderRecordMode mode)
{
/* 无位置插入时,退出 */
if (soeInfo.count <= 0 || soeInfo.insertData == NULL) {
return;
}
soeInfo.count--;
soeInfo.insertData->mode = mode;
getRTC_Time(&soeInfo.insertData->time);
if (mode == firstStageProtection) {
soeInfo.insertData->temp = getDischargCurrent();
}
else if (mode == secondStageProtection) {
soeInfo.insertData->temp = getDischargCurrent();
}
else if (mode == thirdStageProtection) {
soeInfo.insertData->temp = getDischargCurrent();
}
else if (mode == lowInputLoad) {
soeInfo.insertData->temp = getOutputVoltage();
}
else if (mode == overTemperature) {
soeInfo.insertData->temp = getHighSideMosTemperature();
}
else if (mode == stopTemperature) {
soeInfo.insertData->temp = getHighSideMosTemperature();
}
else if (mode == overchargCurr) {
soeInfo.insertData->temp = getChargCurrent();
}
soeInfo.insertPos++;
if (soeInfo.insertPos >= 5) {
soeInfo.insertPos = 0;
}
if (soeInfo.count <= 0) {
soeInfo.insertData = NULL;
} else {
soeInfo.insertData = &soeInfo.data[soeInfo.insertPos];
}
soeInfo.outData = &soeInfo.data[soeInfo.outPos];
}
/**
* @brief 将事件顺序记录在flash中
* @param
*/
void setEventsOrderRecord(void)
{
if (soeInfo.outData == NULL || soeInfo.count >= 5) {
return;
}
// write_Flash((uint8_t *)(&soeInfo.outData), soeDataInfoSize);
soeInfo.outPos++;
if (soeInfo.outPos >= 5) {
soeInfo.outPos = 0;
}
soeInfo.count++;
if (soeInfo.count >= 5) {
soeInfo.outData = NULL;
} else {
soeInfo.outData = &soeInfo.data[soeInfo.outPos];
}
if (soeInfo.insertData == NULL) {
soeInfo.insertData = &soeInfo.data[soeInfo.insertPos];
}
}
/**
* @brief 将事件从flash中依次读取出来
* @param
*/
void printfEventsOrderRecord(void)
{
}