Просмотр исходного кода

add event record

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 4 лет назад
Родитель
Сommit
171d3b6347

+ 12 - 2
Application/app/bms_message.c

@@ -12,7 +12,7 @@
 #include "libs/logger.h"
 #include "protocol.h"
 #include "bms_message.h"
-
+#include "event_record.h"
 extern char* bsp_get_fversion(void);
 
 static uint8_t bms_insert = 0;
@@ -234,12 +234,22 @@ void process_bms_message(can_frame_t *frame, int len){
 			soc_restore_by_iap(nv->flags, nv->capacity);
 			protocol_send_ack(frame->head.can_addr, frame->key, 1);
 			break;
-			}
+		}
 		case CAN_KEY_MIN_SOC:
 			get_soc()->coulomb_min = (u32)frame->data[0] * 3600.0f;
 			nv_save_all_soc();
 			protocol_send_ack(frame->head.can_addr, frame->key, 1);
 			break;
+		case CAN_KEY_GET_EVENT: {
+			u8 event[sizeof(event_record_t) * 8 + 1];
+			u16 offset = DECODE_U16(frame->data);
+			int num = get_event(8, offset, (event_record_t *)(event + 1));
+			*event = (u8)num;
+			protocol_send_bms_info(frame->head.can_addr, frame->key, event, sizeof(event_record_t) * num + 1);
+			break;
+		}
+		default:
+			break;
 	}
 }
 

+ 47 - 0
Application/app/event_record.c

@@ -0,0 +1,47 @@
+#include <stdbool.h>
+#include <string.h>
+#include "event_record.h"
+#include "libs/shark_task.h"
+
+#define MAX_EVENT_SIZE 60
+static event_record_t _event[MAX_EVENT_SIZE];
+static int event_w_idx = 0;
+static bool _event_full = false;
+
+void push_event(event_id_t id, u32 data) {
+	event_record_t *pevent = &_event[event_w_idx];
+	event_w_idx = (event_w_idx + 1) % MAX_EVENT_SIZE;
+	if (event_w_idx == 0) {
+		_event_full = true;
+	}
+	pevent->id = id;
+	pevent->timestamp = shark_get_seconds();
+	pevent->data = data;
+}
+
+static int _event_size(void) {
+	if (_event_full) {
+		return MAX_EVENT_SIZE;
+	}
+	return event_w_idx;
+}
+
+int get_event(int num, int offset, event_record_t *recoder) {
+	if (offset >= _event_size()) {
+		return 0;
+	}
+	num = MIN(num, _event_size()-offset);
+	int start = offset + event_w_idx;
+	int rtn = 0;
+	while(num > 0) {
+		start = start % MAX_EVENT_SIZE;
+		memcpy(recoder, &_event[start], sizeof(event_record_t));
+		num --;
+		start ++;
+		recoder ++;
+		rtn ++;
+	}
+	return rtn;
+}
+
+

+ 31 - 0
Application/app/event_record.h

@@ -0,0 +1,31 @@
+#ifndef _Event_Recorde_H__
+#define _Event_Recorde_H__
+
+#include "libs/shark_types.h"
+
+typedef enum {
+	Cell_Under_Vol = 1,
+	Cell_Over_Vol,
+	Pack_Under_Vol,
+	Pack_Over_Vol,
+	Charger_Full,
+	Current_Short,
+	Aux_Current_Short,
+	Temp_High_Discharger,
+	Temp_Low_Discharger,
+	Temp_High_Charger,
+	Temp_Low_Charger,
+	Min_Cap_For_Full,
+	Min_Cap_For_DisCharger,
+}event_id_t;
+
+typedef struct {
+	event_id_t id;
+	u32 timestamp;
+	u32 data;
+}event_record_t;
+
+void push_event(event_id_t id, u32 data);
+int get_event(int num, int offset, event_record_t *recoder);
+#endif /* _Event_Recorde_H__ */
+

+ 41 - 31
Application/app/protocol.h

