🔧 新增(display):新增display任务

1. 添加display文件
 2. 修改项目依赖
结束
This commit is contained in:
yangxy 2022-12-22 20:17:06 +08:00
parent abeacdcdb0
commit 9068f541ad
7 changed files with 373 additions and 102 deletions

174
.clang-format Normal file
View File

@ -0,0 +1,174 @@
---
# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: Cpp
# BasedOnStyle: LLVM
# 访问说明符(public、private等)的偏移
AccessModifierOffset: -4
# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
AlignAfterOpenBracket: Align
# 连续赋值时,对齐所有等号
AlignConsecutiveAssignments: true
# 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations: true
# 左对齐逃脱换行(使用反斜杠换行)的反斜杠
AlignEscapedNewlinesLeft: true
# 水平对齐二元和三元表达式的操作数
AlignOperands: true
# 对齐连续的尾随的注释
AlignTrailingComments: true
# 允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: true
# 允许短的块放在同一行
AllowShortBlocksOnASingleLine: false
# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: false
# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
AllowShortFunctionsOnASingleLine: None
# 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine: false
# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine: false
# 总是在定义返回类型后换行(deprecated)
AlwaysBreakAfterDefinitionReturnType: None
# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数),
# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
AlwaysBreakAfterReturnType: None
# 总是在多行string字面量前换行
AlwaysBreakBeforeMultilineStrings: false
# 总是在template声明后换行
AlwaysBreakTemplateDeclarations: false
# false表示函数实参要么都在同一行要么都各自一行
BinPackArguments: true
# false表示所有形参要么都在同一行要么都各自一行
BinPackParameters: true
# 大括号换行只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:
# class定义后面
AfterClass: true
# 控制语句后面
AfterControlStatement: false
# enum定义后面
AfterEnum: true
# 函数定义后面
AfterFunction: true
# 命名空间定义后面
AfterNamespace: true
# ObjC定义后面
AfterObjCDeclaration: false
# struct定义后面
AfterStruct: true
# union定义后面
AfterUnion: false
# catch之前
BeforeCatch: true
# else之前
BeforeElse: false
# 缩进大括号
IndentBraces: false
# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators: NonAssignment
# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义与Attach类似),
# Mozilla(除枚举、函数、记录定义与Attach类似), Stroustrup(除函数定义、catch、else与Attach类似),
# Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
# 注:这里认为语句块也属于函数
BreakBeforeBraces: Custom
# 在三元运算符前换行
BreakBeforeTernaryOperators: true
# 在构造函数的初始化列表的逗号前换行
BreakConstructorInitializersBeforeComma: false
# 每行字符的限制0表示没有限制
ColumnLimit: 120
# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
CommentPragmas: '^ IWYU pragma:'
# 构造函数的初始化列表要么都在同一行,要么都各自一行
ConstructorInitializerAllOnOneLineOrOnePerLine: false
# 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth: 4
# 延续的行的缩进宽度
ContinuationIndentWidth: 4
# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: false
# 继承最常用的指针和引用的对齐方式
DerivePointerAlignment: false
# 关闭格式化
DisableFormat: false
# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
ExperimentalAutoDetectBinPacking: false
# 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
# 对#include进行排序匹配了某正则表达式的#include拥有对应的优先级匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前)
# 可以定义负数优先级从而保证某些#include永远在最前面
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|isl|json)/)'
Priority: 3
- Regex: '.*'
Priority: 1
# 缩进case标签
IndentCaseLabels: true
# 缩进宽度
IndentWidth: 4
# 函数返回类型换行时,缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames: false
# 保留在块开始处的空行
KeepEmptyLinesAtTheStartOfBlocks: true
# 开始一个块的宏的正则表达式
MacroBlockBegin: ''
# 结束一个块的宏的正则表达式
MacroBlockEnd: ''
# 连续空行的最大数量
MaxEmptyLinesToKeep: 1
# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All
NamespaceIndentation: Inner
# 使用ObjC块时缩进宽度
ObjCBlockIndentWidth: 4
# 在ObjC的@property后添加一个空格
ObjCSpaceAfterProperty: false
# 在ObjC的protocol列表前添加一个空格
ObjCSpaceBeforeProtocolList: true
# 在call(后对函数调用换行的penalty
PenaltyBreakBeforeFirstCallParameter: 19
# 在一个注释中引入换行的penalty
PenaltyBreakComment: 300
# 第一次在<<前换行的penalty
PenaltyBreakFirstLessLess: 120
# 在一个字符串字面量中引入换行的penalty
PenaltyBreakString: 1000
# 对于每个在行字符数限制之外的字符的penalty
PenaltyExcessCharacter: 1000000
# 将函数的返回类型放到它自己的行的penalty
PenaltyReturnTypeOnItsOwnLine: 60
# 指针和引用的对齐: Left, Right, Middle
PointerAlignment: Left
# 允许重新排版注释
ReflowComments: false
# 允许排序#include
SortIncludes: false
# 在C风格类型转换后添加空格
SpaceAfterCStyleCast: false
# 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators: true
# 开圆括号之前添加一个空格: Never, ControlStatements, Always
SpaceBeforeParens: ControlStatements
# 在空的圆括号中添加空格
SpaceInEmptyParentheses: false
# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 2
# 在尖括号的<后和>前添加空格
SpacesInAngles: false
# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals: true
# 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false
# 在圆括号的(后和)前添加空格
SpacesInParentheses: false
# 在方括号的[后和]前添加空格lamda表达式和未指明大小的数组的声明不受影响
SpacesInSquareBrackets: false
# 标准: Cpp03, Cpp11, Auto
Standard: Cpp11
# tab宽度
TabWidth: 4
# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab: Never
...

