Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 21 additions & 15 deletions .clangd
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
CompileFlags:
Add:
- -isystem/usr/arm-none-eabi/include/c++/15.2.1
- -isystem/usr/arm-none-eabi/include/c++/15.2.1/arm-none-eabi/thumb/v7e-m+fp/hard
- -isystem/usr/arm-none-eabi/include/c++/15.2.1/backward
- -isystem/usr/lib/gcc/arm-none-eabi/15.2.1/include
- -isystem/usr/lib/gcc/arm-none-eabi/15.2.1/include-fixed
- -isystem/usr/arm-none-eabi/include
Remove:
- -fcallgraph-info*
- -mthumb-interwork
CompilationDatabase: ./build/Debug
Compiler: /usr/bin/arm-none-eabi-gcc
Add:
- -isystem/usr/arm-none-eabi/include/c++/15.2.1
- -isystem/usr/arm-none-eabi/include/c++/15.2.1/arm-none-eabi/thumb/v7e-m+fp/hard
- -isystem/usr/arm-none-eabi/include/c++/15.2.1/backward
- -isystem/usr/lib/gcc/arm-none-eabi/15.2.1/include
- -isystem/usr/lib/gcc/arm-none-eabi/15.2.1/include-fixed
- -isystem/usr/arm-none-eabi/include
- -isystem/home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/arm-none-eabi/include/c++/15.2.1
- -isystem/home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/arm-none-eabi/include/c++/15.2.1/arm-none-eabi/thumb/v7e-m+fp/hard
- -isystem/home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/arm-none-eabi/include/c++/15.2.1/backward
- -isystem/home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/lib/gcc/arm-none-eabi/15.2.1/include
- -isystem/home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/lib/gcc/arm-none-eabi/15.2.1/include-fixed
- -isystem/home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/arm-none-eabi/include
Remove:
- -fcallgraph-info*
- -mthumb-interwork
CompilationDatabase: ./build/Debug
Compiler: /home/yystation/EnvTools/embedded-toolchain/arm-gnu-toolchain/bin/arm-none-eabi-gcc
Diagnostics:
Suppress:
- unused-includes
- drv_unknown_argument
Suppress:
- unused-includes
- drv_unknown_argument
17 changes: 11 additions & 6 deletions .eide/eide.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ virtualFolder:
files:
- path: Application/Src/LDI/app_ldi.c
- path: Application/Src/LDI/app_ldi_cmd.c
- path: Application/Src/LDI/app_ldi_device.c
- path: Application/Src/LDI/app_vms_ctrl.c
- path: Application/Src/LDI/app_ldi_cfg.c
folders: []
Expand Down Expand Up @@ -250,7 +251,9 @@ virtualFolder:
- name: Display
files:
- path: Device/Display/dev_display.c
- path: Device/Display/dev_display_p20.c
- path: Device/Display/dev_display_1_969.c
- path: Device/Display/dev_display_1_577.c
- path: Device/Display/dev_display_1_260.c
folders: []
- name: Platform
files:
Expand Down Expand Up @@ -336,6 +339,8 @@ targets:
- <virtual_root>/Drivers/BSP/Key/key.c
- <virtual_root>/Drivers/BSP/RingBuff/Ringbuffer.c
- <virtual_root>/Drivers/BSP/Display/scan.c
- <virtual_root>/Device/Display/dev_display_1_260.c
- <virtual_root>/Device/Display/dev_display_1_969.c
settings:
debugger: cortex-debug
toolchain: GCC
Expand All @@ -354,7 +359,7 @@ targets:
language-cpp: c++23
one-elf-section-per-data: true
one-elf-section-per-function: true
optimization: level-debug
optimization: level-3
warnings: all-warnings
global:
$float-abi-type: hard
Expand Down Expand Up @@ -415,11 +420,11 @@ targets:
baseAddr: ""
bin: ""
cpuInfo:
cpuName: "null"
vendor: "null"
cpuName: STM32F407ZG
vendor: ST
otherCmds: ""
proType: 1
speed: 8000
speed: 32000
OpenOCD:
baseAddr: "0x08000000"
bin: ""
Expand All @@ -433,7 +438,7 @@ targets:
protocol: swd
speed: 10000
target: STM32F407ZG
uploader: Custom
uploader: JLink
Release:
cppPreprocessAttrs:
defineList:
Expand Down
10 changes: 6 additions & 4 deletions Application/Inc/Channel/app_udp.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
/**
* @file dev_udp.h
* @brief UDP 广播接收通道(Device 层)
* @file app_udp.h
* @brief UDP 广播接收通道
*
* 监听 UDP 广播,用于 IAP 固件升级协议。
* 端口 10011 硬编码,不可修改(升级通道必须保持可连接)。
* 默认监听端口 10011,同口承载:
* - 创迪发现口(LDI 21H/12H)
* - IAP 固件升级(0x5A5A5A5A)
* 端口可改,但出厂联调默认保持 10011。
*/

