纯小白对大佬tsl0092的nrf52811墨水屏时钟全刷改局刷的探索-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug

纯小白对大佬tsl0092的nrf52811墨水屏时钟全刷改局刷的探索

 

由于本人是纯小白,在github上下载了大佬tsl0092的一个开源代码,此代码为蓝牙nrf52811为主控的墨水屏日历及时间显示代码,日历是每天全刷一次,非常好,时间是每分钟全刷一次,感觉有点不实用,每分钟都要闪几秒,而且非常耗电,大佬也不愿开放局刷代码,对于我这种完全一窍不通,又菜又爱玩的小白来讲,想改一下,真是无从下手,虽然在大佬眼中,中分分钟的事,但我得花一年才能搞好。下面是我通过研究代码,结合ia,修改的代码,还没完全验证,先记录下来备用,请高手指点,不胜感激!

将电子纸每分钟全刷改为局刷的实现方案

要将现有的每分钟全屏幕刷新改为局部刷新,需要从显示模式控制、更新逻辑和驱动层接口三个层面进行修改。以下是详细的修改方案:

一、数据结构与模式定义调整

首先需要在数据结构中添加局刷相关的标志位,并扩展显示模式定义:

// 扩展显示模式定义,新增局刷时钟模式 typedef enum {     MODE_NONE = 0,     MODE_CALENDAR = 1,     MODE_CLOCK = 2,     MODE_CLOCK_PARTIAL = 3  // 新增:局刷时钟模式 } display_mode_t;  // 在ble_epd_t结构体中添加局刷标志 typedef struct {     // 原有字段...     display_mode_t      display_mode;        // 显示模式     bool                use_partial_update;  // 新增:局刷启用标志     // 其他字段... } ble_epd_t;

修改说明

  • 新增 MODE_CLOCK_PARTIAL 模式用于局刷时钟显示
  • 添加 use_partial_update 标志位,可动态控制是否使用局刷
二、定时器更新逻辑修改

核心的定时器函数需要调整更新条件和模式判断:

原函数代码:

void ble_epd_on_timer(ble_epd_t * p_epd, uint32_t timestamp, bool force_update) {     // Update calendar on 00:00:00, clock on every minute     if (force_update ||          (p_epd->display_mode == MODE_CALENDAR && timestamp % 86400 == 0) ||         (p_epd->display_mode == MODE_CLOCK && timestamp % 60 == 0)) {         epd_gui_update_event_t event = { p_epd, timestamp };         app_sched_event_put(&event, sizeof(epd_gui_update_event_t), epd_gui_update);     } }

修改后的函数:

void ble_epd_on_timer(ble_epd_t * p_epd, uint32_t timestamp, bool force_update) {     bool need_update = false;          // 判断更新条件(新增局刷模式逻辑)     if (force_update) {         need_update = true;         // 强制更新时使用全刷         p_epd->use_partial_update = false;     }      else if (p_epd->display_mode == MODE_CALENDAR && timestamp % 86400 == 0) {         need_update = true;         // 日历模式仍使用全刷         p_epd->use_partial_update = false;     }      else if ((p_epd->display_mode == MODE_CLOCK || p_epd->display_mode == MODE_CLOCK_PARTIAL) && timestamp % 60 == 0) {         need_update = true;         // 局刷时钟模式启用局刷         p_epd->use_partial_update = (p_epd->display_mode == MODE_CLOCK_PARTIAL);     }          if (need_update) {         epd_gui_update_event_t event = { p_epd, timestamp };         app_sched_event_put(&event, sizeof(epd_gui_update_event_t), epd_gui_update);     } }

关键修改点

  1. 新增 MODE_CLOCK_PARTIAL 模式判断
  2. 根据模式设置 use_partial_update 标志
  3. 强制更新时始终使用全刷(确保关键数据正确显示)
  4. 日历模式仍保持每日全刷(日历信息变化范围大,局刷难度高)
三、界面更新函数修改

需要在界面更新函数中根据局刷标志选择不同的刷新方式:

原函数代码:

static void epd_gui_update(void * p_event_data, uint16_t event_size) {     epd_gui_update_event_t *event = (epd_gui_updat
请登录后发表评论

    没有回复内容