Files
bishe-STM32/Hardware/Attendance.h
T
2026-05-21 08:07:16 +08:00

102 lines
4.8 KiB
C

#ifndef __ATTENDANCE_H
#define __ATTENDANCE_H
#include "stm32f10x.h"
// 同步状态枚举
typedef enum {
SYNC_PENDING = 0, // 待同步(新记录)
SYNC_SYNCING, // 同步中
SYNC_SYNCED, // 已同步成功
SYNC_FAILED // 同步失败(等待重试)
} SyncStatus;
// 考勤记录结构体
typedef struct {
char student_id[20]; // 学号
char student_name[32]; // 学生姓名
float confidence; // 识别置信度
uint32_t timestamp; // 打卡时间戳(秒)
uint8_t time_slot; // 打卡时段编号
SyncStatus sync_status; // 同步状态
uint8_t retry_count; // 重试次数
uint32_t last_retry_time; // 上次重试时间(毫秒)
} AttendanceRecord;
// 人脸识别结果结构体
typedef struct {
uint8_t success; // 识别是否成功 (1=成功, 0=失败)
char student_id[20]; // 学号
char student_name[32]; // 学生姓名
float confidence; // 置信度 (0.0-1.0)
} FaceRecognitionResult;
// 考勤状态
typedef enum {
ATTENDANCE_SUCCESS = 0, // 打卡成功
ATTENDANCE_DUPLICATE, // 重复打卡(本时段已打卡)
ATTENDANCE_UNKNOWN, // 未识别到人脸
ATTENDANCE_LOW_CONFIDENCE, // 置信度过低
ATTENDANCE_OUT_OF_TIME // 不在考勤时间段内
} AttendanceStatus;
// 时间段定义结构体
typedef struct {
uint8_t enabled; // 是否启用该时间段(1=启用, 0=禁用)
uint8_t start_hour; // 开始小时 (0-23)
uint8_t start_minute; // 开始分钟 (0-59)
uint8_t end_hour; // 结束小时 (0-23)
uint8_t end_minute; // 结束分钟 (0-59)
char name[20]; // 时段名称(如"上午签到")
} TimeSlot;
// 函数声明
// 函数作用:初始化考勤模块的记录缓存、时间段配置和运行状态。
void Attendance_Init(void);
// 函数作用:设置考勤模块当前使用的小时和分钟,用于判断当前是否处于考勤时段。
void Attendance_SetCurrentTime(uint8_t hour, uint8_t minute);
// 函数作用:使用服务器下发的时间段数组更新本地考勤时间段配置。
void Attendance_UpdateTimeSlots(TimeSlot* slots, uint8_t count);
// 函数作用:从服务器返回的 JSON 字符串中解析时间段配置并更新本地列表。
uint8_t Attendance_ParseTimeSlotsJSON(const char* json_str);
// 函数作用:处理 K210 人脸识别结果,判断是否可打卡并生成考勤记录。
AttendanceStatus Attendance_ProcessFaceResult(FaceRecognitionResult* result);
// 函数作用:检查指定学号在当前考勤时段内是否已经打卡。
uint8_t Attendance_IsDuplicate(const char* student_id);
// 函数作用:通过服务器接口检查指定学号在当前时段是否已经打卡。
uint8_t Attendance_IsDuplicateOnServer(const char* student_id);
// 函数作用:获取当前考勤时段的开始和结束时间字符串。
void Attendance_GetCurrentSlotTime(char* start_time, char* end_time);
// 函数作用:从服务器加载今日已签到记录,用于设备重启后恢复去重缓存。
uint8_t Attendance_LoadTodayRecordsFromServer(void);
// 函数作用:在本地今日签到缓存中检查指定学号是否已存在。
uint8_t Attendance_IsDuplicateInCache(const char* student_id);
// 函数作用:把指定学号加入本地今日签到缓存。
void Attendance_AddToCache(const char* student_id);
// 函数作用:清空本地今日签到缓存。
void Attendance_ClearCache(void);
// 函数作用:清空本地保存的考勤记录和同步状态。
void Attendance_ClearRecords(void);
// 函数作用:返回累计考勤记录总数。
uint16_t Attendance_GetTotalCount(void);
// 函数作用:返回当前本地缓存中的有效记录数量。
uint16_t Attendance_GetActiveCount(void);
// 函数作用:返回当前所在考勤时段编号,-1 表示不在任意考勤时段。
int8_t Attendance_GetCurrentTimeSlot(void);
// 数据同步相关函数
// 函数作用:统计当前处于待同步状态的考勤记录数量。
uint16_t Attendance_GetPendingCount(void);
// 函数作用:查找下一条待同步记录,并通过 index 返回其在缓存中的位置。
AttendanceRecord* Attendance_GetNextPendingRecord(uint16_t* index);
// 函数作用:按缓存索引更新指定考勤记录的同步状态。
void Attendance_MarkSyncStatus(uint16_t index, SyncStatus status);
// 函数作用:按缓存索引增加指定考勤记录的同步重试次数。
void Attendance_IncrementRetry(uint16_t index);
// 函数作用:按缓存索引返回指定考勤记录指针。
AttendanceRecord* Attendance_GetRecordByIndex(uint16_t index);
// 函数作用:将所有同步失败记录重置为待同步,便于后续重新上传。
void Attendance_ResetFailedRecords(void);
#endif