#pragma once
Expand Down
2 changes: 1 addition & 1 deletion Application/Inc/LDI/app_ldi.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "app_ldi_cfg.h"
#include "ring_buffer.h"

#define DEVICE_NUM (2U) // 本设备使用到的功能模块数量
#define DEVICE_NUM (4U) // 本设备使用到的功能模块数量

#define LDI_TX_BUF_SIZE (512U) // 响应帧拼装缓冲区上限

Expand Down
2 changes: 1 addition & 1 deletion Application/Inc/LDI/app_ldi_cfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
// Flash Sector 11 (0x080E0000~0x080FFFFF, 128KB) 已释放。
// LDI 配置现已迁移至 W25Qxx 最后一个 4KB 扇区,通过 dev_storage_ops 访问。
#define APP_FLASH_LDI_MAGIC 0x0D001B00
#define APP_FLASH_LDI_MAX_MODULES (6U) // Flash 最大可存储的功能模块数量
#define APP_FLASH_LDI_MAX_MODULES (11U) // Flash 最大可存储的功能模块数量

/**
* 单功能模块配置信息(从 0BH 命令下发,共 12 字节)
Expand Down
70 changes: 70 additions & 0 deletions Application/Inc/LDI/app_ldi_device.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/**
* @file app_ldi_device.h
* @brief LDI 设备能力层 — 协议解析与硬件执行解耦
*
* 协议层 (app_ldi_cmd) 只负责校验/分发/回包;
* E6/E7/E8 的实际执行与状态缓存统一由此层提供。
*
* 硬件/协议兼容约定:
* E7 控制 Color: 01H绿 / 02H红 / 03H黄
* E7 0CH 上报(附录 A.1): 00H红灯 / 01H绿灯(无黄)
* 黄灯硬件降级关灯,上报按红灯 00H
* E8 报警器:暂由 Flash_Light 代实现;WorkMode 频率用软闪烁
*/

#pragma once

#include <stdint.h>
#include <stdbool.h>

#include "app_ldi_cmd.h"

/** 控制执行结果:00H=成功, 01H=失败(与 B1H status 一致) */
typedef enum {
LDI_DEV_OK = 0x00,
LDI_DEV_FAIL = 0x01,
} ldi_dev_result_t;

/** E6 显示运行状态缓存(附录 A.1: 00H关闭 / 01H开启) */
typedef struct {
uint8_t running_status;
uint8_t font_color;
uint8_t keep_time;
} ldi_dev_display_sta_t;

/** E7 信号灯状态
* color: 最近一次控制色码 01绿/02红/03黄
* running_status: 附录 A.1 上报码 00红 / 01绿
*/
typedef struct {
uint8_t running_status;
uint8_t color;
} ldi_dev_signal_sta_t;

/** E8 报警器状态(附录 A.1: 00H停止 / 01H报警中) */
typedef struct {
uint8_t running_status;
uint8_t work_mode;
uint8_t keep_time;
} ldi_dev_alarm_sta_t;

void ldi_device_init(void);

/** E6 显示控制/清屏;text_len 为 text[] 有效字节数(不含定长头) */
ldi_dev_result_t ldi_device_display_ctrl(const ldi_ctrl_display_t *ctrl, uint16_t text_len);

/** E7 通行信号灯颜色控制 */
ldi_dev_result_t ldi_device_lane_signal_ctrl(const ldi_ctrl_signal_t *ctrl);

/** E8 报警器开关控制(含 work_mode 频率闪烁 / keep_time 定时关闭) */
ldi_dev_result_t ldi_device_alarm_ctrl(const ldi_ctrl_alarm_t *ctrl);

