Files
ZhaTianRC/Core/Inc/storage.h

112 lines
3.6 KiB
C

/**
* Flash 存储模块 (模拟 EEPROM)
* 使用 STM32F103 内部 Flash 最后一页存储配置
* Flash: 128KB, 页大小 1KB, 最后一页 0x0801FC00
*/
#ifndef STORAGE_H
#define STORAGE_H
#include "main.h"
#include "nrf24l01.h"
#include "pwm_out.h"
#include <string.h>
/* Flash 页地址 (最后一页, 不占用程序空间) */
#define STORAGE_PAGE_SIZE 1024
#define FLASH_STORAGE_ADDR 0x0801FC00 /* Page 127 (128KB Flash, 最后一页) */
/* 模型最大数量 */
#define MODEL_MAX_COUNT 16
#define MODEL_NAME_LEN 9 /* 8字符 + '\0' */
/* 模型类型 */
#define MODEL_TYPE_AIRPLANE 0
#define MODEL_TYPE_CAR 1
#define MODEL_TYPE_BOAT 2
#define MODEL_TYPE_MULTIROTOR 3
/* 通道数 */
#define CHANNEL_COUNT 16
/* 输入类型 */
#define INPUT_TYPE_ADC 0
#define INPUT_TYPE_KEY 1
#define INPUT_TYPE_NONE 0xFF
/* 混控类型 */
#define MIXER_TYPE_NONE 0
#define MIXER_TYPE_SIMPLE 1 /* 简单比例 */
#define MIXER_TYPE_DELTA 2 /* 三角翼混控 */
#define MIXER_TYPE_VTAIL 3 /* V尾混控 */
#define MIXER_TYPE_ELEVON 4 /* 升降副翼 */
/* 回传信息项 */
#define TELEM_VOLTAGE 0
#define TELEM_RSSI 1
#define TELEM_PACKET_LOSS 2
#define TELEM_TEMP 3
#define TELEM_COUNT 4
/* ---- 模型结构体 ---- */
typedef struct {
char name[MODEL_NAME_LEN]; /* 模型名称 */
uint8_t type; /* 模型类型 */
uint8_t channel_map[CHANNEL_COUNT]; /* 通道映射: CHx -> ADC_INy 或 KEY_INy */
uint8_t input_type[CHANNEL_COUNT]; /* 输入类型: INPUT_TYPE_ADC/KEY */
uint8_t mixer_type[CHANNEL_COUNT]; /* 混控类型 */
int16_t mixer_scale[CHANNEL_COUNT]; /* 混控比例 (x100) */
int16_t mixer_offset[CHANNEL_COUNT];/* 混控偏移 */
uint8_t telem_enable[TELEM_COUNT]; /* 回传信息使能 */
} Model_t;
/* ---- 全局配置结构体 ---- */
typedef struct {
uint8_t magic[4]; /* 魔数 "LOLI" */
uint8_t active_model; /* 当前活动模型索引 */
Model_t models[MODEL_MAX_COUNT]; /* 模型列表 */
/* 高频头配置 */
uint8_t rf_type; /* 0=NRF24, 1=CRFS */
uint8_t nrf_channel; /* NRF24 频道 */
uint8_t nrf_rate; /* 速率 */
uint8_t nrf_power; /* 功率 */
uint8_t nrf_addr[5]; /* 地址 */
char nrf_phrase[7]; /* 对频短语 */
/* CRFS 配置 */
uint16_t crfs_packet_rate; /* 数据包速率 */
uint8_t crfs_telemetry_ratio; /* 遥测比例 */
uint8_t crfs_power; /* 功率 */
/* PWM 配置 */
uint8_t pwm1_mode; /* PWM_OUT1 模式 */
uint8_t pwm2_mode; /* PWM_OUT2 模式 */
uint8_t ws2812_effect; /* WS2812 效果 */
uint8_t led_brightness; /* LED 亮度 */
uint8_t vibrate_level; /* 振动档位 */
/* 首页设置 */
uint8_t home_page; /* 0=回传, 1=INx值 */
/* CRC32 校验 */
uint32_t crc32;
} Config_t;
/* 函数声明 */
void Storage_Init(void);
void Storage_Load(void); /* 从 Flash 加载配置 */
void Storage_Save(void); /* 保存配置到 Flash */
void Storage_Reset(void); /* 恢复出厂设置 */
/* 模型操作 */
uint8_t Storage_ModelAdd(const char *name, uint8_t type);
void Storage_ModelDelete(uint8_t idx);
void Storage_ModelSelect(uint8_t idx);
Model_t* Storage_GetActiveModel(void);
Model_t* Storage_GetModel(uint8_t idx);
/* 全局配置访问 */
extern Config_t g_config;
#endif /* STORAGE_H */