@@ -47,6 +47,32 @@ typedef struct {
 }can_frame_t;
 #pragma pack(pop)
 
+#define CAN_KEY_BMS_BASE_INFO 0x00 //电压,电流,能量, SOC,max temp
+#pragma  pack (push,1)
+typedef struct {
+	uint32_t pack_voltage;
+	int32_t  pack_current;
+	uint8_t  capacity;
+	uint32_t energy;   //能量,给PS100/200/310/360计算续航里程用
+	int8_t  max_temp;//最高的那个温度
+	uint32_t health :24;
+	uint32_t state  :8; // stat_cmd_resp_t
+}binfo_cmd_resp_t;
+#pragma pack(pop)
+
+#define CAN_KEY_GET_SN      0x05 //return string
+#define CAN_KEY_SET_SN      0x06 //string
+
+
+#define CAN_KEY_BMS_GET_CELLS   0x07
+#pragma  pack (push,1)
+typedef struct {
+	uint8_t cell_num;
+	uint16_t voltages[CELLS_NUM];
+}cell_cmd_resp_t;
+#pragma pack(pop)
+
+
 /* can key define */
 #define CAN_KEY_BMS_SET_POWER 0x0B //开关各种mos和小电流
 #pragma  pack (push,1)
@@ -61,6 +87,12 @@ typedef struct {
 }pwr_cmd_t;
 #pragma pack(pop)
 