/** 由 ldi_timer_task 每秒调用:E6 KeepTime / E8 KeepTime+频率闪烁 */
void ldi_device_timer_poll(void);

/** 填充 0CH 上报用的单模块状态(仅写 running_status;附录 A.1 编码) */
bool ldi_device_fill_sta(uint8_t device_type, ldi_device_info_t *info);

const ldi_dev_display_sta_t *ldi_device_display_sta(void);
const ldi_dev_signal_sta_t *ldi_device_lane_signal_sta(void);
const ldi_dev_alarm_sta_t *ldi_device_alarm_sta(void);
7 changes: 7 additions & 0 deletions Application/Inc/app_light_sensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,10 @@ extern osThreadId_t g_light_sensor_task_handle;

void app_light_sensor_init(void);
void app_light_sensor_task(void *argument);

/**
* @brief 设置光敏自动调光的亮度范围(Application 层包装)
* @param min 最低亮度等级 (1~7)
* @param max 最高亮度等级 (1~7)
*/
void app_light_sensor_set_range(uint8_t min, uint8_t max);
41 changes: 37 additions & 4 deletions Application/Inc/app_render.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
/**
* @file app_render.h
* @brief 文字/图形渲染 — tagged union 统一入参
* @brief 文字/图形渲染 — tagged union 统一入参 + 多字库芯片切换
*
* 字库存储为 (字号, 编码, 字型) 三元组的顺序拼接。
* 新增字号/字型只需在 g_font_lib 追加条目。
* 新增渲染类型只需在 render_type_t 和 union 中追加。
* 上电时通过 DEV_KEY_DIP2 拨码开关自动选择字库芯片配置:
* - DIP2 逻辑 0(开关 OFF,GPIO 高)→ W25Q64: 非连续布局, 16/24/32pt, GB2312 94列序
* - DIP2 逻辑 1(开关 ON,GPIO 低)→ MX25L256: 连续布局, 14/16/20/24/32pt, GBK 190列序
*
* 运行中也可通过 app_render_chip_select() 手动切换。
* 每种芯片对应一个 font_chip_config_t 实例,包含地址查找表和自适应字号候选列表。
* 新增字号/字型只需在对应配置的 region 表中追加条目。
*/

#pragma once
Expand Down Expand Up @@ -93,11 +97,40 @@ typedef struct {
};
} render_cfg_t;

/* ---- 字库芯片配置 ---- */

/** @brief 字库芯片配置 — 每种芯片一个实例 */
typedef struct {
const char *name; /* 配置名称 */
const void *regions; /* flash_region_t 数组指针 */
uint8_t region_count; /* 数组元素个数 */
const font_size_t *adaptive_sizes; /* 自适应字号候选列表(从大到小) */
uint8_t adaptive_count; /* 候选列表长度 */
bool ascii_raw_code; /* true=ASCII 用原始字符码(W25Q64); false=减 0x20(MX25L256) */
bool gbk_index_190; /* true=GBK 用 190 列序(MX25L256); false=94 列序(W25Q64) */
} font_chip_config_t;

/** @brief 芯片配置ID */
typedef enum {
FONT_CHIP_W25Q64 = 0, /* W25Q64: 非连续布局, 16/24/32, ASCII 用原始字符码 */
FONT_CHIP_MX25L256 = 1, /* MX25L256: 连续布局, 14/16/20/24/32, ASCII 用 ch-0x20 */
FONT_CHIP_CNT,
} font_chip_id_t;

/* ---- API(模块自注册 sw_app_initcall,调用方无需传 display/font 句柄)---- */

/** @brief 统一渲染入口 — 根据 cfg->type 分派到内部实现 */
void app_render(const render_cfg_t *cfg);

/** @brief 切换字库芯片配置 — 可在任意时刻调用,立即生效
* @param id 芯片配置ID (FONT_CHIP_W25Q64 / FONT_CHIP_MX25L256)
* @return true=切换成功, false=无效ID */
bool app_render_chip_select(font_chip_id_t id);

/** @brief 获取当前激活的字库芯片配置
* @return 当前配置ID */
font_chip_id_t app_render_chip_current(void);

/* ---- 持久化显示 ---- */

#define RENDER_PERSIST_MAGIC (0x0d000721U)
Expand Down
11 changes: 11 additions & 0 deletions Application/Inc/app_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

#pragma once

