mcu_hi3321_watch/tjd/sql/sql_bt.c
2025-05-26 20:15:20 +08:00

430 lines
13 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*----------------------------------------------------------------------------
* Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved.
*
* Description: sql_bt.c EDR与BLE信息都在这管理
*
* Author: saimen
*
* Create: 2024-06-08
*--------------------------------------------------------------------------*/
//所有的 SQL 语法都必须以关键字(也称命令)开头,比如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW 等。
#include <string.h>
#include "sys_typedef.h"
#include "sys_config.h"
#include "linux/crc32.h"
#include "sql_bt.h"
/**********************************************************************************************************************
* DEFINE
*/
#define ENABLE_STATIC_PRINT true
#define static_print_error(...) sys_sql_log_e(__VA_ARGS__) //错误信息打印一般常开
#define static_print_warn(...) sys_sql_log_w(__VA_ARGS__) //警告信息打印一般常开
#if ENABLE_STATIC_PRINT
#define static_print_debug(...) sys_sql_log_d(__VA_ARGS__)
#else
#define static_print_debug(...)
#endif
#define FILE_VERSION_SETTING (1)
#define FILE_PATH_SETTING "/system/sql_bt.bin"
#define QRCODE_MAX_DATA_LEN 256
#define QRCODE_MAX_NUMER 11
#define GAME_MAX_NUMER 2
//该结构体用于存储二维码数据
typedef struct {
bool exist; //二维码是否存在 false:不存在 true:存在
qrcode_type_t type; //二维码类型
uint8_t data[QRCODE_MAX_DATA_LEN]; //二维码数据
uint16_t len; //二维码长度
} qrcode_info_t; //二维码信息
typedef struct {
game_type_t game_type; //游戏类型
uint32_t game_score; //历史最高得分
}game_info_t; //游戏信息
#pragma pack(4) //alignment 4 bytes
typedef struct {
uint32_t init_flag:8; //标记模块是否初始化。=0 无效数据;=1 正常数据;=2 恢复数据。
uint32_t version:8; //结构体版本
uint8_t binded; //设备绑定 0:未绑定 1:已绑定
uint8_t en_disconn_reminder; //蓝牙断开提醒
bool start_complete; //启动完成标志 false:未完成 ture:完成
bool bt_swithch_mode; //蓝牙开关模式 false:关闭 ture:打开
bool is_payment_into_wechat; //是否从交友中进入钱包-微信支付
bool is_payment_into_qq; //是否从交友中进入名片-QQ
uint8_t mac_addr[MAC_ADDR_LEN]; //蓝牙MAC地址
char ble_name[BLE_NAME_LEN]; //BLE名称
char phone_name[16]; //手机型号
breakpoint_info_t breakpoint;
qrcode_info_t qrcode_info[QRCODE_MAX_NUMER]; //二维码信息
game_info_t game_info[GAME_MAX_NUMER]; //游戏得分信息
uint8_t headset_lastconnect_addr[MAC_ADDR_LEN]; //蓝牙连接的上一个耳机设备地址
//uint8_t revs[1]; //保证8字节对齐
uint32_t crc32;
} sql_bt_t;
#pragma pack()
static sql_bt_t g_sql_bt; //设置实例
static bool g_bt_need_save = false;
/**
* @brief 重置系统设置数据.
* @retval int|返回结果,0=成功.
*/
int sql_bt_restore(void)
{
int ret = RET_SUCCESS;
static_print_warn("sql_bt_restore()\r\n");
// 设置的默认值
memset((uint8_t*)&g_sql_bt,0,sizeof(sql_bt_t));
g_sql_bt.version = FILE_VERSION_SETTING;
g_sql_bt.init_flag = 1;
g_sql_bt.bt_swithch_mode = true;
g_sql_bt.binded = 0;
memcpy_s(g_sql_bt.ble_name,BLE_NAME_LEN,TJD_PCB_NAME""TJD_BLE_NAME_PREFIX,sizeof(TJD_PCB_NAME""TJD_BLE_NAME_PREFIX));
g_bt_need_save = false;
return ret;
}
/**********************************************************************************************************************
* 固定接口
*/
/**
* @brief 初始化系统设置数据.
* @retval int|返回结果,0=成功.
*/
int sql_bt_init(void)
{
int ret = RET_SUCCESS;
uint32_t ui32_crc;
static_print_warn("[%s],sizeof(sql_bt_t) = %d\r\n", FILE_PATH_SETTING, sizeof(sql_bt_t));
//ui32_crc = crc32_ex(0,(uint8_t*)&g_sql_bt, sizeof(sql_bt_t) - 4);
ui32_crc = Crc32Part(0,(const char *)&g_sql_bt, sizeof(sql_bt_t) - 4);
if(ui32_crc != g_sql_bt.crc32 || g_sql_bt.version != FILE_VERSION_SETTING)
{
sql_bt_restore();
g_bt_need_save = true;
}
return ret;
}
void* sql_bt_get_info(uint32_t *len, char **path)
{
g_sql_bt.crc32 = Crc32Part(0,(const char *)&g_sql_bt, sizeof(g_sql_bt) - 4);
*len = sizeof(g_sql_bt);
*path = (char*)FILE_PATH_SETTING;
return &g_sql_bt;
}
void sql_bt_set_save_flag(uint8_t value)
{
g_bt_need_save = value;
}
uint8_t sql_bt_get_save_flag(void)
{
return g_bt_need_save;
}
/**********************************************************************************************************************
* SQL Server API
*/
void sql_bt_set_bt_switch_mode(bool mode)
{
static_print_debug("settings:set bt switch mode");
if(g_sql_bt.bt_swithch_mode != mode) {
g_sql_bt.bt_swithch_mode = mode;
g_bt_need_save = true;
}
}
bool sql_bt_get_bt_switch_mode(void)
{
return g_sql_bt.bt_swithch_mode;
}
void sql_bt_set_is_payment_into_wechat(bool mode)
{
static_print_debug("settings:set is_payment_into_wechat");
if(g_sql_bt.is_payment_into_wechat != mode) {
g_sql_bt.is_payment_into_wechat = mode;
g_bt_need_save = true;
}
}
bool sql_bt_get_is_payment_into_wechat(void)
{
return g_sql_bt.is_payment_into_wechat;
}
void sql_bt_set_is_payment_into_qq(bool mode)
{
static_print_debug("settings:set is_payment_into_qq");
if(g_sql_bt.is_payment_into_qq != mode) {
g_sql_bt.is_payment_into_qq = mode;
g_bt_need_save = true;
}
}
bool sql_bt_get_is_payment_into_qq(void)
{
return g_sql_bt.is_payment_into_qq;
}
void sql_bt_set_bind(uint8_t isBinded)
{
static_print_debug("settings:set bind\r\n");
if(g_sql_bt.binded != isBinded) {
g_sql_bt.binded = isBinded;
g_bt_need_save = true;
}
}
uint8_t sql_bt_get_bind(void)
{
return g_sql_bt.binded;
}
void sql_bt_set_switch_disconn_reminder(bool enable)
{
static_print_debug("settings:set ble disconn notify\r\n");
if(g_sql_bt.en_disconn_reminder != enable) {
g_sql_bt.en_disconn_reminder = enable;
g_bt_need_save = true;
}
}
uint8_t sql_bt_get_switch_disconn_reminder(void)
{
return g_sql_bt.en_disconn_reminder;
}
int8_t sql_bt_set_mac_addr(const uint8_t* address, uint8_t len)
{
// char* addr = (char*)address;
if (len > MAC_ADDR_LEN) {
static_print_debug("mac addr len is override");
return -1;
}
if(memcmp((g_sql_bt.mac_addr), address, len) != 0) {
memcpy_s((g_sql_bt.mac_addr), len, address, len);
g_bt_need_save = true;
}
return 0;
}
uint8_t * sql_bt_get_mac_addr(void)
{
return g_sql_bt.mac_addr;
}
int8_t sql_bt_set_ble_name(const uint8_t* ble_name, uint8_t len)
{
char* addr = (char*)ble_name;
if (len > BLE_NAME_LEN) {
static_print_debug("ble name len is override");
return -1;
}
if(strncmp((const char *)(g_sql_bt.ble_name), addr, len) != 0) {
strncpy((char *)(g_sql_bt.ble_name), addr, len);
g_bt_need_save = true;
}
return 0;
}
void sql_bt_get_ble_name(char * name)
{
strncpy_s(name, BLE_NAME_LEN , g_sql_bt.ble_name, strlen(g_sql_bt.ble_name));
}
int8_t sql_bt_set_phone_name(const uint8_t* address, uint8_t len)
{
char* addr = (char*)address;
static_print_debug("settings:set phone name");
if (len > 24) {
static_print_debug("phone name len is override");
return -1;
}
if(strncmp(g_sql_bt.phone_name, addr, len) != 0) {
strncpy(g_sql_bt.phone_name, addr, len);
g_bt_need_save = true;
}
return 0;
}
char* sql_bt_get_phone_name(void)
{
return g_sql_bt.phone_name;
}
bool sql_bt_get_qrcode_show_flag(void)
{
//遍历qrcode_info数组判断是否存在有效二维码
for(int i = 0; i < QRCODE_MAX_NUMER; i++) {
if(i == 0 || i == 2) continue;
if(g_sql_bt.qrcode_info[i].exist == true) {
return true;
}
}
return false;
}
bool sql_bt_get_wallet_qrcode_show_flag(void)
{
//遍历qrcode_info数组判断是否存在有效二维码
if(g_sql_bt.qrcode_info[0].exist == true || g_sql_bt.qrcode_info[2].exist == true) {
return true;
}
return false;
}
int8_t sql_bt_set_qrcode_exist(bool exist, qrcode_type_t type)
{
static_print_debug("settings:set qrcode exist");
if(type >= QRCODE_MAX) {
static_print_debug("qrcode type is invalid");
return false;
}
g_sql_bt.qrcode_info[type].exist = exist;
g_sql_bt.qrcode_info[type].type = type;
g_bt_need_save = true;
return RET_SUCCESS;
}
bool sql_bt_get_qrcode_exist(qrcode_type_t type)
{
if(type >= QRCODE_MAX) {
static_print_debug("qrcode type is invalid");
return false;
}
return g_sql_bt.qrcode_info[type].exist;
}
int8_t sql_bt_set_qrcode_info(qrcode_type_t type, const uint8_t *info, uint16_t len)
{
if(len > QRCODE_MAX_DATA_LEN) {
static_print_debug("qrcode len is override");
return -1;
}
g_sql_bt.qrcode_info[type].len = len;
memcpy((char*)g_sql_bt.qrcode_info[type].data, info, len);
return RET_SUCCESS;
}
int8_t sql_bt_get_qrcode_info(qrcode_type_t type, uint8_t *info, uint16_t *len)
{
if(type >= QRCODE_MAX) {
static_print_debug("qrcode type is invalid");
return -1;
}
if(g_sql_bt.qrcode_info[type].exist == false) {
static_print_debug("qrcode is not exist");
return -1;
}
*len = g_sql_bt.qrcode_info[type].len;
memcpy(info, (char*)g_sql_bt.qrcode_info[type].data, *len);
return RET_SUCCESS;
}
int8_t sql_bt_set_start_complete_flag(bool flag)
{
if(g_sql_bt.start_complete != flag) {
g_sql_bt.start_complete = flag;
g_bt_need_save = true;
return RET_PROCESS;
}
return RET_SUCCESS;
}
bool sql_bt_get_start_complete_flag(void)
{
return g_sql_bt.start_complete;
}
int8_t sql_bt_set_headset_lastconnect_addr(const uint8_t* address, uint8_t len)
{
char* addr = (char*)address;
if (len > MAC_ADDR_LEN) {
static_print_debug("headset lastconnect addr len is override");
return -1;
}
if(strncmp((const char *)(g_sql_bt.headset_lastconnect_addr), addr, len) != 0) {
memcpy((char *)(g_sql_bt.headset_lastconnect_addr), addr, len);
g_bt_need_save = true;
}
return RET_SUCCESS;
}
bool sql_bt_get_headset_lastconnect_addr(uint8_t *address)
{
if(address == NULL) {
return false;
}
for(int i = 0; i < MAC_ADDR_LEN; i++) {
if(g_sql_bt.headset_lastconnect_addr[i] != 0){
memcpy(address, g_sql_bt.headset_lastconnect_addr, MAC_ADDR_LEN);
return true;
}
}
return false;
}
uint32_t sql_bt_get_game_score(game_type_t type)
{
if(type >= GAME_MAX_NUMER) {
static_print_debug("game type is invalid");
return 0;
}
return g_sql_bt.game_info[type].game_score;
}
bool sql_bt_set_game_score(game_type_t type, uint32_t *score)
{
if(type >= GAME_MAX_NUMER) {
static_print_debug("game type is invalid");
return false;
}
if(g_sql_bt.game_info[type].game_score < *score) {
g_sql_bt.game_info[type].game_score = *score;
g_bt_need_save = true;
}
return true;
}
bool sql_bt_set_breakpoint_info(uint32_t offset_byte, uint32_t crc_32, const char* file_name)
{
if(g_sql_bt.breakpoint.offset_byte != offset_byte || g_sql_bt.breakpoint.crc_32 != crc_32 || strncmp(g_sql_bt.breakpoint.file_name, file_name, 32) != 0) {
g_sql_bt.breakpoint.offset_byte = offset_byte;
g_sql_bt.breakpoint.crc_32 = crc_32;
strncpy(g_sql_bt.breakpoint.file_name, file_name, strlen(file_name));
g_bt_need_save = true;
}
return true;
}
bool sql_bt_get_breakpoint_info(uint32_t *offset_byte, uint32_t *crc_32, char* file_name)
{
if(g_sql_bt.breakpoint.offset_byte == 0 || g_sql_bt.breakpoint.crc_32 == 0 || strlen(g_sql_bt.breakpoint.file_name) == 0 ||
offset_byte == NULL || crc_32 == NULL || file_name == NULL) {
return false;
}
*offset_byte = g_sql_bt.breakpoint.offset_byte;
*crc_32 = g_sql_bt.breakpoint.crc_32;
strncpy(file_name, g_sql_bt.breakpoint.file_name, strlen(g_sql_bt.breakpoint.file_name));
return true;
}