+#define CAN_KEY_GET_VERSION 0x0c //return string
+
+
+#define CAN_KEY_BMS_TEMPS 0x11 //return int[4]
+
+
 #define CAN_KEY_BMS_GET_STAT 0xa0 //bms_stat_t
 #pragma  pack (push,1)
 typedef struct {
@@ -75,18 +107,7 @@ typedef struct {
 }stat_cmd_resp_t;
 #pragma pack(pop)
 
-#define CAN_KEY_BMS_BASE_INFO 0x00 //电压,电流,能量, SOC,max temp
-#pragma  pack (push,1)
-typedef struct {
-	uint32_t pack_voltage;
-	int32_t  pack_current;
-	uint8_t  capacity;
-	uint32_t energy;   //能量,给PS100/200/310/360计算续航里程用
-	int8_t  max_temp;//最高的那个温度
-	uint32_t health :24;
-	uint32_t state  :8; // stat_cmd_resp_t
-}binfo_cmd_resp_t;
-#pragma pack(pop)
+
 
 #define CAN_KEY_BMS_CHARG_INFO 0xa1
 #pragma  pack (push,1)
@@ -96,13 +117,11 @@ typedef struct {
 }cinfo_cmd_resp_t;
 #pragma pack(pop)
 
-#define CAN_KEY_BMS_GET_CELLS   0x07
-#pragma  pack (push,1)
-typedef struct {
-	uint8_t cell_num;
-	uint16_t voltages[CELLS_NUM];
-}cell_cmd_resp_t;
-#pragma pack(pop)
+#define CAN_KEY_SET_LOGGER  0xa2 //byte 0:modle, byte1 level
+#define CAN_KEY_BMS_CLEAR   0xa3 //clear some flags used by PSxxx, exp: stat_cmd_resp_t.insert
+#define CAN_KEY_BMS_GET_HEALTH_STAT 0xa4 //return bms_health_t
+#define CAN_KEY_BMS_GET_TIME      0xa5 //return bms running times(second) uint32_t
+#define CAN_KEY_BMS_SET_WORK_MODE     0xa6 //byte0=mode, byte1=start/stop
 
 #define CAN_KEY_GET_SOC_INFO 0xa7
 typedef struct {
@@ -115,18 +134,6 @@ typedef struct {
 	uint32_t calibrated;	
 }soc_info_t;
 
-#define CAN_KEY_BMS_TEMPS 0x11 //return int[4]
-
-#define CAN_KEY_SET_LOGGER  0xa2 //byte 0:modle, byte1 level
-#define CAN_KEY_BMS_CLEAR   0xa3 //clear some flags used by PSxxx, exp: stat_cmd_resp_t.insert
-#define CAN_KEY_BMS_GET_HEALTH_STAT 0xa4 //return bms_health_t
-#define CAN_KEY_BMS_GET_TIME      0xa5 //return bms running times(second) uint32_t
-#define CAN_KEY_BMS_SET_WORK_MODE     0xa6 //byte0=mode, byte1=start/stop
-
-#define CAN_KEY_GET_VERSION 0x0c //return string
-#define CAN_KEY_SET_SN      0x06 //string
-#define CAN_KEY_GET_SN      0x05 //return string
-
 #define CAN_KEY_START_CALI  0xa8
 #pragma  pack (push,1)
 typedef struct {
@@ -152,6 +159,9 @@ typedef struct {
 
 #define CAN_KEY_MIN_SOC 0xab /*设置最小容量,测试使用*/
 
+#define CAN_KEY_GET_EVENT 0xac /*获取事件信息*/
+
+
 #define CAN_KEY_IAP_ENTER   0xF0
 #define CAN_KEY_IAP_BEGIN   0xF1
 #define CAN_KEY_IAP_CHECK   0xF2

+ 34 - 1
Application/app/sox/health.c

@@ -7,7 +7,7 @@
 #include "measure_task.h"
 #include "health.h"
 #include "Least_Square.h"
-
+#include "event_record.h"
 #if 0
 #define MIN_VOLTAGE_FOR_DISCHARGER (2.2f * CELLS_NUM * 1000) //允许能放电的最小电压
 #define MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER (2.3f * CELLS_NUM * 1000) //恢复放电的最小电压
@@ -147,6 +147,7 @@ static void check_ml5238_state(int event){
 		shark_timer_post(&_charger_detect_timer._timer, _charger_detect_timer.interval);
 	}else if (event == ML5238_Event_Short_Current) { //ml5238触发短路保护,充放电mos全部关闭
 		_health.load_current_short = 1;
+		push_event(Current_Short, 1);
 		error_counts.hard_current_short ++;
 		ml5238_enable_load_detect(1); //打开负载检测
 		shark_timer_post(&_load_detect_timer._timer, _load_detect_timer.interval);
@@ -191,6 +192,7 @@ void check_current_state(void){
 		if (!_health.load_current_short){
 			if (soft_current_push(current)) {
 				_health.load_current_short = 1;
+				push_event(Current_Short, 0);
 				error_counts.soft_current_short ++;
 				//_discharger_over_current.count = 0;
 				ml5238_enable_load_detect(1); //打开负载检测
@@ -287,6 +289,7 @@ void check_voltage_state(void) {
 		if ((bms_state_get()->cell_max_vol>= SIGLE_CELL_MAX_CHARGER_VOLTAGE)){
 			if (judge_debounce(!_health.sigle_cell_over_voltage, &_sigle_cell_charger_max_vol)){
 				_health.sigle_cell_over_voltage = 1;
+				push_event(Cell_Over_Vol, bms_state_get()->cell_max_vol);
 				charger_over_cell_voltage = bms_state_get()->cell_max_vol;
 				sys_debug("sigle cell %d\n", bms_state_get()->cell_max_vol);
 			}
@@ -303,6 +306,7 @@ void check_voltage_state(void) {
 		if ((bms_state_get()->cell_min_vol <= min_discharger_cell_vol[_health.is_work_temp_normal])){
 			if (judge_debounce(!_health.sigle_cell_lower_voltage, &_sigle_cell_discharger_lower_vol)){
 				_health.sigle_cell_lower_voltage = 1;
+				push_event(Cell_Under_Vol, bms_state_get()->cell_min_vol);
 				_single_low_judge_current(true);
 				error_counts.cell_under_voltage++;
 				discharger_lower_cell_voltage = bms_state_get()->cell_min_vol;
@@ -317,6 +321,7 @@ void check_voltage_state(void) {
 		if (bms_state_get()->pack_voltage <= min_discharger_vol[_health.is_work_temp_normal]){
 			if (judge_debounce(!_health.discharger_lower_voltage, &_discharger_lower_voltage)){
 				_health.discharger_lower_voltage = 1;
+				push_event(Pack_Under_Vol, bms_state_get()->pack_voltage);
 				_pack_low_judge_current(true);
 				error_counts.pack_under_voltage++;
 				discharger_lower_voltage = bms_state_get()->pack_voltage;
@@ -380,6 +385,27 @@ static debounce_t _discharger_lower_temp_count  = {.count = 0, .max_count = 8, .
 static debounce_t _discharger_normal_temp_count = {.count = 0, .max_count = 8, .init_count = 0};
 static debounce_t _work_lower_temp_count = 		{.count = 0, .max_count = 8, .init_count = 0};
 
+static int _get_max_temp(int size){
+	int max = -1000;
+	for (int i = 0; i < size; i++){
+		if (measure_value()->pack_temp[i] >= max){
+			max = measure_value()->pack_temp[i];
+		}
+	}
+	return max;
+}
+
+static int _get_min_temp(int size){
+	int min = 1000;
+	for (int i = 0; i < size; i++){
+		if (measure_value()->pack_temp[i] < min){
+			min = measure_value()->pack_temp[i];
+		}
+	}
+	return min;
+}
+
+
 static int _is_over_temp(int8_t *temps, int size){
 	int count = 0;
 	for (int i = 0; i < size; i++){
@@ -416,6 +442,9 @@ static void _aux_lock_timer_handler(shark_timer_t *t){
 		int short_voltage = get_small_current_voltage()/1000;
 		int pack_voltage = bms_state_get()->pack_voltage/1000;
 		if (short_voltage >= AUX_SHORT_DIFF_VOLTAGE) {
+			if (_health.small_current_short == 0) {
+				push_event(Aux_Current_Short, short_voltage);
+			}
 			_health.small_current_short = 1;
 			error_counts.aux_short ++;
 			AUX_VOL_OPEN(0);
@@ -480,6 +509,7 @@ void check_temp_state(void){
 		}
 		if (debounce_reach_max(_charger_over_temp_count)){
 			_health.over_temp_deny_charger = 1;
+			push_event(Temp_High_Charger, _get_max_temp(4));
 			error_counts.charger_high_temp ++;
 			debounce_reset(_charger_over_temp_count);
 		}			
@@ -492,6 +522,7 @@ void check_temp_state(void){
 		}
 		if (debounce_reach_max(_charger_lower_temp_count)) {
 			_health.lower_temp_deny_charger = 1;
+			push_event(Temp_Low_Charger, _get_min_temp(4));
 			error_counts.charger_lower_temp ++;
 			debounce_reset(_charger_lower_temp_count);
 		}
@@ -517,6 +548,7 @@ void check_temp_state(void){
 		}
 		if (debounce_reach_max(_discharger_over_temp_count)){
 			_health.over_temp_deny_discharger = 1;
+			push_event(Temp_High_Discharger, _get_max_temp(4));
 			error_counts.discharger_high_temp ++;
 			debounce_reset(_discharger_over_temp_count);
 		}			
@@ -530,6 +562,7 @@ void check_temp_state(void){
 		}
 		if (debounce_reach_max(_discharger_lower_temp_count)) {
 			_health.lower_temp_deny_discharger = 1;
+			push_event(Temp_Low_Discharger, _get_min_temp(4));
 			error_counts.discharger_lower_temp ++;
 			debounce_reset(_discharger_lower_temp_count);
 		}

+ 8 - 17
Application/app/sox/soc.c

@@ -6,6 +6,7 @@
 #include "Least_Square.h"
 #include "health.h"
 #include "state.h"
+#include "event_record.h"
 
 #define LEAST_SQUARE 0
 
@@ -18,7 +19,6 @@ static float     max_soc_delta_time = 0;
 static float _charger_coefficient = 1.0f;
 static float _discharger_coefficient = 1.0f;
 static uint32_t charger_remain_time = 0;
-static uint32_t _is_cell_lower_vol = 0;
 static const float _discharger_gain[] = {1.0f/*>0度*/, 1.002f/*-2<t<=0*/, 1.005f/*-5<t<=-2*/, 1.008f/*-10<t<=-5*/, 1.02f/*-15<t<=-10*/, 1.04f/*-20<t<=-15*/};
 #define MAX_TIME_FULL_TO_EMPTY (5 * 24 * 3600) //充满到欠压5天内达到,可以校准最小电量
 #define MAX_TIME_EMPTY_TO_FULL (8 * 24 * 3600) //充满到欠压5天内达到,可以校准最小电量
@@ -28,9 +28,6 @@ static const float _discharger_gain[] = {1.0f/*>0
 #define SIGAL_CELL_OV_MAX_PACK_VOL (53000)
 #define FULL_MAX_VOLTAGE (54000) //mV
 #define FULL_MIN_CURRENT (500.0f) //mA
-static int _full_reason = 0;
-static int _force_full = 0;
-static int _force_full_minc = 0;
 static double start_charger_coulomb = 0.0f; //开始充电时候的容量
 static void calibrate_soc_by_ocv(void);
 static void _soc_clear(void);
@@ -218,8 +215,6 @@ void soc_log(void){
 	soc_debug("C energy: %f\n", _soc.energy);
 	soc_debug("C delta time %f,%f, -- %d\n", max_soc_delta_time, soc_delta_time, force_full_ts);
 	soc_debug("C discharger coefficient = %f\n", _discharger_coefficient);
-	soc_debug("forcce full = %d, %d, %d, %d\n", _full_reason, _force_full, _force_full_minc, force_full_ts);
-	soc_debug("Discharger lover vol:%d\n", _is_cell_lower_vol);
 	if (chargering){
 		soc_debug("C remain %d\n", charger_remain_time);
 	}
@@ -302,13 +297,11 @@ static void _force_capacity_full(void){
 		//lowpass filter
 		_soc.coulomb_min = (curr_min_cap + _soc.coulomb_min)/2.0f;
 		soc_warning("current real cap %f\n", curr_real_cap);
-		_force_full_minc ++;
+		push_event(Min_Cap_For_Full, (u32)curr_real_cap);
 	}
 	_soc.coulomb_now = _soc.coulomb_max;//充满后,当前容量设置为最大容量
 
 	force_full_ts = shark_get_seconds();
-	_is_cell_lower_vol = 0;
-	_force_full = 2;
 }
 
 static int _soc_is_under_voltage(void) {
@@ -326,9 +319,8 @@ static int _soc_update_by_ocv(uint8_t prev_charge_status){
 	if (!chargering){
 		if (_soc.capacity && _soc_is_under_voltage()) {
 			soc_warning("judge calib min col %d - %d\n", shark_get_seconds(), force_full_ts);
-			_is_cell_lower_vol = 1;
 			if (can_modify_min_cap()){
-				_is_cell_lower_vol = 2;
+				push_event(Min_Cap_For_DisCharger, (u32)_soc.coulomb_now);
 				if (health_is_low_current()) {
 					_soc.coulomb_min = _soc.coulomb_now; //已经校准过了,而且电池在常温下进入powerdown,最小容量修正为当前容量
 				}else if (health_is_mid_current()) {
@@ -341,7 +333,6 @@ static int _soc_update_by_ocv(uint8_t prev_charge_status){
 				_soc.coulomb_now = _soc.coulomb_min;
 				soc_warning("calicablite coulomb_min %f\n", _soc.coulomb_min);
 			}else {
-				_is_cell_lower_vol = 3;
 				_soc.coulomb_now = _soc.coulomb_min;
 			}
 			_soc.capacity = 0;
@@ -352,13 +343,13 @@ static int _soc_update_by_ocv(uint8_t prev_charge_status){
 		if (chargering && (_soc.capacity != 100)) { 
 			if (bms_health()->sigle_cell_over_voltage && (_soc.charger_coulomb >= (0.1f * 3600.0f))) { //单电芯过压强制充满
 				_force_capacity_full();
-				_full_reason = 3;
+				push_event(Charger_Full, 3);
 				ocv_full_count = 0;
 				changed = 1;
 			}else if (bms_state_get()->pack_voltage >= (FULL_MAX_VOLTAGE_CHARGING) && (measure_value()->load_current <= FULL_MIN_CURRENT)){
 				if (ocv_full_count++ >= 100) { //连续100次(小电流采集30ms一次,就是3s时间)电压和电流满足条件,强制充满
 					_force_capacity_full();
-					_full_reason = 4;
+					push_event(Charger_Full, 4);
 					ocv_full_count = 0;
 					changed = 1;
 				}
@@ -368,7 +359,7 @@ static int _soc_update_by_ocv(uint8_t prev_charge_status){
 		} else if (!chargering && prev_charge_status && (_soc.capacity != 100)){
 			if ((bms_state_get()->pack_voltage >= FULL_MAX_VOLTAGE) && (_soc.charger_coulomb >= (0.1f * 3600.0f))){//充电容量几乎接近最大容量
 				_force_capacity_full();
-				_full_reason = 5;
+				push_event(Charger_Full, 5);
 				changed = 1;
 			}
 		}
@@ -392,14 +383,14 @@ static void soc_calibrate(uint8_t prev_charge_status){
 				if (cali_full_count >= 20 || bms_health()->sigle_cell_over_voltage) {
 					soc_debug("calibrate Capacity to 100, measure_value()->load_current %d\n", measure_value()->load_current);
 					_force_capacity_full();
-					_full_reason = 1;
+					push_event(Charger_Full, 1);
 				}
 			}
 		}else if (prev_charge_status){
 			if((_soc.capacity != 100) && ((bms_state_get()->pack_voltage >= FULL_MAX_VOLTAGE) || bms_health()->sigle_cell_over_voltage)){
 				soc_debug("calibrate Capacity to 100\n");
 				_force_capacity_full();
-				_full_reason = 2;
+				push_event(Charger_Full, 2);
 			}
 		}else {
 			if (_soc.capacity && _soc_is_under_voltage()) {

+ 64 - 52
Project/SP700.uvoptx

@@ -328,6 +328,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>10</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\app\event_record.c</PathWithFileName>
+      <FilenameWithoutPath>event_record.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -338,7 +350,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <FileNumber>11</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -350,7 +362,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -362,7 +374,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -374,7 +386,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -386,7 +398,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -398,7 +410,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -410,7 +422,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -422,7 +434,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -442,7 +454,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -454,7 +466,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -466,7 +478,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -478,7 +490,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -490,7 +502,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -502,7 +514,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -514,7 +526,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -526,7 +538,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -538,7 +550,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -550,7 +562,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -562,7 +574,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -574,7 +586,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -586,7 +598,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -598,7 +610,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -618,7 +630,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -630,7 +642,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -642,7 +654,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -654,7 +666,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -666,7 +678,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -686,7 +698,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -698,7 +710,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -710,7 +722,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -722,7 +734,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -734,7 +746,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -746,7 +758,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -758,7 +770,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -770,7 +782,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -782,7 +794,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -794,7 +806,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -806,7 +818,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -818,7 +830,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -830,7 +842,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -842,7 +854,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -854,7 +866,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -866,7 +878,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -878,7 +890,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -890,7 +902,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -902,7 +914,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -914,7 +926,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -926,7 +938,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -938,7 +950,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -950,7 +962,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -970,7 +982,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -982,7 +994,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/SP700.uvprojx

@@ -428,6 +428,11 @@
               <FileType>1</FileType>
               <FilePath>..\Application\app\key_leds.c</FilePath>
             </File>
+            <File>
+              <FileName>event_record.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\event_record.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>