#include <stdint.h>

/** @brief 运行全部测试用例 */
void app_test_run(void);

Expand All @@ -22,3 +24,12 @@ void app_test_io_output(void);

/** @brief LED 灯序测试:逐通道逐像素点亮 hub75_buff,用于确认物理灯序映射 */
void app_test_led_mapping(void);

/** @brief 扫描行顺序测试:逐行点亮水平线,确认 1/8 扫描的行地址映射 */
void app_test_scan_line_order(void);

/** @brief 对角线测试:验证整体坐标映射是否正确 */
void app_test_diagonal(void);

/** @brief prepare 映射测试:通过 set_pixel 逐像素点亮,验证 prepare 像素重排是否正确 */
void app_test_prepare_mapping(void);
2 changes: 1 addition & 1 deletion Application/Src/Channel/app_tcp_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ __STATIC_INLINE void tcp_keepaliveinit(struct netconn *conn);
/* ---- 连接任务属性 ---- */
const osThreadAttr_t tcp_client_conn_attr = {
.name = "tcp_client_conn_task",
.stack_size = 256 * 4,
.stack_size = 256 * 8,
.priority = osPriorityNormal,
};

Expand Down
33 changes: 23 additions & 10 deletions Application/Src/Channel/app_udp.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
/**
* @file dev_udp.c
* @brief UDP 广播接收通道(监听端口 10011)
* @file app_udp.c
* @brief UDP 广播接收通道(默认端口 10011)
*
* 同端口承载两类协议(由 app_dispatch 按帧头分流):
* - 创迪发现口:LDI 21H/12H 搜索
* - IAP 升级:0x5A5A5A5A 帧
*/

#include "app_udp.h"
Expand All @@ -9,7 +13,7 @@
#include "pl_net_adapt.h"

/* ---- 配置 ---- */
static uint16_t g_udp_port = 10011; /**< IAP 升级通道 */
static uint16_t g_udp_port = 10011; /**< 创迪发现口 + IAP 共用 */

void app_udp_set_port(uint16_t port)
{
Expand All @@ -27,6 +31,11 @@ void app_udp_broadcast(const uint8_t *data, uint16_t len)
if (conn == NULL) return;

ip_set_option(conn->pcb.udp, SOF_BROADCAST);
if (netconn_bind(conn, IP_ADDR_ANY, g_udp_port) != ERR_OK) {
netconn_delete(conn);
return;
}

ip_addr_t bc_addr;
IP4_ADDR(&bc_addr, 255, 255, 255, 255);

Expand Down Expand Up @@ -103,24 +112,28 @@ void udp_task(void *argument)
udp_disconnect_sem = osSemaphoreNew(1, 0, NULL);
pl_net_register_link_listener(udp_link_listener);

struct netconn *conn = netconn_new(NETCONN_UDP);
if (conn == NULL) {
osThreadExit();
return;
}

for (;;) {
struct netconn *conn = netconn_new(NETCONN_UDP);
if (conn == NULL) {
osDelay(2000);
continue;
}

ip_set_option(conn->pcb.udp, SOF_BROADCAST);
err_t err = netconn_bind(conn, IP_ADDR_ANY, g_udp_port);

if (err == ERR_OK) {
/* 清空残留断开信号,避免刚起来就误退 */
while (osSemaphoreAcquire(udp_disconnect_sem, 0) == osOK);

osThreadId_t tid = osThreadNew(udp_connect_task, conn, &udp_connect_attr);
if (tid != NULL)
if (tid != NULL) {
/* 链路断开 / recv 失败后由 connect_task 释放信号量 */
osSemaphoreAcquire(udp_disconnect_sem, osWaitForever);
}
}

/* 每次循环新建 netconn:delete 后不可再 bind 旧句柄 */
netconn_delete(conn);
osDelay(2000);
}
Expand Down
2 changes: 1 addition & 1 deletion Application/Src/IAP/app_iap.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @brief IAP 固件升级协议处理
*
* 帧格式: 0x5A5A5A5A (4B) | seq (4B) | cmd (4B) | len (4B) | data | CRC32 (4B)
* 承载于 RS485 + UDP,配置存储于 Flash 0x08004000。
* 承载于 RS485 + UDP,配置存储于 Flash 0x08004000。
*/

#include "app_iap.h"
Expand Down
Loading