View File

@ -0,0 +1,129 @@
/**
* @file app_hello_task.h
* @author impressionyang (impressionyang@outlook.com)
* @brief
* @version 0.1
* @date 2022-09-28
* _ _
* (_)_ _ ___ _______ ___ ___ (_)__ ___ __ _____ ____ ___ _
* / / ' \/ _ \/ __/ -_|_-<(_-</ / _ \/ _ \/ // / _ `/ _ \/ _ `/
* /_/_/_/_/ .__/_/ \__/___/___/_/\___/_//_/\_, /\_,_/_//_/\_, /
* /_/ /___/ /___/
* @copyright Copyright (c) 2022 impressionyang
*
* @par :
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td>2022-12-22 <td>v1.0 <td>impressionyang <td>
* </table>
*/
#include "app_task_display.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_err.h"
#include "esp_log.h"
#include "st7789.h"
#include "CST816T.h"
TFT_t dev;
TickType_t FillTest(TFT_t* dev, int width, int height)
{
TickType_t startTick, endTick, diffTick;
startTick = xTaskGetTickCount();
lcdFillScreen(dev, RED);
vTaskDelay(50);
lcdFillScreen(dev, GREEN);
vTaskDelay(50);
lcdFillScreen(dev, BLUE);
vTaskDelay(50);
endTick = xTaskGetTickCount();
diffTick = endTick - startTick;
ESP_LOGI(__FUNCTION__, "elapsed time[ms]:%d", diffTick * portTICK_PERIOD_MS);
return diffTick;
}
void cst_scan_gesture()
{
int index = 0;
while (1) {
vTaskDelay(1);
if (index++ == 500) {
index = 0;
lcdBacklightOff(&dev);
}
if (cst816t_available()) {
/*printf("gesture.id %u \n", data.gestureID);
printf("points %u \n", data.points);
printf("event %u \n", data.event);*/
printf("x %i \n", data.x);
printf("y %i \n", data.y);
lcdBacklightOn(&dev);
switch (data.gestureID) {
case NONE:
// printf("NONE");
break;
case SWIPE_DOWN:
printf("SWIPE DOWN \n");
break;
case SWIPE_UP:
printf("SWIPE UP \n");
break;
case SWIPE_LEFT:
printf("SWIPE LEFT \n");
break;
case SWIPE_RIGHT:
printf("SWIPE RIGHT \n");
break;
case SINGLE_CLICK:
printf("SINGLE CLICK \n");
break;
case DOUBLE_CLICK:
printf("DOUBLE CLICK \n");
break;
case LONG_PRESS:
printf("LONG PRESS \n");
break;
default:
printf("UNKNOWN \n");
break;
}
}
}
}
static void _display_thread_entry()
{
while (1) {
FillTest(&dev, CONFIG_WIDTH, CONFIG_HEIGHT);
vTaskDelay(500);
}
}
uint8_t app_task_display_start()
{
cst816t_begin(34, 33, 35, 36);
xTaskCreatePinnedToCore(cst_scan_gesture, "sct test", 4096, NULL, 4, NULL, tskNO_AFFINITY);
spi_master_init(&dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO,
CONFIG_BL_GPIO);
// lcdBacklightOn(&dev);
// vTaskDelay(1000);
lcdInit(&dev, CONFIG_WIDTH, CONFIG_HEIGHT, CONFIG_OFFSETX, CONFIG_OFFSETY);
// lcdBacklightOn(&dev);
xTaskCreatePinnedToCore(_display_thread_entry, "dsp test", 4096, NULL, 4, NULL, tskNO_AFFINITY);
#if CONFIG_INVERSION
// ESP_LOGI(TAG, "Enable Display Inversion");
lcdInversionOn(&dev);
#endif
return 0;
}
uint8_t app_task_display_stop()
{
return 0;
}

