Files
Ender-3V3-SE/Marlin/src/lcd/dwin/ui_dacai.cpp
T
CrealityTech e7b2bad8ff First commit for Ender-3V3 SE
First commit for Ender-3V3 SE
2024-07-10 13:47:44 +08:00

785 lines
21 KiB
C++
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
#include <wstring.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Arduino.h>
#include "ui_dacai.h"
// #include <libmaple/usart.h>
#include "../../MarlinCore.h"
#include "../../inc/MarlinConfig.h"
#include "../../core/serial.h"
#include "../../core/macros.h"
#include "../../../Configuration.h"
#include "dwin_lcd.h"
#ifdef LCD_SERIAL_PORT
#define LCDSERIAL LCD_SERIAL
#elif SERIAL_PORT_2
#define LCDSERIAL LCDSERIAL
#endif
uint8_t IsDacaiScreenConnect = true;
char unitBuf[4][10] = {"", "%", "mm", ""};
//#if ENABLED(UI_SHOW_t)
inline uint16_t work16(const uint8_t high, const uint8_t low) { return (high) << 8U | (low); }
UI_SHOW_t uiShow;
// dwin模块初始化(串口号为LCD_SERIAL_PORT)
void UI_SHOW_t::RTS_Init(void)
{
#ifndef LCD_BAUDRATE
#define LCD_BAUDRATE 115200
#endif
SERIAL_ECHO("lcd serial init");
LCDSERIAL.begin(LCD_BAUDRATE);
const millis_t serial_connect_timeout = millis() + 1000UL;
while (!LCDSERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
delay(500); // 延时等待屏幕准备好
for (uint8_t i = 0; i < 5; i++)
{
if (UI_Handshake())
{
SERIAL_ECHO("\r\n RTS_Init OK!!!");
IsDacaiScreenConnect = true;
break;
}
else
{
SERIAL_ECHO("\r\n RTS_Init failse!!!");
IsDacaiScreenConnect = false;
continue;
}
}
}
UI_SHOW_t::UI_SHOW_t()
{
recdat.head = CMD_HEAD;
frameEnd[0] = FBONE;
frameEnd[1] = FBTWO;
frameEnd[2] = FBTHREE;
frameEnd[3] = FBFOUR;
memset(databuf,0, sizeof(databuf));
}
static inline void dwin_uart_write(unsigned char *buf, int len)
{
LOOP_L_N(n, len) { LCDSERIAL.write(buf[n]); }
}
void UI_SHOW_t::RTS_SndData(void)
{
if(snddat.head == CMD_HEAD)
{
databuf[0] = snddat.head;
databuf[1] = snddat.cmd_type; // 命令类型
databuf[2] = snddat.ctrl_msg; // 消息类型
// 表示上传的组态控件指令
if (/*work16(snddat.cmd_type, snddat.ctrl_msg) == CMD_SEND_TO_SCREEN && */snddat.bytelen >= 7)
{
databuf[3] = snddat.screen_id >> 8;
databuf[4] = snddat.screen_id & 0x00FF;
databuf[5] = snddat.control_id >> 8;
databuf[6] = snddat.control_id & 0xFF;
if ((snddat.bytelen - 7) != 0)
{
memcpy(&databuf[7], snddat.data, (snddat.bytelen - 7));
}
// 增加帧尾
memcpy(&databuf[7 + (snddat.bytelen - 7)], frameEnd, 4);
}
dwin_uart_write(databuf, snddat.bytelen + 4);
memset(&snddat, 0, sizeof(snddat));
memset(databuf, 0, sizeof(databuf));
snddat.head = CMD_HEAD;
}
}
void UI_SHOW_t::RTS_SndData(const String &s, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd /*= VarAddr_W*/)
{
if(s.length() < 1)
{
return;
}
RTS_SndData(s.c_str(), _screen_id, _control_id, cmd);
}
void UI_SHOW_t::RTS_SndData(const char *str, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/)
{
int len = strlen(str);
int i = 0;
if( len >= 0)
{
databuf[0] = CMD_HEAD;
databuf[1] = cmd >> 8; // 命令类型
databuf[2] = cmd & 0x00FF; // 消息类型
databuf[3] = _screen_id >> 8;
databuf[4] = _screen_id & 0x00FF;
databuf[5] = _control_id >> 8;
databuf[6] = _control_id & 0xFF;
for(i = 0; i < len ; i++)
{
databuf[7 + i] = str[i];
}
// 增加帧尾
memcpy(&databuf[7 + i], frameEnd, 4);
dwin_uart_write(databuf, len + 11);
memset(databuf, 0, sizeof(databuf));
}
}
void UI_SHOW_t::RTS_SndData(char c, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/)
{
snddat.head = CMD_HEAD;
snddat.cmd_type = cmd >> 8; // 命令类型
snddat.ctrl_msg = cmd & 0x00FF; // 消息类型
snddat.screen_id = _screen_id;
snddat.control_id = _control_id;
snddat.data[0] = c;
snddat.bytelen = 8;
RTS_SndData();
}
void UI_SHOW_t::RTS_SndData(unsigned char* str, unsigned long addr, unsigned long addr1, unsigned long cmd)
{
RTS_SndData((char *)str, addr, addr1, cmd);
}
void UI_SHOW_t::RTS_SndData(int n, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/)
{
snddat.head = CMD_HEAD;
snddat.cmd_type = cmd >> 8; // 命令类型
snddat.ctrl_msg = cmd & 0x00FF; // 消息类型
snddat.screen_id = _screen_id;
snddat.control_id = _control_id;
if (cmd == CMD_ICON_SET_FRAME || cmd == CMD_ICON_SHOW_HIDE)
{
snddat.data[0] = n & 0xFF;
snddat.bytelen = 8;
}
else
{
// if(cmd == CMD_SEND_TO_SCREEN)
if(n > 0xFFFF)
{
snddat.data[0] = n >> 24;
snddat.data[1] = (n >> 16) & 0xFF;
snddat.data[2] = (n >> 8) & 0xFF;
snddat.data[3] = n & 0xFF;
snddat.bytelen = 11;
}
else
{
snddat.data[0] = (n >> 8) & 0xFF;
snddat.data[1] = n & 0xFF;
snddat.bytelen = 9;
}
}
RTS_SndData();
}
void UI_SHOW_t::RTS_SndData(unsigned int n, unsigned long addr, unsigned long addr1, unsigned long cmd)
{
RTS_SndData((int)n, addr, addr1, cmd);
}
void UI_SHOW_t::RTS_SndData(float n, unsigned long addr, unsigned long addr1, unsigned long cmd)
{
RTS_SndData((int)n, addr, addr1, cmd);
}
void UI_SHOW_t::RTS_SndData(long n, unsigned long addr, unsigned long addr1, unsigned long cmd)
{
RTS_SndData((unsigned long)n, addr, addr1, cmd);
}
void UI_SHOW_t::RTS_SndData(unsigned long n, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/)
{
snddat.head == CMD_HEAD;
snddat.cmd_type = cmd >> 8; // 命令类型
snddat.ctrl_msg = cmd & 0x00FF; // 消息类型
snddat.screen_id = _screen_id;
snddat.control_id = _control_id;
if(work16(snddat.cmd_type, snddat.ctrl_msg) == CMD_SEND_TO_SCREEN)
{
if(n > 0xFFFF)
{
snddat.data[0] = n >> 24;
snddat.data[1] = (n >> 16) & 0xFF;
snddat.data[2] = (n >> 8) & 0xFF;
snddat.data[3] = n & 0xFF;
snddat.bytelen = 11;
}
else
{
snddat.data[0] = (n >> 8) & 0xFF;
snddat.data[1] = n & 0xFF;
snddat.bytelen = 9;
}
}
RTS_SndData();
}
/* 发送的数据不用指定 页面ID、控件ID */
void UI_SHOW_t::RTS_SndData(int n, unsigned long cmd/* = CMD_GOTO_SCREEN*/)
{
if(cmd == CMD_GOTO_SCREEN)
{
databuf[0] = CMD_HEAD;
databuf[1] = cmd >> 8; // 命令类型
databuf[2] = cmd & 0x00FF; // 消息类型
databuf[3] = n >> 8;
databuf[4] = n & 0xFF;
// 增加帧尾
memcpy(&databuf[5], frameEnd, 4);
dwin_uart_write(databuf, 9);
memset(databuf, 0, sizeof(databuf));
}
}
bool UI_SHOW_t::UI_Handshake(void)
{
uint8_t receivedbyte;
uint8_t cmd_pos = 0;
uint8_t buffer[10];
// 队列帧尾检测状态
static uint32_t cmd_state = 0;
uint8_t handBuf[6] = {0xEE, 0x55, 0xFF, 0xFC, 0xFF, 0xFF};
// 发送握手信息
databuf[0] = CMD_HEAD;
databuf[1] = 0x04;
memcpy(&databuf[2], frameEnd, 4);
dwin_uart_write(databuf, 6);
memset(databuf, 0, sizeof(databuf));
delay(10);
while(LCD_SERIAL.available())
{
// 取一个数据
receivedbyte = LCD_SERIAL.read();
//指令的第一个字节必须是帧头
if(cmd_pos == 0 && receivedbyte != CMD_HEAD)
{
continue;
}
if(cmd_pos < 10)
{
// 防止溢出
buffer[cmd_pos++] = receivedbyte;
}
else
{
break;
}
// 拼接最后4字节,组成最后一个32位整数
cmd_state = ((cmd_state << 8) | receivedbyte);
delay(2);
// 帧尾判断
if(cmd_state == CMD_TAIL)
{
for (int i = 0; i < cmd_pos; i++)
{
SERIAL_ECHOLNPAIR(" ", buffer[i]);
}
if (memcmp(buffer, handBuf, sizeof(handBuf)) == 0)
{
return true;
}
cmd_state = 0; // 重新检测帧尾
cmd_pos = 0; // 复位指令指针
}
}
return false;
}
//切换界面
void UI_SHOW_t::UI_GotoScreen(int screen)
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
RTS_SndData(screen);
}
/*
* frame ICON控件中的第frame个图标
* _screen_id 图片页面
* _control_id: 控件ID
* cmd == CMD_ICON_SET_FRAME: 设置与“图标控件”、“动画控件” 的显示(指定帧播放)
* Screen_id(2个字节) + Control_id(2个字节) + FlashImgae_ID(1个字节)某一动画帧ID
*
* cmd == CMD_ICON_START: 启动动画播放, 此时frame无效
* Screen_id(2个字节) + Control_id(2个字节)
*
* cmd == CMD_ICON_STOP: 停止动画播放, 此时frame无效
* Screen_id(2个字节) + Control_id(2个字节)
*
* cmd == CMD_ICON_PAUSE: 暂停动画播放, 此时frame无效
* Screen_id(2个字节) + Control_id(2个字节)
*/
void UI_SHOW_t::UI_ShowIcon(int frame , unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_ICON_SET_FRAME*/)
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
if (cmd == CMD_ICON_SET_FRAME)
{
RTS_SndData(frame, _screen_id, _control_id, cmd);
}
else if (cmd == CMD_ICON_START || cmd == CMD_ICON_STOP || cmd == CMD_ICON_PAUSE)
{
snddat.head = CMD_HEAD;
snddat.cmd_type = cmd >> 8; // 命令类型
snddat.ctrl_msg = cmd & 0x00FF; // 消息类型
snddat.screen_id = _screen_id;
snddat.control_id = _control_id;
snddat.bytelen = 7;
RTS_SndData();
}
}
/*
* 功能: ICON控件的控制
* _screen_id 图片页面
* _control_id: 控件ID
* cmd == CMD_ICON_SHOW_HIDE: 显示或隐藏控件
* Screen_id(2个字节) + Control_id(2个字节) + Enable(1个字节) 0x00:屏蔽或隐藏控件;  0x01: 屏蔽/隐藏解除
*
* 注意:1、控件使用‘自动播放’且 ‘初始化显示’先择为 '否' 时,把控件显示出来,才开始第一次播放
*/
void UI_SHOW_t::UI_ShowOrHideConctrols(bool isDisplay , unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_ICON_SHOW_HIDE*/)
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
if (cmd == CMD_ICON_SHOW_HIDE)
{
RTS_SndData(isDisplay, _screen_id, _control_id, cmd);
}
}
void UI_SHOW_t::UI_ShowText(char* n , unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_SEND_TO_SCREEN*/)
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
RTS_SndData(n, _screen_id, _control_id, cmd);
}
/*
* n: 需要发送的内容
* _screen_id 图片页面
* _control_id: 控件ID
* cmd == CMD_SEND_TO_SCREEN: 发送字符串到屏幕显示
* Screen_id(2个字节) + Control_id(2个字节) + Strings(不定长)
* cmd == CMD_TEXT_TWINKLE: 设置文本闪烁,闪烁周期(10毫秒单位),0表示不闪烁
* Screen_id(2个字节) + Control_id(2个字节) + Cycle(2个字节)
* cmd == CMD_TEXT_ROLL: 设置文本滚动,文本滚动速度(每秒移动像素),0表示不滚动
* Screen_id(2个字节) + Control_id(2个字节) + Speed(2个字节)
* cmd == CMD_TEXT_COLOR_FORE: 文本-前景色
* Screen_id(2个字节) + Control_id(2个字节) + BK_Color(2个字节)
*/
void UI_SHOW_t::UI_ShowText(int n , // 需要发送的内容(数据 或 控件属性设置)
unsigned long _screen_id, // 所在屏幕ID
unsigned long _control_id, // 控件ID
unsigned long cmd/* = CMD_SEND_TO_SCREEN*/, // 命令,默认为 CMD_SEND_TO_SCREEN(发送文本到屏幕)
uint8_t unit) // 单位
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
static char txt[15] = {0};
memset(txt, 0, sizeof(txt));
// 注意:根据大彩协议,对于文本的显示需要转换成字符串,对于文本的属性(文本闪烁、文本滚动、设置颜色等,不需要转变成字符串)
if (cmd == CMD_SEND_TO_SCREEN)
{
itoa(n, txt, 10);
// 单位处理
if (unit != U_NULL)
{
strcat(txt, unitBuf[unit]);
}
UI_ShowText(txt, _screen_id, _control_id, cmd);
}
else
{
RTS_SndData(n, _screen_id, _control_id, cmd);
}
}
void UI_SHOW_t::UI_ShowText(float n , // 需要显示的数字
uint8_t ndigit, // 小数位数
unsigned long _screen_id, // 所在屏幕ID
unsigned long _control_id, // 控件ID
unsigned long cmd/* = CMD_SEND_TO_SCREEN*/,
uint8_t unit/* = U_NULL*/) // 单位
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
char txt[15];
char isNegative = false; // 是否为负数标志
int len = 0;
int integer;
int decimal ; // = (int)((unsigned long)(n*1000))%1000;
if (n < 0)
{
isNegative = true;
n = -n;
}
integer = n; // 整数部分
// 小数部分
if (ndigit == 3)
{
decimal = (int)((unsigned long)(n*1000))%1000;
}
else if (ndigit == 2)
{
decimal = (int)((unsigned long)(n*100))%100;
}
else
{
decimal = (int)((unsigned long)(n*10))%10;
}
itoa(integer, txt, 10);
len = strlen(txt);
txt[len++] = '.';
// itoa(decimal, &txt[len+1], 10);
// 小数部分
if (ndigit == 3)
{
txt[len++] = decimal/100 + 0x30;
txt[len++] = decimal%100/10 + 0x30;
txt[len++] = decimal%10 + 0x30;
}
else if (ndigit == 2)
{
txt[len++] = decimal/10 + 0x30;
txt[len++] = decimal%10 + 0x30;
}
else
{
txt[len++] = decimal%10 + 0x30;
}
// 单位处理
if (unit != U_NULL)
{
int unitLen = strlen(unitBuf[unit]);
memcpy(&txt[len++], &unitBuf[unit], unitLen);
len += unitLen;
}
txt[len++] = '\0';
// 特殊处理浮点型
if (isNegative)
{
for (int i = sizeof(txt) - 1; i > 0; i--)
{
txt[i] = txt[i - 1];
}
txt[0] = '-';
}
UI_ShowText(txt, _screen_id, _control_id, cmd);
}
void UI_SHOW_t::UI_ShowTextClear(unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_SEND_TO_SCREEN*/)
{
// 检测不是大彩屏连接,直接返回
// if (!IsDacaiScreenConnect)
// return;
RTS_SndData("", _screen_id, _control_id, cmd);
}
void UI_SHOW_t::UI_ShowTextUnicode(const char *str, const int strlen, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/)
{
// if (!IsDacaiScreenConnect)
// return;
int len = strlen;
// SERIAL_ECHOLNPAIR("\r\n\r\n\r\n len = ", len);
int i = 0;
if( len >= 0)
{
databuf[0] = CMD_HEAD;
databuf[1] = cmd >> 8; // 命令类型
databuf[2] = cmd & 0x00FF; // 消息类型
databuf[3] = _screen_id >> 8;
databuf[4] = _screen_id & 0x00FF;
databuf[5] = _control_id >> 8;
databuf[6] = _control_id & 0xFF;
for(i = 0; i < len ; )
{
databuf[7 + i] = str[i + 1];
databuf[7 + i + 1] = str[i];
if (databuf[7 + i] == 0 && databuf[7 + i + 1] == 0)
{
break;
}
i = i + 2;
}
databuf[7 + i] = 0;
databuf[7 + i + 1] = 0;
// 增加帧尾
memcpy(&databuf[7 + i + 2], frameEnd, 4);
dwin_uart_write(databuf, i + 2 + 13);
memset(databuf, 0, sizeof(databuf));
}
}
unsigned long arr_data_num;
/**
* 功能: 发送jpg图片前的握手动作
* jpeg: 指向图片数据的指针
* path: 发送的路径
*/
bool UI_SHOW_t::UI_SendJpegDateHandshake(unsigned long size, const char *path)
{
// 当使用大彩屏时
if (!IsDacaiScreenConnect)
return true;
uint8_t receivedbyte;
uint8_t cmd_pos = 0;
uint8_t buffer[10];
uint32_t cmd_state = 0; // 队列帧尾检测状态
uint8_t cmd_dl_response[7] = {0xEE,0xFB,0x01,0xFF,0xFC,0xFF,0xFF}; // 屏幕返回的下载确认命令
unsigned long jpgSize = size;
// 下载命令
databuf[0] = CMD_HEAD;
databuf[1] = 0xFB;
// 下载包大小
databuf[2] = (DACAI_JPG_BYTES_PER_BUF>>8)&0xff;
databuf[3] = (DACAI_JPG_BYTES_PER_BUF)&0xff;
// 零食波特率,不修改时,设置0
databuf[4] = (0>>8)&0xff;
databuf[5] = (0)&0xff;
// 文件大小
databuf[6] = (jpgSize>>24)&0xff;
databuf[7] = (jpgSize>>16)&0xff;
databuf[8] = (jpgSize>>8)&0xff;
databuf[9] = (jpgSize)&0xff;
// 文件路径
memcpy(&databuf[10], path, strlen(path));
// 增加帧尾
memcpy(&databuf[strlen(path) + 12], frameEnd, 4);
// 发送命令帧
// SERIAL_ECHO("\r\n ");
// for (int aa = 0; aa <= strlen(path) + 16; aa++) {
// SERIAL_ECHO(databuf[aa]);
// SERIAL_ECHO(" ");
// }
dwin_uart_write(databuf, strlen(path) + 16);
memset(databuf, 0, sizeof(databuf));
delay(20);
uint32_t ms = millis();
uint32_t MsTest = millis();
while(1)
{
watchdog_refresh();
if (millis() - ms >= 3000)
{
return false;
}
// 接收处理
if(LCD_SERIAL.available())
{
// 取一个数据
receivedbyte = LCD_SERIAL.read();
if(cmd_pos == 0 && receivedbyte != CMD_HEAD)
{
// 指令的第一个字节必须是帧头
continue;
}
if(cmd_pos < 10)
{
// 防止溢出
buffer[cmd_pos++] = receivedbyte;
}
else
{
return false;
}
// 拼接最后4字节,组成最后一个32位整数
cmd_state = ((cmd_state << 8) | receivedbyte);
delay(2);
// 帧尾判断
if(cmd_state == CMD_TAIL)
{
// for (int i = 0; i < cmd_pos; i++)
// SERIAL_ECHOLNPAIR(" ", buffer[i]);
if (memcmp(buffer, cmd_dl_response, sizeof(cmd_dl_response)) == 0)
{
break;
}
// 重新检测帧尾
cmd_state = 0;
}
}
}
if (ENABLED(USER_LOGIC_DEUBG))
{
SERIAL_ECHOLNPAIR("\r\n UI_SendJpegDateHandshake time1 = ", millis() - MsTest);
}
// DWIN_Handshake();
return true;
}
/**
* 功能: 发送jpg图片整包数据
* jpeg: 指向图片数据的指针
* size: 图片数据长度(从gcode里面读取出来)
*/
bool UI_SHOW_t::UI_SendJpegDate(const char *jpeg, unsigned long size)
{
static char buf[DACAI_JPG_BYTES_PER_BUF] = {0};
unsigned long jpgSize = size;
static uint8_t sn = 0;
uint16_t i, j;
uint16_t checkSum = 0;
int sendPacket;
uint32_t MS = millis();
databuf[0] = 0xAA;
databuf[1] = 0xC0;
databuf[4 + DACAI_JPG_BYTES_PER_PACKET] = 0xCC;
databuf[4 + DACAI_JPG_BYTES_PER_PACKET + 1] = 0x33;
databuf[4 + DACAI_JPG_BYTES_PER_PACKET + 2] = 0xC3;
databuf[4 + DACAI_JPG_BYTES_PER_PACKET + 3] = 0X3C;
for (i = 0; i < jpgSize / DACAI_JPG_BYTES_PER_FRAME; i++)
{
// 发送命令帧 -- dwin_uart_write 这个接口传入的字节长度不要超255
for (sendPacket = 0; sendPacket < jpgSize / DACAI_JPG_BYTES_PER_PACKET; sendPacket++)
{
// SERIAL_ECHOLN(sendPacket);
// SERIAL_ECHOLN(arr_data_num);
databuf[2] = (arr_data_num) >> 8;
databuf[3] = (arr_data_num) & 0xFF;
arr_data_num += 120;
memcpy(&databuf[4], &jpeg[sendPacket * DACAI_JPG_BYTES_PER_PACKET], DACAI_JPG_BYTES_PER_PACKET);
watchdog_refresh();
dwin_uart_write(databuf, DACAI_JPG_BYTES_PER_PACKET + 8);
watchdog_refresh();
delay(5);
}
// 2048字节发送完剩下的
if(jpgSize % DACAI_JPG_BYTES_PER_PACKET)
{
j = (jpgSize - DACAI_JPG_BYTES_PER_PACKET * sendPacket);
databuf[2] = (arr_data_num) >> 8;
databuf[3] = (arr_data_num) & 0xFF;
arr_data_num+=j/2;
databuf[4 + j] = 0xCC;
databuf[4 + j + 1] = 0x33;
databuf[4 + j + 2] = 0xC3;
databuf[4 + j + 3] = 0X3C;
memcpy(&databuf[4], &jpeg[(sendPacket * DACAI_JPG_BYTES_PER_PACKET)], j);
watchdog_refresh();
delay(5);
dwin_uart_write(databuf, j + 8);
}
}
if (jpgSize % DACAI_JPG_BYTES_PER_FRAME)
{
// 小于2048字节处理
for (sendPacket = 0; sendPacket < jpgSize / DACAI_JPG_BYTES_PER_PACKET; sendPacket++)
{
databuf[2] = (arr_data_num) >> 8;
databuf[3] = (arr_data_num) & 0xFF;
arr_data_num+=120;
memcpy(&databuf[4], &jpeg[sendPacket * DACAI_JPG_BYTES_PER_PACKET], DACAI_JPG_BYTES_PER_PACKET);
dwin_uart_write(databuf, DACAI_JPG_BYTES_PER_PACKET + 8);
watchdog_refresh();
delay(5);
}
// 2048字节发送完剩下的
if(jpgSize % DACAI_JPG_BYTES_PER_PACKET)
{
j = (jpgSize - DACAI_JPG_BYTES_PER_PACKET * sendPacket);
databuf[2] = (arr_data_num) >> 8;
databuf[3] = (arr_data_num) & 0xFF;
arr_data_num+=j;
databuf[4 + j] = 0xCC;
databuf[4 + j + 1] = 0x33;
databuf[4 + j + 2] = 0xC3;
databuf[4 + j + 3] = 0X3C;
memcpy(&databuf[4], &jpeg[(sendPacket * DACAI_JPG_BYTES_PER_PACKET)], j);
watchdog_refresh();
delay(5);
dwin_uart_write(databuf, j + 8);
}
}
return true;
}
void UI_SHOW_t::UI_DisplayJpegDate(unsigned long _screen_id)
{
// 当使用大彩屏时
// if (!IsDacaiScreenConnect)
// return ;
databuf[0] = CMD_HEAD;
databuf[1] = 0xB5; // 命令类型
databuf[2] = 0x01; // 消息类型
databuf[3] = _screen_id >> 8;
databuf[4] = _screen_id & 0xFF;
// 增加帧尾
memcpy(&databuf[5], frameEnd, 4);
dwin_uart_write(databuf, 9);
}
// 修改语言
void UI_SHOW_t::UI_ChangeLanguage(unsigned int lang)
{
databuf[0] = CMD_HEAD;
databuf[1] = CMD_SET_CHANGE_LNGUAGE; // 命令类型
databuf[2] = lang & 0xFF;
databuf[3] = (CMD_SET_CHANGE_LNGUAGE + lang) & 0xFF;
// 增加帧尾
memcpy(&databuf[4], frameEnd, 4);
dwin_uart_write(databuf, 8);
}