View File

@ -0,0 +1,51 @@
/**
* @file app_hello_task.h
* @author impressionyang (impressionyang@outlook.com)
* @brief
* @version 0.1
* @date 2022-09-28
* _ _
* (_)_ _ ___ _______ ___ ___ (_)__ ___ __ _____ ____ ___ _
* / / ' \/ _ \/ __/ -_|_-<(_-</ / _ \/ _ \/ // / _ `/ _ \/ _ `/
* /_/_/_/_/ .__/_/ \__/___/___/_/\___/_//_/\_, /\_,_/_//_/\_, /
* /_/ /___/ /___/
* @copyright Copyright (c) 2022 impressionyang
*
* @par :
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td>2022-12-22 <td>v1.0 <td>impressionyang <td>
* </table>
*/
#ifndef __APP_TASK_DISPLAY_H__
#define __APP_TASK_DISPLAY_H__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
*
* @brief
* @author impressionyang (impressionyang@outlook.com)
* @return uint8_t
*
* @details
*/
uint8_t app_task_display_start();
/**
*
* @brief
* @author impressionyang (impressionyang@outlook.com)
* @return uint8_t
*
* @details
*/
uint8_t app_task_display_stop();
#ifdef __cplusplus
}
#endif
#endif//__APP_TASK_DISPLAY_H__

View File

@ -6,6 +6,7 @@ idf_component_register(
SRC_DIRS
"."
"APP/app_task_hello"
"APP/app_task_display"
# "APP/app_task_wifi"
# "APP/app_task_mqtt"
# "APP/app_task_sensors"
@ -20,6 +21,7 @@ idf_component_register(
INCLUDE_DIRS
"."
"APP/app_task_hello"
"APP/app_task_display"
# "APP/app_task_wifi"
# "APP/app_task_mqtt"
# "APP/app_task_sensors"

View File

@ -17,16 +17,16 @@
#include "esp_log.h"
#include "app_task_hello.h"
#include "app_task_display.h"
// #include "app_task_wifi.h"
// #include "app_task_mqtt.h"
// #include "app_task_sensors.h"
#include "st7789.h"
#include "CST816T.h"
#include "app_main.h"
#include "shell_port.h"
// #include "msg_queue.h"
static app_main_handle_t sg_app_main_handle = {0};
static app_main_handle_t sg_app_main_handle = { 0 };
static void _init_esp()
{
@ -36,71 +36,7 @@ static void _init_esp()
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK( ret );
}
TickType_t FillTest(TFT_t * dev, int width, int height) {
TickType_t startTick, endTick, diffTick;
startTick = xTaskGetTickCount();
lcdFillScreen(dev, RED);
vTaskDelay(50);
lcdFillScreen(dev, GREEN);
vTaskDelay(50);
lcdFillScreen(dev, BLUE);
vTaskDelay(50);
endTick = xTaskGetTickCount();
diffTick = endTick - startTick;
ESP_LOGI(__FUNCTION__, "elapsed time[ms]:%d",diffTick*portTICK_PERIOD_MS);
return diffTick;
}
void cst_scan_gesture()
{
while (1)
{
vTaskDelay(1);
if (cst816t_available())
{
/*printf("gesture.id %u \n", data.gestureID);
printf("points %u \n", data.points);
printf("event %u \n", data.event);*/
printf("x %i \n", data.x);
printf("y %i \n", data.y);
switch (data.gestureID)
{
case NONE:
// printf("NONE");
break;
case SWIPE_DOWN:
printf("SWIPE DOWN \n");
break;
case SWIPE_UP:
printf("SWIPE UP \n");
break;
case SWIPE_LEFT:
printf("SWIPE LEFT \n");
break;
case SWIPE_RIGHT:
printf("SWIPE RIGHT \n");
break;
case SINGLE_CLICK:
printf("SINGLE CLICK \n");
break;
case DOUBLE_CLICK:
printf("DOUBLE CLICK \n");
break;
case LONG_PRESS:
printf("LONG PRESS \n");
break;
default:
printf("UNKNOWN \n");
break;
}
}
}
ESP_ERROR_CHECK(ret);
}
void app_main(void)
@ -112,6 +48,7 @@ void app_main(void)
vTaskDelay(10);
_init_esp();
app_task_display_start();
// app_hello_task_start();
// app_task_wifi_start();
// app_task_mqtt_start();
@ -119,36 +56,16 @@ void app_main(void)
userShellInit();
cst816t_begin(34, 33, 35, 36);
xTaskCreatePinnedToCore(cst_scan_gesture, "sct test", 4096, NULL, 4, NULL, tskNO_AFFINITY);
TFT_t dev;
spi_master_init(&dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO, CONFIG_BL_GPIO);
// lcdBacklightOn(&dev);
// vTaskDelay(1000);
lcdInit(&dev, CONFIG_WIDTH, CONFIG_HEIGHT, CONFIG_OFFSETX, CONFIG_OFFSETY);
// lcdBacklightOn(&dev);
#if CONFIG_INVERSION
// ESP_LOGI(TAG, "Enable Display Inversion");
lcdInversionOn(&dev);
#endif
/* Print chip information */
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
CONFIG_IDF_TARGET,
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("This is %s chip with %d CPU core(s), WiFi%s%s, ", CONFIG_IDF_TARGET, chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("silicon revision %d, ", chip_info.revision);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());
@ -156,15 +73,12 @@ void app_main(void)
// printf("ret = %d\r\n", ret);
// msg_data_t msg_data = {0};
for (int i = 10; ; ) {
for (int i = 10;;) {
// printf("Restarting in %d seconds...\n", i);
// app_task_wifi_get_info(&wifi_info);
// sg_app_main_handle.have_network = wifi_info.is_wifi_conneted;
FillTest(&dev, CONFIG_WIDTH, CONFIG_HEIGHT);
// FillTest(&dev, CONFIG_WIDTH, CONFIG_HEIGHT);
vTaskDelay(5000 / portTICK_PERIOD_MS);
// if (!msg_queue_recive_msg("mqtt_task", &msg_data, 100)) {
// printf("msg queue get data = %d\r\n", msg_data.msg_type);
// }
}
printf("Restarting now.\n");
fflush(stdout);
@ -176,17 +90,17 @@ uint8_t app_main_handle_get_nework_state()
return sg_app_main_handle.have_network;
}
static void _show_build_time(int argc, char **argv)
static void _show_build_time(int argc, char** argv)
{
printf("build at %s %s\n", __DATE__, __TIME__);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), show_build_time, _show_build_time, show the build time);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), show_build_time, _show_build_time,
show the build time);
static void _reboot(int argc, char **argv)
static void _reboot(int argc, char** argv)
{
esp_restart();
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), reboot, _reboot, reboot system);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), reboot, _reboot, reboot system);

View File

@ -1090,6 +1090,7 @@ void lcdUnsetFontUnderLine(TFT_t * dev) {
void lcdBacklightOff(TFT_t * dev) {
if(dev->_bl >= 0) {
gpio_set_level( dev->_bl, 0 );
printf("%s\r\n", __func__);
}
}

View File

@ -149,7 +149,7 @@ CONFIG_GPIO_RANGE_MAX=46
CONFIG_WIDTH=240
CONFIG_HEIGHT=280
CONFIG_OFFSETX=0
CONFIG_OFFSETY=0
CONFIG_OFFSETY=20
CONFIG_MOSI_GPIO=11
CONFIG_SCLK_GPIO=12
CONFIG_CS_GPIO=-1