mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-24 11:46:34 +00:00
Merge branch '0.4.0-dev' into feature-pagenav
This commit is contained in:
commit
1b17282ce3
12
.github/FUNDING.yml
vendored
Normal file
12
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [bblanchon] # Replace with up to 4 GitHub Sponsors-enabled usernames
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: lvgl # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: ['https://www.buymeacoffee.com/gW5rPpsKR','https://arduinojson.org/book/'] # Up to 4 links
|
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -2,8 +2,9 @@
|
||||
name: Bug report
|
||||
about: Create a bug report to help us improve
|
||||
title: ''
|
||||
labels: 'bug'
|
||||
assignees: ''
|
||||
labels: bug
|
||||
assignees: fvanroie
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
16
.github/ISSUE_TEMPLATE/other-question.md
vendored
Normal file
16
.github/ISSUE_TEMPLATE/other-question.md
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
name: Other Question
|
||||
about: Please use the forum or discord for general questions
|
||||
title: ''
|
||||
labels: question
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Questions
|
||||
|
||||
We only keep bug reports and active requests being worked on in the issues tracker.
|
||||
|
||||
For general questions we have opened the [discussion forum](https://github.com/fvanroie/hasp-lvgl/discussions) on github and [#hasp-lvgl channel](https://discord.gg/VCWyuhF) on Discord.
|
||||
|
||||
If you are not sure if your question is related to the code development, feel free to ask!
|
89
.github/workflows/build.yaml
vendored
89
.github/workflows/build.yaml
vendored
@ -1,56 +1,55 @@
|
||||
name: Build 0.4.0-dev branch
|
||||
|
||||
on: [push]
|
||||
on: [push, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Cache PlatformIO
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.platformio
|
||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
- name: Install PlatformIO
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install --upgrade platformio
|
||||
- name: Enable ESP platforms from platformio_override-template.ini
|
||||
run: |
|
||||
sed 's/; user_setups\/esp/user_setups\/esp/g' platformio_override-template.ini > platformio_override.ini
|
||||
- name: Enable Linux platform from platformio_override.ini
|
||||
run: |
|
||||
sed -i 's/; user_setups\/linux/user_setups\/linux/g' platformio_override.ini
|
||||
mkdir -p .pio/libdeps/linux_sdl_64bits/paho/src
|
||||
- name: Install SDL2 library
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install libsdl2-dev
|
||||
- name: List all files in current folder
|
||||
run: |
|
||||
ls -la
|
||||
- name: Cat platformio_override.ini
|
||||
run: |
|
||||
cat platformio_override.ini
|
||||
- name: Run PlatformIO
|
||||
run: pio run -e d1-mini-esp32_ili9341 -e lanbon_l8 -e wt32-sc01 -e d1-mini-esp8266_ili9341 -e linux_sdl_64bits
|
||||
- name: Upload output file
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: hasp-lvgl firmware.zip
|
||||
path: build_output/firmware/*.bin
|
||||
- uses: actions/checkout@v2
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Cache PlatformIO
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.platformio
|
||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
- name: Install PlatformIO
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install --upgrade platformio
|
||||
- name: Enable ESP platforms from platformio_override-template.ini
|
||||
run: |
|
||||
sed 's/; user_setups\/esp/user_setups\/esp/g' platformio_override-template.ini > platformio_override.ini
|
||||
- name: Enable Linux platform from platformio_override.ini
|
||||
run: |
|
||||
sed -i 's/; user_setups\/linux/user_setups\/linux/g' platformio_override.ini
|
||||
mkdir -p .pio/libdeps/linux_sdl_64bits/paho/src
|
||||
- name: Install SDL2 library
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install libsdl2-dev
|
||||
- name: List all files in current folder
|
||||
run: |
|
||||
ls -la
|
||||
- name: Cat platformio_override.ini
|
||||
run: |
|
||||
cat platformio_override.ini
|
||||
- name: Run PlatformIO
|
||||
run: pio run -e d1-mini-esp32_ili9341 -e lanbon_l8 -e wt32-sc01 -e d1-mini-esp8266_ili9341 -e linux_sdl_64bits
|
||||
- name: Upload output file
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: hasp-lvgl firmware.zip
|
||||
path: build_output/firmware/*.bin
|
||||
#- name: Create release and upload firmware
|
||||
# run: |
|
||||
# set -x
|
||||
|
5
LICENSE
5
LICENSE
@ -1,8 +1,7 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Francis Van Roie
|
||||
|
||||
Based upon HASwitchPlate - Copyright (c) 2019 Allen Derusha allen@derusha.org
|
||||
Copyright (c) 2019-2021 Francis Van Roie
|
||||
Copyright (c) 2018-2019 Allen Derusha allen@derusha.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -1,7 +1,7 @@
|
||||
# HASP - Open Hardware edition
|
||||
|
||||
[](https://github.com/fvanroie/hasp-lvgl/actions?query=workflow%3A%22PlatformIO+CI%22)
|
||||
[](https://github.com/fvanroie/hasp-lvgl/releases)
|
||||
[](https://github.com/fvanroie/hasp-lvgl/releases)
|
||||
[](http://github.com/fvanroie/hasp-lvgl/issues)
|
||||
[][6]
|
||||
[](#Contributing)
|
||||
|
@ -33,7 +33,7 @@ void hal_setup(void)
|
||||
|
||||
/* Add a display
|
||||
* Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/
|
||||
monitor_init();
|
||||
monitor_init(MONITOR_HOR_RES, MONITOR_VER_RES);
|
||||
|
||||
/* Add the mouse as input device
|
||||
* Use the 'mouse' driver which reads the PC's mouse*/
|
||||
|
@ -1,39 +1,4 @@
|
||||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
||||
The header files in this folder configure the different components of HASP, LVGL and paho.
|
@ -7,16 +7,14 @@
|
||||
#define LOG_OUTPUT(...) Log.output(...)
|
||||
|
||||
#if HASP_LOG_LEVEL > LOG_LEVEL_FATAL
|
||||
#define LOG_FATAL(...) \
|
||||
Log.fatal(__VA_ARGS__); \
|
||||
while (true) \
|
||||
{ \
|
||||
#define LOG_FATAL(...) \
|
||||
Log.fatal(__VA_ARGS__); \
|
||||
while(true) { \
|
||||
}
|
||||
#else
|
||||
#define LOG_FATAL(...) \
|
||||
do \
|
||||
{ \
|
||||
} while (0)
|
||||
#define LOG_FATAL(...) \
|
||||
do { \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
#if HASP_LOG_LEVEL > LOG_LEVEL_ALERT
|
||||
@ -69,4 +67,4 @@
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif // HASP_MACRO_H
|
||||
|
@ -190,7 +190,8 @@ typedef void* lv_fs_drv_user_data_t;
|
||||
# define LV_FS_IF_PC '\0'
|
||||
# define LV_FS_IF_SPIFFS '\0' // internal esp Flash
|
||||
#else
|
||||
# define LV_FS_IF_PC 'S'
|
||||
# define LV_FS_IF_PC '\0'
|
||||
# define LV_FS_IF_POSIX '\0'
|
||||
# define LV_FS_IF_SPIFFS '\0' // no internal esp Flash
|
||||
#endif
|
||||
#endif /*LV_USE_FS_IF*/
|
||||
@ -288,7 +289,7 @@ typedef void* lv_indev_drv_user_data_t; /*Type of user data in the in
|
||||
|
||||
/* 1: Print the log with 'printf';
|
||||
* 0: user need to register a callback with `lv_log_register_print_cb`*/
|
||||
# define LV_LOG_PRINTF 1
|
||||
# define LV_LOG_PRINTF 0
|
||||
#endif /*LV_USE_LOG*/
|
||||
|
||||
/*=================
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
This directory is intended for project specific (customized) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
|
1
lib/lv_drivers/.gitignore
vendored
1
lib/lv_drivers/.gitignore
vendored
@ -1 +0,0 @@
|
||||
**/*.o
|
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 LittlevGL
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,7 +0,0 @@
|
||||
# Display and Touch pad drivers
|
||||
|
||||
Display controller and touchpad driver to can be directly used with [LittlevGL](https://littlevgl.com).
|
||||
|
||||
To learn more about using drivers in LittlevGL visit the [Porting guide](https://littlevgl.com/porting).
|
||||
|
||||
If you used a new display or touch pad driver with LittlevGL please share it with other people!
|
@ -1,425 +0,0 @@
|
||||
/**
|
||||
* @file R61581.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "R61581.h"
|
||||
#if USE_R61581 != 0
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "lvgl/lv_core/lv_vdb.h"
|
||||
#include LV_DRV_DISP_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define R61581_CMD_MODE 0
|
||||
#define R61581_DATA_MODE 1
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void r61581_io_init(void);
|
||||
static void r61581_reset(void);
|
||||
static void r61581_set_tft_spec(void);
|
||||
static inline void r61581_cmd_mode(void);
|
||||
static inline void r61581_data_mode(void);
|
||||
static inline void r61581_cmd(uint8_t cmd);
|
||||
static inline void r61581_data(uint8_t data);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static bool cmd_mode = true;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the R61581 display controller
|
||||
* @return HW_RES_OK or any error from hw_res_t enum
|
||||
*/
|
||||
void r61581_init(void)
|
||||
{
|
||||
r61581_io_init();
|
||||
|
||||
/*Slow mode until the PLL is not started in the display controller*/
|
||||
LV_DRV_DISP_PAR_SLOW;
|
||||
|
||||
r61581_reset();
|
||||
|
||||
r61581_set_tft_spec();
|
||||
|
||||
r61581_cmd(0x13); //SET display on
|
||||
|
||||
r61581_cmd(0x29); //SET display on
|
||||
LV_DRV_DELAY_MS(30);
|
||||
|
||||
/*Parallel to max speed*/
|
||||
LV_DRV_DISP_PAR_FAST;
|
||||
}
|
||||
|
||||
void r61581_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p)
|
||||
{
|
||||
/*Return if the area is out the screen*/
|
||||
if(x2 < 0) return;
|
||||
if(y2 < 0) return;
|
||||
if(x1 > R61581_HOR_RES - 1) return;
|
||||
if(y1 > R61581_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = x1 < 0 ? 0 : x1;
|
||||
int32_t act_y1 = y1 < 0 ? 0 : y1;
|
||||
int32_t act_x2 = x2 > R61581_HOR_RES - 1 ? R61581_HOR_RES - 1 : x2;
|
||||
int32_t act_y2 = y2 > R61581_VER_RES - 1 ? R61581_VER_RES - 1 : y2;
|
||||
|
||||
|
||||
//Set the rectangular area
|
||||
r61581_cmd(0x002A);
|
||||
r61581_data(act_x1 >> 8);
|
||||
r61581_data(0x00FF & act_x1);
|
||||
r61581_data(act_x2 >> 8);
|
||||
r61581_data(0x00FF & act_x2);
|
||||
|
||||
r61581_cmd(0x002B);
|
||||
r61581_data(act_y1 >> 8);
|
||||
r61581_data(0x00FF & act_y1);
|
||||
r61581_data(act_y2 >> 8);
|
||||
r61581_data(0x00FF & act_y2);
|
||||
|
||||
r61581_cmd(0x2c);
|
||||
|
||||
int16_t i;
|
||||
uint16_t full_w = x2 - x1 + 1;
|
||||
|
||||
r61581_data_mode();
|
||||
|
||||
#if LV_COLOR_DEPTH == 16
|
||||
uint16_t act_w = act_x2 - act_x1 + 1;
|
||||
for(i = act_y1; i <= act_y2; i++) {
|
||||
LV_DRV_DISP_PAR_WR_ARRAY((uint16_t *)color_p, act_w);
|
||||
color_p += full_w;
|
||||
}
|
||||
#else
|
||||
int16_t j;
|
||||
for(i = act_y1; i <= act_y2; i++) {
|
||||
for(j = 0; j <= act_x2 - act_x1 + 1; j++) {
|
||||
LV_DRV_DISP_PAR_WR_WORD(lv_color_to16(color_p[j]));
|
||||
color_p += full_w;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
lv_flush_ready();
|
||||
}
|
||||
|
||||
void r61581_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color)
|
||||
{
|
||||
/*Return if the area is out the screen*/
|
||||
if(x2 < 0) return;
|
||||
if(y2 < 0) return;
|
||||
if(x1 > R61581_HOR_RES - 1) return;
|
||||
if(y1 > R61581_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = x1 < 0 ? 0 : x1;
|
||||
int32_t act_y1 = y1 < 0 ? 0 : y1;
|
||||
int32_t act_x2 = x2 > R61581_HOR_RES - 1 ? R61581_HOR_RES - 1 : x2;
|
||||
int32_t act_y2 = y2 > R61581_VER_RES - 1 ? R61581_VER_RES - 1 : y2;
|
||||
|
||||
//Set the rectangular area
|
||||
r61581_cmd(0x002A);
|
||||
r61581_data(act_x1 >> 8);
|
||||
r61581_data(0x00FF & act_x1);
|
||||
r61581_data(act_x2 >> 8);
|
||||
r61581_data(0x00FF & act_x2);
|
||||
|
||||
r61581_cmd(0x002B);
|
||||
r61581_data(act_y1 >> 8);
|
||||
r61581_data(0x00FF & act_y1);
|
||||
r61581_data(act_y2 >> 8);
|
||||
r61581_data(0x00FF & act_y2);
|
||||
|
||||
r61581_cmd(0x2c);
|
||||
|
||||
r61581_data_mode();
|
||||
|
||||
uint16_t color16 = lv_color_to16(color);
|
||||
uint32_t size = (act_x2 - act_x1 + 1) * (act_y2 - act_y1 + 1);
|
||||
uint32_t i;
|
||||
for(i = 0; i < size; i++) {
|
||||
LV_DRV_DISP_PAR_WR_WORD(color16);
|
||||
}
|
||||
}
|
||||
|
||||
void r61581_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p)
|
||||
{
|
||||
/*Return if the area is out the screen*/
|
||||
if(x2 < 0) return;
|
||||
if(y2 < 0) return;
|
||||
if(x1 > R61581_HOR_RES - 1) return;
|
||||
if(y1 > R61581_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = x1 < 0 ? 0 : x1;
|
||||
int32_t act_y1 = y1 < 0 ? 0 : y1;
|
||||
int32_t act_x2 = x2 > R61581_HOR_RES - 1 ? R61581_HOR_RES - 1 : x2;
|
||||
int32_t act_y2 = y2 > R61581_VER_RES - 1 ? R61581_VER_RES - 1 : y2;
|
||||
|
||||
|
||||
//Set the rectangular area
|
||||
r61581_cmd(0x002A);
|
||||
r61581_data(act_x1 >> 8);
|
||||
r61581_data(0x00FF & act_x1);
|
||||
r61581_data(act_x2 >> 8);
|
||||
r61581_data(0x00FF & act_x2);
|
||||
|
||||
r61581_cmd(0x002B);
|
||||
r61581_data(act_y1 >> 8);
|
||||
r61581_data(0x00FF & act_y1);
|
||||
r61581_data(act_y2 >> 8);
|
||||
r61581_data(0x00FF & act_y2);
|
||||
|
||||
r61581_cmd(0x2c);
|
||||
|
||||
int16_t i;
|
||||
uint16_t full_w = x2 - x1 + 1;
|
||||
|
||||
r61581_data_mode();
|
||||
|
||||
#if LV_COLOR_DEPTH == 16
|
||||
uint16_t act_w = act_x2 - act_x1 + 1;
|
||||
for(i = act_y1; i <= act_y2; i++) {
|
||||
LV_DRV_DISP_PAR_WR_ARRAY((uint16_t *)color_p, act_w);
|
||||
color_p += full_w;
|
||||
}
|
||||
#else
|
||||
int16_t j;
|
||||
for(i = act_y1; i <= act_y2; i++) {
|
||||
for(j = 0; j <= act_x2 - act_x1 + 1; j++) {
|
||||
LV_DRV_DISP_PAR_WR_WORD(lv_color_to16(color_p[j]));
|
||||
color_p += full_w;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Io init
|
||||
*/
|
||||
static void r61581_io_init(void)
|
||||
{
|
||||
LV_DRV_DISP_CMD_DATA(R61581_CMD_MODE)
|
||||
cmd_mode = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset
|
||||
*/
|
||||
static void r61581_reset(void)
|
||||
{
|
||||
/*Hardware reset*/
|
||||
LV_DRV_DISP_RST(1);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
LV_DRV_DISP_RST(0);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
LV_DRV_DISP_RST(1);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
|
||||
/*Chip enable*/
|
||||
LV_DRV_DISP_PAR_CS(1);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
LV_DRV_DISP_PAR_CS(0);
|
||||
LV_DRV_DELAY_MS(5);
|
||||
|
||||
/*Software reset*/
|
||||
r61581_cmd(0x01);
|
||||
LV_DRV_DELAY_MS(20);
|
||||
|
||||
r61581_cmd(0x01);
|
||||
LV_DRV_DELAY_MS(20);
|
||||
|
||||
r61581_cmd(0x01);
|
||||
LV_DRV_DELAY_MS(20);
|
||||
}
|
||||
|
||||
/**
|
||||
* TFT specific initialization
|
||||
*/
|
||||
static void r61581_set_tft_spec(void)
|
||||
{
|
||||
r61581_cmd(0xB0);
|
||||
r61581_data(0x00);
|
||||
|
||||
r61581_cmd(0xB3);
|
||||
r61581_data(0x02);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x10);
|
||||
|
||||
r61581_cmd(0xB4);
|
||||
r61581_data(0x00);//0X10
|
||||
|
||||
r61581_cmd(0xB9); //PWM
|
||||
r61581_data(0x01);
|
||||
r61581_data(0xFF); //FF brightness
|
||||
r61581_data(0xFF);
|
||||
r61581_data(0x18);
|
||||
|
||||
/*Panel Driving Setting*/
|
||||
r61581_cmd(0xC0);
|
||||
r61581_data(0x02);
|
||||
r61581_data(0x3B);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x01);
|
||||
r61581_data(0x00);//NW
|
||||
r61581_data(0x43);
|
||||
|
||||
/*Display Timing Setting for Normal Mode */
|
||||
r61581_cmd(0xC1);
|
||||
r61581_data(0x08);
|
||||
r61581_data(0x15); //CLOCK
|
||||
r61581_data(R61581_VFP);
|
||||
r61581_data(R61581_VBP);
|
||||
|
||||
/*Source/VCOM/Gate Driving Timing Setting*/
|
||||
r61581_cmd(0xC4);
|
||||
r61581_data(0x15);
|
||||
r61581_data(0x03);
|
||||
r61581_data(0x03);
|
||||
r61581_data(0x01);
|
||||
|
||||
/*Interface Setting*/
|
||||
r61581_cmd(0xC6);
|
||||
r61581_data((R61581_DPL << 0) |
|
||||
(R61581_EPL << 1) |
|
||||
(R61581_HSPL << 4) |
|
||||
(R61581_VSPL << 5));
|
||||
|
||||
/*Gamma Set*/
|
||||
r61581_cmd(0xC8);
|
||||
r61581_data(0x0c);
|
||||
r61581_data(0x05);
|
||||
r61581_data(0x0A);
|
||||
r61581_data(0x6B);
|
||||
r61581_data(0x04);
|
||||
r61581_data(0x06);
|
||||
r61581_data(0x15);
|
||||
r61581_data(0x10);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x31);
|
||||
|
||||
|
||||
r61581_cmd(0x36);
|
||||
if(R61581_ORI == 0) r61581_data(0xE0);
|
||||
else r61581_data(0x20);
|
||||
|
||||
r61581_cmd(0x0C);
|
||||
r61581_data(0x55);
|
||||
|
||||
r61581_cmd(0x3A);
|
||||
r61581_data(0x55);
|
||||
|
||||
r61581_cmd(0x38);
|
||||
|
||||
r61581_cmd(0xD0);
|
||||
r61581_data(0x07);
|
||||
r61581_data(0x07);
|
||||
r61581_data(0x14);
|
||||
r61581_data(0xA2);
|
||||
|
||||
r61581_cmd(0xD1);
|
||||
r61581_data(0x03);
|
||||
r61581_data(0x5A);
|
||||
r61581_data(0x10);
|
||||
|
||||
r61581_cmd(0xD2);
|
||||
r61581_data(0x03);
|
||||
r61581_data(0x04);
|
||||
r61581_data(0x04);
|
||||
|
||||
r61581_cmd(0x11);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
|
||||
r61581_cmd(0x2A);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x00);
|
||||
r61581_data(((R61581_HOR_RES - 1) >> 8) & 0XFF);
|
||||
r61581_data((R61581_HOR_RES - 1) & 0XFF);
|
||||
|
||||
r61581_cmd(0x2B);
|
||||
r61581_data(0x00);
|
||||
r61581_data(0x00);
|
||||
r61581_data(((R61581_VER_RES - 1) >> 8) & 0XFF);
|
||||
r61581_data((R61581_VER_RES - 1) & 0XFF);
|
||||
|
||||
LV_DRV_DELAY_MS(10);
|
||||
|
||||
r61581_cmd(0x29);
|
||||
LV_DRV_DELAY_MS(5);
|
||||
|
||||
r61581_cmd(0x2C);
|
||||
LV_DRV_DELAY_MS(5);
|
||||
}
|
||||
|
||||
/**
|
||||
* Command mode
|
||||
*/
|
||||
static inline void r61581_cmd_mode(void)
|
||||
{
|
||||
if(cmd_mode == false) {
|
||||
LV_DRV_DISP_CMD_DATA(R61581_CMD_MODE)
|
||||
cmd_mode = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Data mode
|
||||
*/
|
||||
static inline void r61581_data_mode(void)
|
||||
{
|
||||
if(cmd_mode != false) {
|
||||
LV_DRV_DISP_CMD_DATA(R61581_DATA_MODE);
|
||||
cmd_mode = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write command
|
||||
* @param cmd the command
|
||||
*/
|
||||
static inline void r61581_cmd(uint8_t cmd)
|
||||
{
|
||||
r61581_cmd_mode();
|
||||
LV_DRV_DISP_PAR_WR_WORD(cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data
|
||||
* @param data the data
|
||||
*/
|
||||
static inline void r61581_data(uint8_t data)
|
||||
{
|
||||
r61581_data_mode();
|
||||
LV_DRV_DISP_PAR_WR_WORD(data);
|
||||
}
|
||||
#endif
|
@ -1,57 +0,0 @@
|
||||
/**
|
||||
* @file R61581.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef R61581_H
|
||||
#define R61581_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_R61581
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void r61581_init(void);
|
||||
void r61581_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p);
|
||||
void r61581_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color);
|
||||
void r61581_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p);
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_R61581 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* R61581_H */
|
@ -1,182 +0,0 @@
|
||||
/**
|
||||
* @file SHARP_MIP.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------
|
||||
* SHARP memory in pixel monochrome display series
|
||||
* LS012B7DD01 (184x38 pixels.)
|
||||
* LS013B7DH03 (128x128 pixels.)
|
||||
* LS013B7DH05 (144x168 pixels.)
|
||||
* LS027B7DH01 (400x240 pixels.) (tested)
|
||||
* LS032B7DD02 (336x536 pixels.)
|
||||
* LS044Q7DH01 (320x240 pixels.)
|
||||
*
|
||||
* These displays need periodic com inversion, there are two ways :
|
||||
* - software com inversion :
|
||||
* define SHARP_MIP_SOFT_COM_INVERSION 1 and set EXTMODE display pin LOW,
|
||||
* call sharp_mip_com_inversion() periodically
|
||||
* - hardware com inversion with EXTCOMIN display pin :
|
||||
* define SHARP_MIP_SOFT_COM_INVERSION 0,
|
||||
* set EXTMODE display pin HIGH and handle
|
||||
* EXTCOMIN waveform (for example with mcu pwm output),
|
||||
* see datasheet pages 8-12 for details
|
||||
*
|
||||
* VDB size : (LV_VER_RES / X) * (2 + LV_HOR_RES / 8) + 2 bytes, structure :
|
||||
* [FRAME_HEADER (1 byte)] [GATE_ADDR (1 byte )] [LINE_DATA (LV_HOR_RES / 8 bytes)] 1st line
|
||||
* [DUMMY (1 byte)] [GATE_ADDR (1 byte )] [LINE_DATA (LV_HOR_RES / 8 bytes)] 2nd line
|
||||
* ...........................................................................................
|
||||
* [DUMMY (1 byte)] [GATE_ADDR (1 byte )] [LINE_DATA (LV_HOR_RES / 8 bytes)] last line
|
||||
* [DUMMY (2 bytes)]
|
||||
*
|
||||
* Since extra bytes (dummy, addresses, header) are stored in VDB, we need to use
|
||||
* an "oversized" VDB. Buffer declaration in "lv_port_disp.c" becomes for example :
|
||||
* static lv_disp_buf_t disp_buf;
|
||||
* static uint8_t buf[(LV_VER_RES_MAX / X) * (2 + (LV_HOR_RES_MAX / 8)) + 2];
|
||||
* lv_disp_buf_init(&disp_buf, buf, NULL, LV_VER_RES_MAX * LV_HOR_RES_MAX / X);
|
||||
*-----------------------------------------------------------------------------------------------*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#include "SHARP_MIP.h"
|
||||
|
||||
#if USE_SHARP_MIP
|
||||
|
||||
#include <stdbool.h>
|
||||
#include LV_DRV_DISP_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
#define SHARP_MIP_HEADER 0
|
||||
#define SHARP_MIP_UPDATE_RAM_FLAG (1 << 7) /* (M0) Mode flag : H -> update memory, L -> maintain memory */
|
||||
#define SHARP_MIP_COM_INVERSION_FLAG (1 << 6) /* (M1) Frame inversion flag : relevant when EXTMODE = L, */
|
||||
/* H -> outputs VCOM = H, L -> outputs VCOM = L */
|
||||
#define SHARP_MIP_CLEAR_SCREEN_FLAG (1 << 5) /* (M2) All clear flag : H -> clear all pixels */
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
#if SHARP_MIP_SOFT_COM_INVERSION
|
||||
static bool_t com_output_state = false;
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/*
|
||||
* Return the VDB byte index corresponding to the pixel
|
||||
* relatives coordinates (x, y) in the area.
|
||||
* The area is rounded to a whole screen line.
|
||||
*/
|
||||
#define BUFIDX(x, y) (((x) >> 3) + ((y) * (2 + (SHARP_MIP_HOR_RES >> 3))) + 2)
|
||||
|
||||
/*
|
||||
* Return the byte bitmask of a pixel bit corresponding
|
||||
* to VDB arrangement (8 pixels per byte on lines).
|
||||
*/
|
||||
#define PIXIDX(x) SHARP_MIP_REV_BYTE(1 << ((x) & 7))
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
void sharp_mip_init(void) {
|
||||
/* These displays have nothing to initialize */
|
||||
}
|
||||
|
||||
|
||||
void sharp_mip_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) {
|
||||
|
||||
/*Return if the area is out the screen*/
|
||||
if(area->y2 < 0) return;
|
||||
if(area->y1 > SHARP_MIP_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
uint16_t act_y1 = area->y1 < 0 ? 0 : area->y1;
|
||||
uint16_t act_y2 = area->y2 > SHARP_MIP_VER_RES - 1 ? SHARP_MIP_VER_RES - 1 : area->y2;
|
||||
|
||||
uint8_t * buf = (uint8_t *) color_p; /*Get the buffer address*/
|
||||
uint16_t buf_h = (act_y2 - act_y1 + 1); /*Number of buffer lines*/
|
||||
uint16_t buf_size = buf_h * (2 + SHARP_MIP_HOR_RES / 8) + 2; /*Buffer size in bytes */
|
||||
|
||||
/* Set lines to flush dummy byte & gate address in VDB*/
|
||||
for(uint16_t act_y = 0 ; act_y < buf_h ; act_y++) {
|
||||
buf[BUFIDX(0, act_y) - 1] = SHARP_MIP_REV_BYTE((act_y1 + act_y + 1));
|
||||
buf[BUFIDX(0, act_y) - 2] = 0;
|
||||
}
|
||||
|
||||
/* Set last dummy two bytes in VDB */
|
||||
buf[BUFIDX(0, buf_h) - 1] = 0;
|
||||
buf[BUFIDX(0, buf_h) - 2] = 0;
|
||||
|
||||
/* Set frame header in VDB */
|
||||
buf[0] = SHARP_MIP_HEADER |
|
||||
SHARP_MIP_UPDATE_RAM_FLAG;
|
||||
|
||||
/* Write the frame on display memory */
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
LV_DRV_DISP_SPI_WR_ARRAY(buf, buf_size);
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
}
|
||||
|
||||
void sharp_mip_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) {
|
||||
(void) disp_drv;
|
||||
(void) buf_w;
|
||||
(void) opa;
|
||||
|
||||
if (lv_color_to1(color) != 0) {
|
||||
buf[BUFIDX(x, y)] |= PIXIDX(x); /*Set VDB pixel bit to 1 for other colors than BLACK*/
|
||||
} else {
|
||||
buf[BUFIDX(x, y)] &= ~PIXIDX(x); /*Set VDB pixel bit to 0 for BLACK color*/
|
||||
}
|
||||
}
|
||||
|
||||
void sharp_mip_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area) {
|
||||
(void) disp_drv;
|
||||
|
||||
/* Round area to a whole line */
|
||||
area->x1 = 0;
|
||||
area->x2 = SHARP_MIP_HOR_RES - 1;
|
||||
}
|
||||
|
||||
#if SHARP_MIP_SOFT_COM_INVERSION
|
||||
void sharp_mip_com_inversion(void) {
|
||||
uint8_t inversion_header[2] = {0};
|
||||
|
||||
/* Set inversion header */
|
||||
if (com_output_state) {
|
||||
com_output_state = false;
|
||||
} else {
|
||||
inversion_header[0] |= SHARP_MIP_COM_INVERSION_FLAG;
|
||||
com_output_state = true;
|
||||
}
|
||||
|
||||
/* Write inversion header on display memory */
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
LV_DRV_DISP_SPI_WR_ARRAY(inversion_header, 2);
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
@ -1,63 +0,0 @@
|
||||
/**
|
||||
* @file SHARP_MIP.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SHARP_MIP_H
|
||||
#define SHARP_MIP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_SHARP_MIP
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void sharp_mip_init(void);
|
||||
void sharp_mip_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
|
||||
void sharp_mip_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area);
|
||||
void sharp_mip_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa);
|
||||
#if SHARP_MIP_SOFT_COM_INVERSION
|
||||
void sharp_mip_com_inversion(void);
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_SHARP_MIP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* SHARP_MIP_H */
|
@ -1,292 +0,0 @@
|
||||
/**
|
||||
* @file SSD1963.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "SSD1963.h"
|
||||
#if USE_SSD1963
|
||||
|
||||
#include <stdbool.h>
|
||||
#include LV_DRV_DISP_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define SSD1963_CMD_MODE 0
|
||||
#define SSD1963_DATA_MODE 1
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static inline void ssd1963_cmd_mode(void);
|
||||
static inline void ssd1963_data_mode(void);
|
||||
static inline void ssd1963_cmd(uint8_t cmd);
|
||||
static inline void ssd1963_data(uint8_t data);
|
||||
static void ssd1963_io_init(void);
|
||||
static void ssd1963_reset(void);
|
||||
static void ssd1963_set_clk(void);
|
||||
static void ssd1963_set_tft_spec(void);
|
||||
static void ssd1963_init_bl(void);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static bool cmd_mode = true;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
void ssd1963_init(void)
|
||||
{
|
||||
|
||||
LV_DRV_DISP_CMD_DATA(SSD1963_CMD_MODE);
|
||||
cmd_mode = true;
|
||||
|
||||
LV_DRV_DELAY_MS(250);
|
||||
|
||||
|
||||
ssd1963_cmd(0x00E2); //PLL multiplier, set PLL clock to 120M
|
||||
ssd1963_data(0x0023); //N=0x36 for 6.5M, 0x23 for 10M crystal
|
||||
ssd1963_data(0x0002);
|
||||
ssd1963_data(0x0004);
|
||||
ssd1963_cmd(0x00E0); // PLL enable
|
||||
ssd1963_data(0x0001);
|
||||
LV_DRV_DELAY_MS(1);
|
||||
ssd1963_cmd(0x00E0);
|
||||
ssd1963_data(0x0003); // now, use PLL output as system clock
|
||||
LV_DRV_DELAY_MS(1);
|
||||
ssd1963_cmd(0x0001); // software reset
|
||||
LV_DRV_DELAY_MS(1);
|
||||
ssd1963_cmd(0x00E6); //PLL setting for PCLK, depends on resolution
|
||||
|
||||
ssd1963_data(0x0001); //HX8257C
|
||||
ssd1963_data(0x0033); //HX8257C
|
||||
ssd1963_data(0x0033); //HX8257C
|
||||
|
||||
|
||||
ssd1963_cmd(0x00B0); //LCD SPECIFICATION
|
||||
ssd1963_data(0x0020);
|
||||
ssd1963_data(0x0000);
|
||||
ssd1963_data(((SSD1963_HOR_RES - 1) >> 8) & 0X00FF); //Set HDP
|
||||
ssd1963_data((SSD1963_HOR_RES - 1) & 0X00FF);
|
||||
ssd1963_data(((SSD1963_VER_RES - 1) >> 8) & 0X00FF); //Set VDP
|
||||
ssd1963_data((SSD1963_VER_RES - 1) & 0X00FF);
|
||||
ssd1963_data(0x0000);
|
||||
LV_DRV_DELAY_MS(1);//Delay10us(5);
|
||||
ssd1963_cmd(0x00B4); //HSYNC
|
||||
ssd1963_data((SSD1963_HT >> 8) & 0X00FF); //Set HT
|
||||
ssd1963_data(SSD1963_HT & 0X00FF);
|
||||
ssd1963_data((SSD1963_HPS >> 8) & 0X00FF); //Set HPS
|
||||
ssd1963_data(SSD1963_HPS & 0X00FF);
|
||||
ssd1963_data(SSD1963_HPW); //Set HPW
|
||||
ssd1963_data((SSD1963_LPS >> 8) & 0X00FF); //SetLPS
|
||||
ssd1963_data(SSD1963_LPS & 0X00FF);
|
||||
ssd1963_data(0x0000);
|
||||
|
||||
ssd1963_cmd(0x00B6); //VSYNC
|
||||
ssd1963_data((SSD1963_VT >> 8) & 0X00FF); //Set VT
|
||||
ssd1963_data(SSD1963_VT & 0X00FF);
|
||||
ssd1963_data((SSD1963_VPS >> 8) & 0X00FF); //Set VPS
|
||||
ssd1963_data(SSD1963_VPS & 0X00FF);
|
||||
ssd1963_data(SSD1963_VPW); //Set VPW
|
||||
ssd1963_data((SSD1963_FPS >> 8) & 0X00FF); //Set FPS
|
||||
ssd1963_data(SSD1963_FPS & 0X00FF);
|
||||
|
||||
ssd1963_cmd(0x00B8);
|
||||
ssd1963_data(0x000f); //GPIO is controlled by host GPIO[3:0]=output GPIO[0]=1 LCD ON GPIO[0]=1 LCD OFF
|
||||
ssd1963_data(0x0001); //GPIO0 normal
|
||||
|
||||
ssd1963_cmd(0x00BA);
|
||||
ssd1963_data(0x0001); //GPIO[0] out 1 --- LCD display on/off control PIN
|
||||
|
||||
ssd1963_cmd(0x0036); //rotation
|
||||
ssd1963_data(0x0008); //RGB=BGR
|
||||
|
||||
ssd1963_cmd(0x003A); //Set the current pixel format for RGB image data
|
||||
ssd1963_data(0x0050); //16-bit/pixel
|
||||
|
||||
ssd1963_cmd(0x00F0); //Pixel Data Interface Format
|
||||
ssd1963_data(0x0003); //16-bit(565 format) data
|
||||
|
||||
ssd1963_cmd(0x00BC);
|
||||
ssd1963_data(0x0040); //contrast value
|
||||
ssd1963_data(0x0080); //brightness value
|
||||
ssd1963_data(0x0040); //saturation value
|
||||
ssd1963_data(0x0001); //Post Processor Enable
|
||||
|
||||
LV_DRV_DELAY_MS(1);
|
||||
|
||||
ssd1963_cmd(0x0029); //display on
|
||||
|
||||
ssd1963_cmd(0x00BE); //set PWM for B/L
|
||||
ssd1963_data(0x0006);
|
||||
ssd1963_data(0x0080);
|
||||
ssd1963_data(0x0001);
|
||||
ssd1963_data(0x00f0);
|
||||
ssd1963_data(0x0000);
|
||||
ssd1963_data(0x0000);
|
||||
|
||||
ssd1963_cmd(0x00d0);
|
||||
ssd1963_data(0x000d);
|
||||
|
||||
//DisplayBacklightOn();
|
||||
|
||||
LV_DRV_DELAY_MS(30);
|
||||
}
|
||||
|
||||
void ssd1963_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
|
||||
{
|
||||
|
||||
/*Return if the area is out the screen*/
|
||||
if(area->x2 < 0) return;
|
||||
if(area->y2 < 0) return;
|
||||
if(area->x1 > SSD1963_HOR_RES - 1) return;
|
||||
if(area->y1 > SSD1963_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
|
||||
int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
|
||||
int32_t act_x2 = area->x2 > SSD1963_HOR_RES - 1 ? SSD1963_HOR_RES - 1 : area->x2;
|
||||
int32_t act_y2 = area->y2 > SSD1963_VER_RES - 1 ? SSD1963_VER_RES - 1 : area->y2;
|
||||
|
||||
//Set the rectangular area
|
||||
ssd1963_cmd(0x002A);
|
||||
ssd1963_data(act_x1 >> 8);
|
||||
ssd1963_data(0x00FF & act_x1);
|
||||
ssd1963_data(act_x2 >> 8);
|
||||
ssd1963_data(0x00FF & act_x2);
|
||||
|
||||
ssd1963_cmd(0x002B);
|
||||
ssd1963_data(act_y1 >> 8);
|
||||
ssd1963_data(0x00FF & act_y1);
|
||||
ssd1963_data(act_y2 >> 8);
|
||||
ssd1963_data(0x00FF & act_y2);
|
||||
|
||||
ssd1963_cmd(0x2c);
|
||||
int16_t i;
|
||||
uint16_t full_w = area->x2 - area->x1 + 1;
|
||||
|
||||
ssd1963_data_mode();
|
||||
LV_DRV_DISP_PAR_CS(0);
|
||||
#if LV_COLOR_DEPTH == 16
|
||||
uint16_t act_w = act_x2 - act_x1 + 1;
|
||||
for(i = act_y1; i <= act_y2; i++) {
|
||||
LV_DRV_DISP_PAR_WR_ARRAY((uint16_t *)color_p, act_w);
|
||||
color_p += full_w;
|
||||
}
|
||||
LV_DRV_DISP_PAR_CS(1);
|
||||
#else
|
||||
int16_t j;
|
||||
for(i = act_y1; i <= act_y2; i++) {
|
||||
for(j = 0; j <= act_x2 - act_x1 + 1; j++) {
|
||||
LV_DRV_DISP_PAR_WR_WORD(color_p[j]);
|
||||
color_p += full_w;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void ssd1963_io_init(void)
|
||||
{
|
||||
LV_DRV_DISP_CMD_DATA(SSD1963_CMD_MODE);
|
||||
cmd_mode = true;
|
||||
}
|
||||
|
||||
static void ssd1963_reset(void)
|
||||
{
|
||||
/*Hardware reset*/
|
||||
LV_DRV_DISP_RST(1);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
LV_DRV_DISP_RST(0);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
LV_DRV_DISP_RST(1);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
|
||||
/*Chip enable*/
|
||||
LV_DRV_DISP_PAR_CS(0);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
LV_DRV_DISP_PAR_CS(1);
|
||||
LV_DRV_DELAY_MS(5);
|
||||
|
||||
/*Software reset*/
|
||||
ssd1963_cmd(0x01);
|
||||
LV_DRV_DELAY_MS(20);
|
||||
|
||||
ssd1963_cmd(0x01);
|
||||
LV_DRV_DELAY_MS(20);
|
||||
|
||||
ssd1963_cmd(0x01);
|
||||
LV_DRV_DELAY_MS(20);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Command mode
|
||||
*/
|
||||
static inline void ssd1963_cmd_mode(void)
|
||||
{
|
||||
if(cmd_mode == false) {
|
||||
LV_DRV_DISP_CMD_DATA(SSD1963_CMD_MODE);
|
||||
cmd_mode = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Data mode
|
||||
*/
|
||||
static inline void ssd1963_data_mode(void)
|
||||
{
|
||||
if(cmd_mode != false) {
|
||||
LV_DRV_DISP_CMD_DATA(SSD1963_DATA_MODE);
|
||||
cmd_mode = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write command
|
||||
* @param cmd the command
|
||||
*/
|
||||
static inline void ssd1963_cmd(uint8_t cmd)
|
||||
{
|
||||
|
||||
LV_DRV_DISP_PAR_CS(0);
|
||||
ssd1963_cmd_mode();
|
||||
LV_DRV_DISP_PAR_WR_WORD(cmd);
|
||||
LV_DRV_DISP_PAR_CS(1);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data
|
||||
* @param data the data
|
||||
*/
|
||||
static inline void ssd1963_data(uint8_t data)
|
||||
{
|
||||
|
||||
LV_DRV_DISP_PAR_CS(0);
|
||||
ssd1963_data_mode();
|
||||
LV_DRV_DISP_PAR_WR_WORD(data);
|
||||
LV_DRV_DISP_PAR_CS(1);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -1,150 +0,0 @@
|
||||
/**
|
||||
* @file SSD1963.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SSD1963_H
|
||||
#define SSD1963_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_SSD1963
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
// SSD1963 command table
|
||||
#define CMD_NOP 0x00 //No operation
|
||||
#define CMD_SOFT_RESET 0x01 //Software reset
|
||||
#define CMD_GET_PWR_MODE 0x0A //Get the current power mode
|
||||
#define CMD_GET_ADDR_MODE 0x0B //Get the frame memory to the display panel read order
|
||||
#define CMD_GET_PIXEL_FORMAT 0x0C //Get the current pixel format
|
||||
#define CMD_GET_DISPLAY_MODE 0x0D //Returns the display mode
|
||||
#define CMD_GET_SIGNAL_MODE 0x0E //
|
||||
#define CMD_GET_DIAGNOSTIC 0x0F
|
||||
#define CMD_ENT_SLEEP 0x10
|
||||
#define CMD_EXIT_SLEEP 0x11
|
||||
#define CMD_ENT_PARTIAL_MODE 0x12
|
||||
#define CMD_ENT_NORMAL_MODE 0x13
|
||||
#define CMD_EXIT_INVERT_MODE 0x20
|
||||
#define CMD_ENT_INVERT_MODE 0x21
|
||||
#define CMD_SET_GAMMA 0x26
|
||||
#define CMD_BLANK_DISPLAY 0x28
|
||||
#define CMD_ON_DISPLAY 0x29
|
||||
#define CMD_SET_COLUMN 0x2A
|
||||
#define CMD_SET_PAGE 0x2B
|
||||
#define CMD_WR_MEMSTART 0x2C
|
||||
#define CMD_RD_MEMSTART 0x2E
|
||||
#define CMD_SET_PARTIAL_AREA 0x30
|
||||
#define CMD_SET_SCROLL_AREA 0x33
|
||||
#define CMD_SET_TEAR_OFF 0x34 //synchronization information is not sent from the display
|
||||
#define CMD_SET_TEAR_ON 0x35 //sync. information is sent from the display
|
||||
#define CMD_SET_ADDR_MODE 0x36 //set fram buffer read order to the display panel
|
||||
#define CMD_SET_SCROLL_START 0x37
|
||||
#define CMD_EXIT_IDLE_MODE 0x38
|
||||
#define CMD_ENT_IDLE_MODE 0x39
|
||||
#define CMD_SET_PIXEL_FORMAT 0x3A //defines how many bits per pixel is used
|
||||
#define CMD_WR_MEM_AUTO 0x3C
|
||||
#define CMD_RD_MEM_AUTO 0x3E
|
||||
#define CMD_SET_TEAR_SCANLINE 0x44
|
||||
#define CMD_GET_SCANLINE 0x45
|
||||
#define CMD_RD_DDB_START 0xA1
|
||||
#define CMD_RD_DDB_AUTO 0xA8
|
||||
#define CMD_SET_PANEL_MODE 0xB0
|
||||
#define CMD_GET_PANEL_MODE 0xB1
|
||||
#define CMD_SET_HOR_PERIOD 0xB4
|
||||
#define CMD_GET_HOR_PERIOD 0xB5
|
||||
#define CMD_SET_VER_PERIOD 0xB6
|
||||
#define CMD_GET_VER_PERIOD 0xB7
|
||||
#define CMD_SET_GPIO_CONF 0xB8
|
||||
#define CMD_GET_GPIO_CONF 0xB9
|
||||
#define CMD_SET_GPIO_VAL 0xBA
|
||||
#define CMD_GET_GPIO_STATUS 0xBB
|
||||
#define CMD_SET_POST_PROC 0xBC
|
||||
#define CMD_GET_POST_PROC 0xBD
|
||||
#define CMD_SET_PWM_CONF 0xBE
|
||||
#define CMD_GET_PWM_CONF 0xBF
|
||||
#define CMD_SET_LCD_GEN0 0xC0
|
||||
#define CMD_GET_LCD_GEN0 0xC1
|
||||
#define CMD_SET_LCD_GEN1 0xC2
|
||||
#define CMD_GET_LCD_GEN1 0xC3
|
||||
#define CMD_SET_LCD_GEN2 0xC4
|
||||
#define CMD_GET_LCD_GEN2 0xC5
|
||||
#define CMD_SET_LCD_GEN3 0xC6
|
||||
#define CMD_GET_LCD_GEN3 0xC7
|
||||
#define CMD_SET_GPIO0_ROP 0xC8
|
||||
#define CMD_GET_GPIO0_ROP 0xC9
|
||||
#define CMD_SET_GPIO1_ROP 0xCA
|
||||
#define CMD_GET_GPIO1_ROP 0xCB
|
||||
#define CMD_SET_GPIO2_ROP 0xCC
|
||||
#define CMD_GET_GPIO2_ROP 0xCD
|
||||
#define CMD_SET_GPIO3_ROP 0xCE
|
||||
#define CMD_GET_GPIO3_ROP 0xCF
|
||||
#define CMD_SET_ABC_DBC_CONF 0xD0
|
||||
#define CMD_GET_ABC_DBC_CONF 0xD1
|
||||
#define CMD_SET_DBC_HISTO_PTR 0xD2
|
||||
#define CMD_GET_DBC_HISTO_PTR 0xD3
|
||||
#define CMD_SET_DBC_THRES 0xD4
|
||||
#define CMD_GET_DBC_THRES 0xD5
|
||||
#define CMD_SET_ABM_TMR 0xD6
|
||||
#define CMD_GET_ABM_TMR 0xD7
|
||||
#define CMD_SET_AMB_LVL0 0xD8
|
||||
#define CMD_GET_AMB_LVL0 0xD9
|
||||
#define CMD_SET_AMB_LVL1 0xDA
|
||||
#define CMD_GET_AMB_LVL1 0xDB
|
||||
#define CMD_SET_AMB_LVL2 0xDC
|
||||
#define CMD_GET_AMB_LVL2 0xDD
|
||||
#define CMD_SET_AMB_LVL3 0xDE
|
||||
#define CMD_GET_AMB_LVL3 0xDF
|
||||
#define CMD_PLL_START 0xE0 //start the PLL
|
||||
#define CMD_PLL_STOP 0xE1 //disable the PLL
|
||||
#define CMD_SET_PLL_MN 0xE2
|
||||
#define CMD_GET_PLL_MN 0xE3
|
||||
#define CMD_GET_PLL_STATUS 0xE4 //get the current PLL status
|
||||
#define CMD_ENT_DEEP_SLEEP 0xE5
|
||||
#define CMD_SET_PCLK 0xE6 //set pixel clock (LSHIFT signal) frequency
|
||||
#define CMD_GET_PCLK 0xE7 //get pixel clock (LSHIFT signal) freq. settings
|
||||
#define CMD_SET_DATA_INTERFACE 0xF0
|
||||
#define CMD_GET_DATA_INTERFACE 0xF1
|
||||
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void ssd1963_init(void);
|
||||
void ssd1963_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_SSD1963 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* SSD1963_H */
|
@ -1,289 +0,0 @@
|
||||
/**
|
||||
* @file ST7565.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "ST7565.h"
|
||||
#if USE_ST7565
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include "lvgl/lv_core/lv_vdb.h"
|
||||
#include LV_DRV_DISP_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define ST7565_BAUD 2000000 /*< 2,5 MHz (400 ns)*/
|
||||
|
||||
#define ST7565_CMD_MODE 0
|
||||
#define ST7565_DATA_MODE 1
|
||||
|
||||
#define ST7565_HOR_RES 128
|
||||
#define ST7565_VER_RES 64
|
||||
|
||||
#define CMD_DISPLAY_OFF 0xAE
|
||||
#define CMD_DISPLAY_ON 0xAF
|
||||
|
||||
#define CMD_SET_DISP_START_LINE 0x40
|
||||
#define CMD_SET_PAGE 0xB0
|
||||
|
||||
#define CMD_SET_COLUMN_UPPER 0x10
|
||||
#define CMD_SET_COLUMN_LOWER 0x00
|
||||
|
||||
#define CMD_SET_ADC_NORMAL 0xA0
|
||||
#define CMD_SET_ADC_REVERSE 0xA1
|
||||
|
||||
#define CMD_SET_DISP_NORMAL 0xA6
|
||||
#define CMD_SET_DISP_REVERSE 0xA7
|
||||
|
||||
#define CMD_SET_ALLPTS_NORMAL 0xA4
|
||||
#define CMD_SET_ALLPTS_ON 0xA5
|
||||
#define CMD_SET_BIAS_9 0xA2
|
||||
#define CMD_SET_BIAS_7 0xA3
|
||||
|
||||
#define CMD_RMW 0xE0
|
||||
#define CMD_RMW_CLEAR 0xEE
|
||||
#define CMD_INTERNAL_RESET 0xE2
|
||||
#define CMD_SET_COM_NORMAL 0xC0
|
||||
#define CMD_SET_COM_REVERSE 0xC8
|
||||
#define CMD_SET_POWER_CONTROL 0x28
|
||||
#define CMD_SET_RESISTOR_RATIO 0x20
|
||||
#define CMD_SET_VOLUME_FIRST 0x81
|
||||
#define CMD_SET_VOLUME_SECOND 0x00
|
||||
#define CMD_SET_STATIC_OFF 0xAC
|
||||
#define CMD_SET_STATIC_ON 0xAD
|
||||
#define CMD_SET_STATIC_REG 0x00
|
||||
#define CMD_SET_BOOSTER_FIRST 0xF8
|
||||
#define CMD_SET_BOOSTER_234 0x00
|
||||
#define CMD_SET_BOOSTER_5 0x01
|
||||
#define CMD_SET_BOOSTER_6 0x03
|
||||
#define CMD_NOP 0xE3
|
||||
#define CMD_TEST 0xF0
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void st7565_sync(int32_t x1, int32_t y1, int32_t x2, int32_t y2);
|
||||
static void st7565_command(uint8_t cmd);
|
||||
static void st7565_data(uint8_t data);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static uint8_t lcd_fb[ST7565_HOR_RES * ST7565_VER_RES / 8] = {0xAA, 0xAA};
|
||||
static uint8_t pagemap[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the ST7565
|
||||
*/
|
||||
void st7565_init(void)
|
||||
{
|
||||
LV_DRV_DISP_RST(1);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
LV_DRV_DISP_RST(0);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
LV_DRV_DISP_RST(1);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
|
||||
st7565_command(CMD_SET_BIAS_7);
|
||||
st7565_command(CMD_SET_ADC_NORMAL);
|
||||
st7565_command(CMD_SET_COM_NORMAL);
|
||||
st7565_command(CMD_SET_DISP_START_LINE);
|
||||
st7565_command(CMD_SET_POWER_CONTROL | 0x4);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
|
||||
st7565_command(CMD_SET_POWER_CONTROL | 0x6);
|
||||
LV_DRV_DELAY_MS(50);
|
||||
|
||||
st7565_command(CMD_SET_POWER_CONTROL | 0x7);
|
||||
LV_DRV_DELAY_MS(10);
|
||||
|
||||
st7565_command(CMD_SET_RESISTOR_RATIO | 0x6); // Defaulted to 0x26 (but could also be between 0x20-0x27 based on display's specs)
|
||||
|
||||
st7565_command(CMD_DISPLAY_ON);
|
||||
st7565_command(CMD_SET_ALLPTS_NORMAL);
|
||||
|
||||
/*Set brightness*/
|
||||
st7565_command(CMD_SET_VOLUME_FIRST);
|
||||
st7565_command(CMD_SET_VOLUME_SECOND | (0x18 & 0x3f));
|
||||
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
|
||||
memset(lcd_fb, 0x00, sizeof(lcd_fb));
|
||||
}
|
||||
|
||||
|
||||
void st7565_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p)
|
||||
{
|
||||
/*Return if the area is out the screen*/
|
||||
if(x2 < 0) return;
|
||||
if(y2 < 0) return;
|
||||
if(x1 > ST7565_HOR_RES - 1) return;
|
||||
if(y1 > ST7565_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = x1 < 0 ? 0 : x1;
|
||||
int32_t act_y1 = y1 < 0 ? 0 : y1;
|
||||
int32_t act_x2 = x2 > ST7565_HOR_RES - 1 ? ST7565_HOR_RES - 1 : x2;
|
||||
int32_t act_y2 = y2 > ST7565_VER_RES - 1 ? ST7565_VER_RES - 1 : y2;
|
||||
|
||||
int32_t x, y;
|
||||
|
||||
/*Set the first row in */
|
||||
|
||||
/*Refresh frame buffer*/
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
for(x = act_x1; x <= act_x2; x++) {
|
||||
if(lv_color_to1(*color_p) != 0) {
|
||||
lcd_fb[x + (y / 8)*ST7565_HOR_RES] &= ~(1 << (7 - (y % 8)));
|
||||
} else {
|
||||
lcd_fb[x + (y / 8)*ST7565_HOR_RES] |= (1 << (7 - (y % 8)));
|
||||
}
|
||||
color_p ++;
|
||||
}
|
||||
|
||||
color_p += x2 - act_x2; /*Next row*/
|
||||
}
|
||||
|
||||
st7565_sync(act_x1, act_y1, act_x2, act_y2);
|
||||
lv_flush_ready();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void st7565_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color)
|
||||
{
|
||||
/*Return if the area is out the screen*/
|
||||
if(x2 < 0) return;
|
||||
if(y2 < 0) return;
|
||||
if(x1 > ST7565_HOR_RES - 1) return;
|
||||
if(y1 > ST7565_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = x1 < 0 ? 0 : x1;
|
||||
int32_t act_y1 = y1 < 0 ? 0 : y1;
|
||||
int32_t act_x2 = x2 > ST7565_HOR_RES - 1 ? ST7565_HOR_RES - 1 : x2;
|
||||
int32_t act_y2 = y2 > ST7565_VER_RES - 1 ? ST7565_VER_RES - 1 : y2;
|
||||
|
||||
int32_t x, y;
|
||||
uint8_t white = lv_color_to1(color);
|
||||
|
||||
/*Refresh frame buffer*/
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
for(x = act_x1; x <= act_x2; x++) {
|
||||
if(white != 0) {
|
||||
lcd_fb[x + (y / 8)*ST7565_HOR_RES] |= (1 << (7 - (y % 8)));
|
||||
} else {
|
||||
lcd_fb[x + (y / 8)*ST7565_HOR_RES] &= ~(1 << (7 - (y % 8)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
st7565_sync(act_x1, act_y1, act_x2, act_y2);
|
||||
}
|
||||
|
||||
void st7565_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p)
|
||||
{
|
||||
/*Return if the area is out the screen*/
|
||||
if(x2 < 0) return;
|
||||
if(y2 < 0) return;
|
||||
if(x1 > ST7565_HOR_RES - 1) return;
|
||||
if(y1 > ST7565_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = x1 < 0 ? 0 : x1;
|
||||
int32_t act_y1 = y1 < 0 ? 0 : y1;
|
||||
int32_t act_x2 = x2 > ST7565_HOR_RES - 1 ? ST7565_HOR_RES - 1 : x2;
|
||||
int32_t act_y2 = y2 > ST7565_VER_RES - 1 ? ST7565_VER_RES - 1 : y2;
|
||||
|
||||
int32_t x, y;
|
||||
|
||||
/*Set the first row in */
|
||||
|
||||
/*Refresh frame buffer*/
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
for(x = act_x1; x <= act_x2; x++) {
|
||||
if(lv_color_to1(*color_p) != 0) {
|
||||
lcd_fb[x + (y / 8)*ST7565_HOR_RES] &= ~(1 << (7 - (y % 8)));
|
||||
} else {
|
||||
lcd_fb[x + (y / 8)*ST7565_HOR_RES] |= (1 << (7 - (y % 8)));
|
||||
}
|
||||
color_p ++;
|
||||
}
|
||||
|
||||
color_p += x2 - act_x2; /*Next row*/
|
||||
}
|
||||
|
||||
st7565_sync(act_x1, act_y1, act_x2, act_y2);
|
||||
}
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
/**
|
||||
* Flush a specific part of the buffer to the display
|
||||
* @param x1 left coordinate of the area to flush
|
||||
* @param y1 top coordinate of the area to flush
|
||||
* @param x2 right coordinate of the area to flush
|
||||
* @param y2 bottom coordinate of the area to flush
|
||||
*/
|
||||
static void st7565_sync(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
|
||||
{
|
||||
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
|
||||
uint8_t c, p;
|
||||
for(p = y1 / 8; p <= y2 / 8; p++) {
|
||||
st7565_command(CMD_SET_PAGE | pagemap[p]);
|
||||
st7565_command(CMD_SET_COLUMN_LOWER | (x1 & 0xf));
|
||||
st7565_command(CMD_SET_COLUMN_UPPER | ((x1 >> 4) & 0xf));
|
||||
st7565_command(CMD_RMW);
|
||||
|
||||
for(c = x1; c <= x2; c++) {
|
||||
st7565_data(lcd_fb[(ST7565_HOR_RES * p) + c]);
|
||||
}
|
||||
}
|
||||
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a command to the ST7565
|
||||
* @param cmd the command
|
||||
*/
|
||||
static void st7565_command(uint8_t cmd)
|
||||
{
|
||||
LV_DRV_DISP_CMD_DATA(ST7565_CMD_MODE);
|
||||
LV_DRV_DISP_SPI_WR_BYTE(cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data to the ST7565
|
||||
* @param data the data
|
||||
*/
|
||||
static void st7565_data(uint8_t data)
|
||||
{
|
||||
LV_DRV_DISP_CMD_DATA(ST7565_DATA_MODE);
|
||||
LV_DRV_DISP_SPI_WR_BYTE(data);
|
||||
}
|
||||
|
||||
#endif
|
@ -1,58 +0,0 @@
|
||||
/**
|
||||
* @file ST7565.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ST7565_H
|
||||
#define ST7565_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_ST7565
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void st7565_init(void);
|
||||
void st7565_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p);
|
||||
void st7565_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color);
|
||||
void st7565_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_ST7565 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* ST7565_H */
|
@ -1,206 +0,0 @@
|
||||
/**
|
||||
* @file UC1610.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "UC1610.h"
|
||||
|
||||
#if USE_UC1610
|
||||
|
||||
#include <stdbool.h>
|
||||
#include LV_DRV_DISP_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define UC1610_CMD_MODE 0
|
||||
#define UC1610_DATA_MODE 1
|
||||
#define UC1610_RESET_MODE 0
|
||||
#define UC1610_SET_MODE 1
|
||||
|
||||
/* hardware control commands */
|
||||
#define UC1610_SYSTEM_RESET 0xE2 /* software reset */
|
||||
#define UC1610_NOP 0xE3
|
||||
#define UC1610_SET_TEMP_COMP 0x24 /* set temperature compensation, default -0.05%/°C */
|
||||
#define UC1610_SET_PANEL_LOADING 0x29 /* set panel loading, default 16~21 nF */
|
||||
#define UC1610_SET_PUMP_CONTROL 0x2F /* default internal Vlcd (8x pump) */
|
||||
#define UC1610_SET_LCD_BIAS_RATIO 0xEB /* default 11 */
|
||||
#define UC1610_SET_VBIAS_POT 0x81 /* 1 byte (0~255) to follow setting the contrast, default 0x81 */
|
||||
#define UC1610_SET_LINE_RATE 0xA0 /* default 12,1 Klps */
|
||||
#define UC1610_SET_DISPLAY_ENABLE 0xAE /* + 1 / 0 : exit sleep mode / entering sleep mode */
|
||||
#define UC1610_SET_LCD_GRAY_SHADE 0xD0 /* default 24% between the two gray shade levels */
|
||||
#define UC1610_SET_COM_END 0xF1 /* set the number of used com electrodes (lines number -1) */
|
||||
|
||||
/* ram address control */
|
||||
#define UC1610_SET_AC 0x88 /* set ram address control */
|
||||
#define UC1610_AC_WA_FLAG 1 /* automatic column/page increment wrap around (1 : cycle increment) */
|
||||
#define UC1610_AC_AIO_FLAG (1 << 1) /* auto increment order (0/1 : column/page increment first) */
|
||||
#define UC1610_AC_PID_FLAG (1 << 2) /* page address auto increment order (0/1 : +1/-1) */
|
||||
|
||||
/* set cursor ram address */
|
||||
#define UC1610_SET_CA_LSB 0x00 /* + 4 LSB bits */
|
||||
#define UC1610_SET_CA_MSB 0x10 /* + 4 MSB bits // MSB + LSB values range : 0~159 */
|
||||
#define UC1610_SET_PA 0x60 /* + 5 bits // values range : 0~26 */
|
||||
|
||||
/* display control commands */
|
||||
#define UC1610_SET_FIXED_LINES 0x90 /* + 4 bits = 2xFL */
|
||||
#define UC1610_SET_SCROLL_LINES_LSB 0x40 /* + 4 LSB bits scroll up display by N (7 bits) lines */
|
||||
#define UC1610_SET_SCROLL_LINES_MSB 0x50 /* + 3 MSB bits */
|
||||
#define UC1610_SET_ALL_PIXEL_ON 0xA4 /* + 1 / 0 : set all pixel on, reverse */
|
||||
#define UC1610_SET_INVERSE_DISPLAY 0xA6 /* + 1 / 0 : inverse all data stored in ram, reverse */
|
||||
#define UC1610_SET_MAPPING_CONTROL 0xC0 /* control mirorring */
|
||||
#define UC1610_SET_MAPPING_CONTROL_LC_FLAG 1
|
||||
#define UC1610_SET_MAPPING_CONTROL_MX_FLAG (1 << 1)
|
||||
#define UC1610_SET_MAPPING_CONTROL_MY_FLAG (1 << 2)
|
||||
|
||||
/* window program mode */
|
||||
#define UC1610_SET_WINDOW_PROGRAM_ENABLE 0xF8 /* + 1 / 0 : enable / disable window programming mode, */
|
||||
/* reset before changing boundaries */
|
||||
#define UC1610_SET_WP_STARTING_CA 0xF4 /* 1 byte to follow for column address */
|
||||
#define UC1610_SET_WP_ENDING_CA 0xF6 /* 1 byte to follow for column address */
|
||||
#define UC1610_SET_WP_STARTING_PA 0xF5 /* 1 byte to follow for page address */
|
||||
#define UC1610_SET_WP_ENDING_PA 0xF7 /* 1 byte to follow for page address */
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static uint8_t cmd_buf[12];
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/* Return the byte bitmask of a pixel color corresponding to VDB arrangement */
|
||||
#define PIXIDX(y, c) ((c) << (((y) & 3) << 1))
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
void uc1610_init(void) {
|
||||
LV_DRV_DELAY_MS(12);
|
||||
|
||||
/* initialization sequence */
|
||||
#if UC1610_INIT_HARD_RST
|
||||
LV_DRV_DISP_RST(UC1610_RESET_MODE); /* hardware reset */
|
||||
LV_DRV_DELAY_MS(1);
|
||||
LV_DRV_DISP_RST(UC1610_SET_MODE);
|
||||
#else
|
||||
cmd_buf[0] = UC1610_SYSTEM_RESET; /* software reset */
|
||||
LV_DRV_DISP_CMD_DATA(UC1610_CMD_MODE);
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
LV_DRV_DISP_SPI_WR_ARRAY(cmd_buf, 1);
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
#endif
|
||||
|
||||
LV_DRV_DELAY_MS(2);
|
||||
cmd_buf[0] = UC1610_SET_COM_END; /* set com end value */
|
||||
cmd_buf[1] = UC1610_VER_RES - 1;
|
||||
cmd_buf[2] = UC1610_SET_PANEL_LOADING;
|
||||
cmd_buf[3] = UC1610_SET_LCD_BIAS_RATIO;
|
||||
cmd_buf[4] = UC1610_SET_VBIAS_POT; /* set contrast */
|
||||
cmd_buf[5] = (UC1610_INIT_CONTRAST * 255) / 100;
|
||||
#if UC1610_TOP_VIEW
|
||||
cmd_buf[6] = UC1610_SET_MAPPING_CONTROL | /* top view */
|
||||
UC1610_SET_MAPPING_CONTROL_MY_FLAG |
|
||||
UC1610_SET_MAPPING_CONTROL_MX_FLAG;
|
||||
#else
|
||||
cmd_buf[6] = UC1610_SET_MAPPING_CONTROL; /* bottom view */
|
||||
#endif
|
||||
cmd_buf[7] = UC1610_SET_SCROLL_LINES_LSB | 0; /* set scroll line on line 0 */
|
||||
cmd_buf[8] = UC1610_SET_SCROLL_LINES_MSB | 0;
|
||||
cmd_buf[9] = UC1610_SET_AC | UC1610_AC_WA_FLAG; /* set auto increment wrap around */
|
||||
cmd_buf[10] = UC1610_SET_INVERSE_DISPLAY | 1; /* invert colors to complies lv color system */
|
||||
cmd_buf[11] = UC1610_SET_DISPLAY_ENABLE | 1; /* turn display on */
|
||||
|
||||
LV_DRV_DISP_CMD_DATA(UC1610_CMD_MODE);
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
LV_DRV_DISP_SPI_WR_ARRAY(cmd_buf, 12);
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
}
|
||||
|
||||
|
||||
void uc1610_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) {
|
||||
/*Return if the area is out the screen*/
|
||||
if(area->x2 < 0) return;
|
||||
if(area->y2 < 0) return;
|
||||
if(area->x1 > UC1610_HOR_RES - 1) return;
|
||||
if(area->y1 > UC1610_VER_RES - 1) return;
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
uint8_t act_x1 = area->x1 < 0 ? 0 : area->x1;
|
||||
uint8_t act_y1 = area->y1 < 0 ? 0 : area->y1;
|
||||
uint8_t act_x2 = area->x2 > UC1610_HOR_RES - 1 ? UC1610_HOR_RES - 1 : area->x2;
|
||||
uint8_t act_y2 = area->y2 > UC1610_VER_RES - 1 ? UC1610_VER_RES - 1 : area->y2;
|
||||
|
||||
uint8_t * buf = (uint8_t *) color_p;
|
||||
uint16_t buf_size = (act_x2 - act_x1 + 1) * (((act_y2 - act_y1) >> 2) + 1);
|
||||
|
||||
/*Set display window to fill*/
|
||||
cmd_buf[0] = UC1610_SET_WINDOW_PROGRAM_ENABLE | 0; /* before changing boundaries */
|
||||
cmd_buf[1] = UC1610_SET_WP_STARTING_CA;
|
||||
cmd_buf[2] = act_x1;
|
||||
cmd_buf[3] = UC1610_SET_WP_ENDING_CA;
|
||||
cmd_buf[4] = act_x2;
|
||||
cmd_buf[5] = UC1610_SET_WP_STARTING_PA;
|
||||
cmd_buf[6] = act_y1 >> 2;
|
||||
cmd_buf[7] = UC1610_SET_WP_ENDING_PA;
|
||||
cmd_buf[8] = act_y2 >> 2;
|
||||
cmd_buf[9] = UC1610_SET_WINDOW_PROGRAM_ENABLE | 1; /* entering window programming */
|
||||
|
||||
LV_DRV_DISP_CMD_DATA(UC1610_CMD_MODE);
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
LV_DRV_DISP_SPI_WR_ARRAY(cmd_buf, 10);
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
|
||||
/*Flush VDB on display memory*/
|
||||
LV_DRV_DISP_CMD_DATA(UC1610_DATA_MODE);
|
||||
LV_DRV_DISP_SPI_CS(0);
|
||||
LV_DRV_DISP_SPI_WR_ARRAY(buf, buf_size);
|
||||
LV_DRV_DISP_SPI_CS(1);
|
||||
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
}
|
||||
|
||||
void uc1610_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) {
|
||||
(void) disp_drv;
|
||||
(void) opa;
|
||||
|
||||
uint16_t idx = x + buf_w * (y >> 2);
|
||||
|
||||
/* Convert color to depth 2 */
|
||||
#if LV_COLOR_DEPTH == 1
|
||||
uint8_t color2 = color.full * 3;
|
||||
#else
|
||||
uint8_t color2 = color.full >> (LV_COLOR_DEPTH - 2);
|
||||
#endif
|
||||
|
||||
buf[idx] &= ~PIXIDX(y, 3); /* reset pixel color */
|
||||
buf[idx] |= PIXIDX(y, color2); /* write new color */
|
||||
}
|
||||
|
||||
void uc1610_rounder_cb(lv_disp_drv_t * disp_drv, lv_area_t * area) {
|
||||
(void) disp_drv;
|
||||
|
||||
/* Round y window to display memory page size */
|
||||
area->y1 = (area->y1 & (~3));
|
||||
area->y2 = (area->y2 & (~3)) + 3;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
@ -1,58 +0,0 @@
|
||||
/**
|
||||
* @file UC1610.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef UC1610_H
|
||||
#define UC1610_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_UC1610
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void uc1610_init(void);
|
||||
void uc1610_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
|
||||
void uc1610_rounder_cb(lv_disp_drv_t * disp_drv, lv_area_t * area);
|
||||
void uc1610_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_UC1610 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* UC1610_H */
|
@ -1,12 +0,0 @@
|
||||
CSRCS += fbdev.c
|
||||
CSRCS += monitor.c
|
||||
CSRCS += R61581.c
|
||||
CSRCS += SSD1963.c
|
||||
CSRCS += ST7565.c
|
||||
CSRCS += UC1610.c
|
||||
CSRCS += SHARP_MIP.c
|
||||
|
||||
DEPPATH += --dep-path $(LVGL_DIR)/lv_drivers/display
|
||||
VPATH += :$(LVGL_DIR)/lv_drivers/display
|
||||
|
||||
CFLAGS += "-I$(LVGL_DIR)/lv_drivers/display"
|
@ -1,241 +0,0 @@
|
||||
/**
|
||||
* @file fbdev.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "fbdev.h"
|
||||
#if USE_FBDEV || USE_BSD_FBDEV
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#if USE_BSD_FBDEV
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/consio.h>
|
||||
#include <sys/fbio.h>
|
||||
#else /* USE_BSD_FBDEV */
|
||||
#include <linux/fb.h>
|
||||
#endif /* USE_BSD_FBDEV */
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#ifndef FBDEV_PATH
|
||||
#define FBDEV_PATH "/dev/fb0"
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STRUCTURES
|
||||
**********************/
|
||||
|
||||
struct bsd_fb_var_info{
|
||||
uint32_t xoffset;
|
||||
uint32_t yoffset;
|
||||
uint32_t xres;
|
||||
uint32_t yres;
|
||||
int bits_per_pixel;
|
||||
};
|
||||
|
||||
struct bsd_fb_fix_info{
|
||||
long int line_length;
|
||||
};
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
#if USE_BSD_FBDEV
|
||||
static struct bsd_fb_var_info vinfo;
|
||||
static struct bsd_fb_fix_info finfo;
|
||||
#else
|
||||
static struct fb_var_screeninfo vinfo;
|
||||
static struct fb_fix_screeninfo finfo;
|
||||
#endif /* USE_BSD_FBDEV */
|
||||
static char *fbp = 0;
|
||||
static long int screensize = 0;
|
||||
static int fbfd = 0;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
void fbdev_init(void)
|
||||
{
|
||||
// Open the file for reading and writing
|
||||
fbfd = open(FBDEV_PATH, O_RDWR);
|
||||
if(fbfd == -1) {
|
||||
perror("Error: cannot open framebuffer device");
|
||||
return;
|
||||
}
|
||||
printf("The framebuffer device was opened successfully.\n");
|
||||
|
||||
#if USE_BSD_FBDEV
|
||||
struct fbtype fb;
|
||||
unsigned line_length;
|
||||
|
||||
//Get fb type
|
||||
if (ioctl(fbfd, FBIOGTYPE, &fb) != 0) {
|
||||
perror("ioctl(FBIOGTYPE)");
|
||||
return;
|
||||
}
|
||||
|
||||
//Get screen width
|
||||
if (ioctl(fbfd, FBIO_GETLINEWIDTH, &line_length) != 0) {
|
||||
perror("ioctl(FBIO_GETLINEWIDTH)");
|
||||
return;
|
||||
}
|
||||
|
||||
vinfo.xres = (unsigned) fb.fb_width;
|
||||
vinfo.yres = (unsigned) fb.fb_height;
|
||||
vinfo.bits_per_pixel = fb.fb_depth + 8;
|
||||
vinfo.xoffset = 0;
|
||||
vinfo.yoffset = 0;
|
||||
finfo.line_length = line_length;
|
||||
#else /* USE_BSD_FBDEV */
|
||||
|
||||
// Get fixed screen information
|
||||
if(ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
|
||||
perror("Error reading fixed information");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get variable screen information
|
||||
if(ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
|
||||
perror("Error reading variable information");
|
||||
return;
|
||||
}
|
||||
#endif /* USE_BSD_FBDEV */
|
||||
|
||||
printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
|
||||
|
||||
// Figure out the size of the screen in bytes
|
||||
screensize = finfo.smem_len; //finfo.line_length * vinfo.yres;
|
||||
|
||||
// Map the device to memory
|
||||
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
|
||||
if((intptr_t)fbp == -1) {
|
||||
perror("Error: failed to map framebuffer device to memory");
|
||||
return;
|
||||
}
|
||||
memset(fbp, 0, screensize);
|
||||
|
||||
printf("The framebuffer device was mapped to memory successfully.\n");
|
||||
|
||||
}
|
||||
|
||||
void fbdev_exit(void)
|
||||
{
|
||||
close(fbfd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush a buffer to the marked area
|
||||
* @param drv pointer to driver where this function belongs
|
||||
* @param area an area where to copy `color_p`
|
||||
* @param color_p an array of pixel to copy to the `area` part of the screen
|
||||
*/
|
||||
void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p)
|
||||
{
|
||||
if(fbp == NULL ||
|
||||
area->x2 < 0 ||
|
||||
area->y2 < 0 ||
|
||||
area->x1 > (int32_t)vinfo.xres - 1 ||
|
||||
area->y1 > (int32_t)vinfo.yres - 1) {
|
||||
lv_disp_flush_ready(drv);
|
||||
return;
|
||||
}
|
||||
|
||||
/*Truncate the area to the screen*/
|
||||
int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
|
||||
int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
|
||||
int32_t act_x2 = area->x2 > (int32_t)vinfo.xres - 1 ? (int32_t)vinfo.xres - 1 : area->x2;
|
||||
int32_t act_y2 = area->y2 > (int32_t)vinfo.yres - 1 ? (int32_t)vinfo.yres - 1 : area->y2;
|
||||
|
||||
|
||||
lv_coord_t w = lv_area_get_width(area);
|
||||
long int location = 0;
|
||||
long int byte_location = 0;
|
||||
unsigned char bit_location = 0;
|
||||
|
||||
/*32 or 24 bit per pixel*/
|
||||
if(vinfo.bits_per_pixel == 32 || vinfo.bits_per_pixel == 24) {
|
||||
uint32_t * fbp32 = (uint32_t *)fbp;
|
||||
int32_t y;
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
location = (act_x1 + vinfo.xoffset) + (y + vinfo.yoffset) * finfo.line_length / 4;
|
||||
memcpy(&fbp32[location], (uint32_t *)color_p, (act_x2 - act_x1 + 1) * 4);
|
||||
color_p += w;
|
||||
}
|
||||
}
|
||||
/*16 bit per pixel*/
|
||||
else if(vinfo.bits_per_pixel == 16) {
|
||||
uint16_t * fbp16 = (uint16_t *)fbp;
|
||||
int32_t y;
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
location = (act_x1 + vinfo.xoffset) + (y + vinfo.yoffset) * finfo.line_length / 2;
|
||||
memcpy(&fbp16[location], (uint32_t *)color_p, (act_x2 - act_x1 + 1) * 2);
|
||||
color_p += w;
|
||||
}
|
||||
}
|
||||
/*8 bit per pixel*/
|
||||
else if(vinfo.bits_per_pixel == 8) {
|
||||
uint8_t * fbp8 = (uint8_t *)fbp;
|
||||
int32_t y;
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
location = (act_x1 + vinfo.xoffset) + (y + vinfo.yoffset) * finfo.line_length;
|
||||
memcpy(&fbp8[location], (uint32_t *)color_p, (act_x2 - act_x1 + 1));
|
||||
color_p += w;
|
||||
}
|
||||
}
|
||||
/*1 bit per pixel*/
|
||||
else if(vinfo.bits_per_pixel == 1) {
|
||||
uint8_t * fbp8 = (uint8_t *)fbp;
|
||||
int32_t x;
|
||||
int32_t y;
|
||||
for(y = act_y1; y <= act_y2; y++) {
|
||||
for(x = act_x1; x <= act_x2; x++) {
|
||||
location = (x + vinfo.xoffset) + (y + vinfo.yoffset) * vinfo.xres;
|
||||
byte_location = location / 8; /* find the byte we need to change */
|
||||
bit_location = location % 8; /* inside the byte found, find the bit we need to change */
|
||||
fbp8[byte_location] &= ~(((uint8_t)(1)) << bit_location);
|
||||
fbp8[byte_location] |= ((uint8_t)(color_p->full)) << bit_location;
|
||||
color_p++;
|
||||
}
|
||||
|
||||
color_p += area->x2 - act_x2;
|
||||
}
|
||||
} else {
|
||||
/*Not supported bit per pixel*/
|
||||
}
|
||||
|
||||
//May be some direct update command is required
|
||||
//ret = ioctl(state->fd, FBIO_UPDATE, (unsigned long)((uintptr_t)rect));
|
||||
|
||||
lv_disp_flush_ready(drv);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
@ -1,58 +0,0 @@
|
||||
/**
|
||||
* @file fbdev.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef FBDEV_H
|
||||
#define FBDEV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_FBDEV || USE_BSD_FBDEV
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void fbdev_init(void);
|
||||
void fbdev_exit(void);
|
||||
void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p);
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_FBDEV*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*FBDEV_H*/
|
@ -1,423 +0,0 @@
|
||||
/**
|
||||
* @file monitor.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "monitor.h"
|
||||
#if USE_MONITOR
|
||||
|
||||
#ifndef MONITOR_SDL_INCLUDE_PATH
|
||||
#define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include MONITOR_SDL_INCLUDE_PATH
|
||||
#include "../indev/mouse.h"
|
||||
#include "../indev/keyboard.h"
|
||||
#include "../indev/mousewheel.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define SDL_REFR_PERIOD 50 /*ms*/
|
||||
|
||||
#ifndef MONITOR_ZOOM
|
||||
#define MONITOR_ZOOM 1
|
||||
#endif
|
||||
|
||||
#ifndef MONITOR_HOR_RES
|
||||
#define MONITOR_HOR_RES LV_HOR_RES
|
||||
#endif
|
||||
|
||||
#ifndef MONITOR_VER_RES
|
||||
#define MONITOR_VER_RES LV_VER_RES
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) && defined(TARGET_OS_MAC)
|
||||
#if __APPLE__ && TARGET_OS_MAC
|
||||
#define MONITOR_APPLE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
#define MONITOR_EMSCRIPTEN
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
SDL_Window* window;
|
||||
SDL_Renderer* renderer;
|
||||
SDL_Texture* texture;
|
||||
volatile bool sdl_refr_qry;
|
||||
#if MONITOR_DOUBLE_BUFFERED
|
||||
uint32_t* tft_fb_act;
|
||||
#else
|
||||
uint32_t tft_fb[LV_HOR_RES_MAX * LV_VER_RES_MAX];
|
||||
#endif
|
||||
double rotation;
|
||||
} monitor_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static int monitor_sdl_refr_thread(void* param);
|
||||
static void window_create(monitor_t* m);
|
||||
static void window_update(monitor_t* m);
|
||||
|
||||
/***********************
|
||||
* GLOBAL PROTOTYPES
|
||||
***********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
monitor_t monitor;
|
||||
|
||||
#if MONITOR_DUAL
|
||||
monitor_t monitor2;
|
||||
#endif
|
||||
|
||||
static volatile bool sdl_inited = false;
|
||||
static volatile bool sdl_quit_qry = false;
|
||||
|
||||
int quit_filter(void* userdata, SDL_Event* event);
|
||||
static void monitor_sdl_clean_up(void);
|
||||
static void monitor_sdl_init(void);
|
||||
#ifdef MONITOR_EMSCRIPTEN
|
||||
void monitor_sdl_refr_core(void); /* called from Emscripten loop */
|
||||
#else
|
||||
static void monitor_sdl_refr_core(void);
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the monitor
|
||||
*/
|
||||
void monitor_init(void)
|
||||
{
|
||||
/*OSX needs to initialize SDL here*/
|
||||
#if defined(MONITOR_APPLE) || defined(MONITOR_EMSCRIPTEN)
|
||||
monitor_sdl_init();
|
||||
#endif
|
||||
|
||||
#ifndef MONITOR_EMSCRIPTEN
|
||||
SDL_CreateThread(monitor_sdl_refr_thread, "sdl_refr", NULL);
|
||||
while(sdl_inited == false)
|
||||
; /*Wait until 'sdl_refr' initializes the SDL*/
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush a buffer to the marked area
|
||||
* @param drv pointer to driver where this function belongs
|
||||
* @param area an area where to copy `color_p`
|
||||
* @param color_p an array of pixel to copy to the `area` part of the screen
|
||||
*/
|
||||
void monitor_flush(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p)
|
||||
{
|
||||
lv_coord_t hres = disp_drv->rotated == 0 ? disp_drv->hor_res : disp_drv->ver_res;
|
||||
lv_coord_t vres = disp_drv->rotated == 0 ? disp_drv->ver_res : disp_drv->hor_res;
|
||||
|
||||
// printf("x1:%d,y1:%d,x2:%d,y2:%d\n", area->x1, area->y1, area->x2, area->y2);
|
||||
|
||||
/*Return if the area is out the screen*/
|
||||
if(area->x2 < 0 || area->y2 < 0 || area->x1 > hres - 1 || area->y1 > vres - 1) {
|
||||
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
return;
|
||||
}
|
||||
|
||||
#if MONITOR_DOUBLE_BUFFERED
|
||||
monitor.tft_fb_act = (uint32_t*)color_p;
|
||||
|
||||
monitor.sdl_refr_qry = true;
|
||||
|
||||
/*IMPORTANT! It must be called to tell the system the flush is ready*/
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
#else
|
||||
|
||||
int32_t y;
|
||||
#if LV_COLOR_DEPTH != 24 && LV_COLOR_DEPTH != 32 /*32 is valid but support 24 for backward compatibility too*/
|
||||
int32_t x;
|
||||
for(y = area->y1; y <= area->y2 && y < disp_drv->ver_res; y++) {
|
||||
for(x = area->x1; x <= area->x2; x++) {
|
||||
monitor.tft_fb[y * disp_drv->hor_res + x] = lv_color_to32(*color_p);
|
||||
color_p++;
|
||||
}
|
||||
}
|
||||
#else
|
||||
uint32_t w = lv_area_get_width(area);
|
||||
for(y = area->y1; y <= area->y2 && y < disp_drv->ver_res; y++) {
|
||||
memcpy(&monitor.tft_fb[y * MONITOR_HOR_RES + area->x1], color_p, w * sizeof(lv_color_t));
|
||||
color_p += w;
|
||||
}
|
||||
#endif
|
||||
|
||||
monitor.sdl_refr_qry = true;
|
||||
|
||||
/*IMPORTANT! It must be called to tell the system the flush is ready*/
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if MONITOR_DUAL
|
||||
|
||||
/**
|
||||
* Flush a buffer to the marked area
|
||||
* @param drv pointer to driver where this function belongs
|
||||
* @param area an area where to copy `color_p`
|
||||
* @param color_p an array of pixel to copy to the `area` part of the screen
|
||||
*/
|
||||
void monitor_flush2(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p)
|
||||
{
|
||||
lv_coord_t hres = disp_drv->rotated == 0 ? disp_drv->hor_res : disp_drv->ver_res;
|
||||
lv_coord_t vres = disp_drv->rotated == 0 ? disp_drv->ver_res : disp_drv->hor_res;
|
||||
|
||||
/*Return if the area is out the screen*/
|
||||
if(area->x2 < 0 || area->y2 < 0 || area->x1 > hres - 1 || area->y1 > vres - 1) {
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
return;
|
||||
}
|
||||
|
||||
#if MONITOR_DOUBLE_BUFFERED
|
||||
monitor2.tft_fb_act = (uint32_t*)color_p;
|
||||
|
||||
monitor2.sdl_refr_qry = true;
|
||||
|
||||
/*IMPORTANT! It must be called to tell the system the flush is ready*/
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
#else
|
||||
|
||||
int32_t y;
|
||||
#if LV_COLOR_DEPTH != 24 && LV_COLOR_DEPTH != 32 /*32 is valid but support 24 for backward compatibility too*/
|
||||
int32_t x;
|
||||
for(y = area->y1; y <= area->y2 && y < disp_drv->ver_res; y++) {
|
||||
for(x = area->x1; x <= area->x2; x++) {
|
||||
monitor2.tft_fb[y * disp_drv->hor_res + x] = lv_color_to32(*color_p);
|
||||
color_p++;
|
||||
}
|
||||
}
|
||||
#else
|
||||
uint32_t w = lv_area_get_width(area);
|
||||
for(y = area->y1; y <= area->y2 && y < disp_drv->ver_res; y++) {
|
||||
memcpy(&monitor2.tft_fb[y * disp_drv->hor_res + area->x1], color_p, w * sizeof(lv_color_t));
|
||||
color_p += w;
|
||||
}
|
||||
#endif
|
||||
|
||||
monitor2.sdl_refr_qry = true;
|
||||
|
||||
/*IMPORTANT! It must be called to tell the system the flush is ready*/
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* SDL main thread. All SDL related task have to be handled here!
|
||||
* It initializes SDL, handles drawing and the mouse.
|
||||
*/
|
||||
|
||||
static int monitor_sdl_refr_thread(void* param)
|
||||
{
|
||||
(void)param;
|
||||
|
||||
/*If not OSX initialize SDL in the Thread*/
|
||||
#ifndef MONITOR_APPLE
|
||||
monitor_sdl_init();
|
||||
#endif
|
||||
/*Run until quit event not arrives*/
|
||||
while(sdl_quit_qry == false) {
|
||||
/*Refresh handling*/
|
||||
monitor_sdl_refr_core();
|
||||
}
|
||||
|
||||
monitor_sdl_clean_up();
|
||||
exit(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int quit_filter(void* userdata, SDL_Event* event)
|
||||
{
|
||||
(void)userdata;
|
||||
|
||||
if(event->type == SDL_WINDOWEVENT) {
|
||||
if(event->window.event == SDL_WINDOWEVENT_CLOSE) {
|
||||
sdl_quit_qry = true;
|
||||
}
|
||||
} else if(event->type == SDL_QUIT) {
|
||||
sdl_quit_qry = true;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void monitor_sdl_clean_up(void)
|
||||
{
|
||||
SDL_DestroyTexture(monitor.texture);
|
||||
SDL_DestroyRenderer(monitor.renderer);
|
||||
SDL_DestroyWindow(monitor.window);
|
||||
|
||||
#if MONITOR_DUAL
|
||||
SDL_DestroyTexture(monitor2.texture);
|
||||
SDL_DestroyRenderer(monitor2.renderer);
|
||||
SDL_DestroyWindow(monitor2.window);
|
||||
|
||||
#endif
|
||||
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
void monitor_backlight(uint8_t level)
|
||||
{
|
||||
SDL_SetTextureColorMod(monitor.texture, level, level, level);
|
||||
window_update(&monitor);
|
||||
}
|
||||
|
||||
void monitor_title(const char* title)
|
||||
{
|
||||
SDL_SetWindowTitle(monitor.window, title);
|
||||
// SDL_SetWindowFullscreen(monitor.window, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||
}
|
||||
|
||||
static void monitor_sdl_init(void)
|
||||
{
|
||||
/*Initialize the SDL*/
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
|
||||
SDL_SetEventFilter(quit_filter, NULL);
|
||||
|
||||
window_create(&monitor);
|
||||
#if MONITOR_DUAL
|
||||
window_create(&monitor2);
|
||||
int x, y;
|
||||
SDL_GetWindowPosition(monitor2.window, &x, &y);
|
||||
SDL_SetWindowPosition(monitor.window, x + MONITOR_HOR_RES / 2 + 10, y);
|
||||
SDL_SetWindowPosition(monitor2.window, x - MONITOR_HOR_RES / 2 - 10, y);
|
||||
#endif
|
||||
|
||||
sdl_inited = true;
|
||||
}
|
||||
|
||||
#ifdef MONITOR_EMSCRIPTEN
|
||||
void monitor_sdl_refr_core(void)
|
||||
#else
|
||||
static void monitor_sdl_refr_core(void)
|
||||
#endif
|
||||
{
|
||||
|
||||
if(monitor.sdl_refr_qry != false) {
|
||||
monitor.sdl_refr_qry = false;
|
||||
window_update(&monitor);
|
||||
}
|
||||
|
||||
#if MONITOR_DUAL
|
||||
if(monitor2.sdl_refr_qry != false) {
|
||||
monitor2.sdl_refr_qry = false;
|
||||
window_update(&monitor2);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(MONITOR_APPLE) && !defined(MONITOR_EMSCRIPTEN)
|
||||
SDL_Event event;
|
||||
while(SDL_PollEvent(&event)) {
|
||||
#if USE_MOUSE != 0
|
||||
mouse_handler(&event);
|
||||
#endif
|
||||
|
||||
#if USE_MOUSEWHEEL != 0
|
||||
mousewheel_handler(&event);
|
||||
#endif
|
||||
|
||||
#if USE_KEYBOARD
|
||||
keyboard_handler(&event);
|
||||
#endif
|
||||
if((&event)->type == SDL_WINDOWEVENT) {
|
||||
switch((&event)->window.event) {
|
||||
#if SDL_VERSION_ATLEAST(2, 0, 5)
|
||||
case SDL_WINDOWEVENT_TAKE_FOCUS:
|
||||
#endif
|
||||
case SDL_WINDOWEVENT_EXPOSED:
|
||||
window_update(&monitor);
|
||||
#if MONITOR_DUAL
|
||||
window_update(&monitor2);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /*MONITOR_APPLE*/
|
||||
|
||||
/*Sleep some time*/
|
||||
SDL_Delay(SDL_REFR_PERIOD);
|
||||
}
|
||||
|
||||
static void window_create(monitor_t* m)
|
||||
{
|
||||
m->window = SDL_CreateWindow("TFT Simulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||
MONITOR_HOR_RES * MONITOR_ZOOM, MONITOR_VER_RES * MONITOR_ZOOM,
|
||||
0); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/
|
||||
|
||||
#if MONITOR_VIRTUAL_MACHINE || defined(MONITOR_EMSCRIPTEN)
|
||||
m->renderer = SDL_CreateRenderer(m->window, -1, SDL_RENDERER_SOFTWARE);
|
||||
#else
|
||||
m->renderer = SDL_CreateRenderer(m->window, -1, 0);
|
||||
#endif
|
||||
m->texture = SDL_CreateTexture(m->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, MONITOR_HOR_RES,
|
||||
MONITOR_VER_RES);
|
||||
SDL_SetTextureBlendMode(m->texture, SDL_BLENDMODE_BLEND);
|
||||
|
||||
/*Initialize the frame buffer to gray (77 is an empirical value) */
|
||||
#if MONITOR_DOUBLE_BUFFERED
|
||||
SDL_UpdateTexture(m->texture, NULL, m->tft_fb_act, MONITOR_HOR_RES * sizeof(uint32_t));
|
||||
#else
|
||||
memset(m->tft_fb, 0x44, MONITOR_HOR_RES * MONITOR_VER_RES * sizeof(uint32_t));
|
||||
#endif
|
||||
|
||||
m->sdl_refr_qry = true;
|
||||
}
|
||||
|
||||
static void window_update(monitor_t* m)
|
||||
{
|
||||
#if MONITOR_DOUBLE_BUFFERED == 0
|
||||
SDL_UpdateTexture(m->texture, NULL, m->tft_fb, MONITOR_HOR_RES * sizeof(uint32_t));
|
||||
#else
|
||||
if(m->tft_fb_act == NULL) return;
|
||||
SDL_UpdateTexture(m->texture, NULL, m->tft_fb_act, MONITOR_HOR_RES * sizeof(uint32_t));
|
||||
#endif
|
||||
SDL_RenderClear(m->renderer);
|
||||
/*Test: Draw a background to test transparent screens (LV_COLOR_SCREEN_TRANSP)*/
|
||||
// SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, 0xff);
|
||||
// SDL_Rect r;
|
||||
// r.x = 0; r.y = 0; r.w = MONITOR_HOR_RES; r.w = MONITOR_VER_RES;
|
||||
// SDL_RenderDrawRect(renderer, &r);
|
||||
|
||||
/*Update the renderer with the texture containing the rendered image*/
|
||||
// SDL_RenderCopy(m->renderer, m->texture, NULL, NULL);
|
||||
SDL_RenderCopyEx(m->renderer, m->texture, NULL, NULL, m->rotation, NULL, SDL_FLIP_NONE);
|
||||
SDL_RenderPresent(m->renderer);
|
||||
}
|
||||
|
||||
#endif /*USE_MONITOR*/
|
@ -1,61 +0,0 @@
|
||||
/**
|
||||
* @file monitor.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MONITOR_H
|
||||
#define MONITOR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_MONITOR
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void monitor_init(void);
|
||||
void monitor_flush(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p);
|
||||
void monitor_flush2(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p);
|
||||
|
||||
// HASP Customized functions
|
||||
void monitor_backlight(uint8_t level);
|
||||
void monitor_title(const char* title);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_MONITOR */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* MONITOR_H */
|
@ -1 +0,0 @@
|
||||
--style=kr --convert-tabs --indent=spaces=4 --indent-switches --pad-oper --unpad-paren --align-pointer=middle --suffix=.bak --lineend=linux --min-conditional-indent=
|
@ -1 +0,0 @@
|
||||
--convert-tabs --indent=spaces=4
|
@ -1,383 +0,0 @@
|
||||
/**
|
||||
* @file AD_touch.c
|
||||
*
|
||||
*/
|
||||
|
||||
#include "AD_touch.h"
|
||||
|
||||
#if USE_AD_TOUCH
|
||||
|
||||
#include LV_DRV_INDEV_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
#define SAMPLE_POINTS 4
|
||||
|
||||
#define CALIBRATIONINSET 20 // range 0 <= CALIBRATIONINSET <= 40
|
||||
|
||||
#define RESISTIVETOUCH_AUTO_SAMPLE_MODE
|
||||
#define TOUCHSCREEN_RESISTIVE_PRESS_THRESHOLD 350 // between 0-0x03ff the lesser this value
|
||||
|
||||
|
||||
// Current ADC values for X and Y channels
|
||||
int16_t adcX = 0;
|
||||
int16_t adcY = 0;
|
||||
volatile unsigned int adcTC = 0;
|
||||
|
||||
// coefficient values
|
||||
volatile long _trA;
|
||||
volatile long _trB;
|
||||
volatile long _trC;
|
||||
volatile long _trD;
|
||||
|
||||
volatile int16_t xRawTouch[SAMPLE_POINTS] = {TOUCHCAL_ULX, TOUCHCAL_URX, TOUCHCAL_LRX, TOUCHCAL_LLX};
|
||||
volatile int16_t yRawTouch[SAMPLE_POINTS] = {TOUCHCAL_ULY, TOUCHCAL_URY, TOUCHCAL_LRY, TOUCHCAL_LLY};
|
||||
|
||||
#define TOUCHSCREEN_RESISTIVE_CALIBRATION_SCALE_FACTOR 8
|
||||
|
||||
// use this scale factor to avoid working in floating point numbers
|
||||
#define SCALE_FACTOR (1 << TOUCHSCREEN_RESISTIVE_CALIBRATION_SCALE_FACTOR)
|
||||
|
||||
typedef enum {
|
||||
IDLE, //0
|
||||
SET_X, //1
|
||||
RUN_X, //2
|
||||
GET_X, //3
|
||||
RUN_CHECK_X, //4
|
||||
CHECK_X, //5
|
||||
SET_Y, //6
|
||||
RUN_Y, //7
|
||||
GET_Y, //8
|
||||
CHECK_Y, //9
|
||||
SET_VALUES, //10
|
||||
GET_POT, //11
|
||||
RUN_POT //12
|
||||
} TOUCH_STATES;
|
||||
|
||||
volatile TOUCH_STATES state = IDLE;
|
||||
|
||||
#define CAL_X_INSET (((GetMaxX() + 1) * (CALIBRATIONINSET >> 1)) / 100)
|
||||
#define CAL_Y_INSET (((GetMaxY() + 1) * (CALIBRATIONINSET >> 1)) / 100)
|
||||
|
||||
int stat;
|
||||
int16_t temp_x, temp_y;
|
||||
|
||||
|
||||
static int16_t TouchGetX(void);
|
||||
static int16_t TouchGetRawX(void);
|
||||
static int16_t TouchGetY(void);
|
||||
static int16_t TouchGetRawY(void);
|
||||
static int16_t TouchDetectPosition(void);
|
||||
static void TouchCalculateCalPoints(void);
|
||||
|
||||
|
||||
/********************************************************************/
|
||||
void ad_touch_init(void)
|
||||
{
|
||||
// Initialize ADC for auto sampling mode
|
||||
AD1CON1 = 0; // reset
|
||||
AD1CON2 = 0; // AVdd, AVss, int every conversion, MUXA only
|
||||
AD1CON3 = 0x1FFF; // 31 Tad auto-sample, Tad = 256*Tcy
|
||||
AD1CON1 = 0x80E0; // Turn on A/D module, use auto-convert
|
||||
|
||||
|
||||
ADPCFG_XPOS = RESISTIVETOUCH_ANALOG;
|
||||
ADPCFG_YPOS = RESISTIVETOUCH_ANALOG;
|
||||
|
||||
AD1CSSL = 0; // No scanned inputs
|
||||
|
||||
state = SET_X; // set the state of the state machine to start the sampling
|
||||
|
||||
/*Load calibration data*/
|
||||
xRawTouch[0] = TOUCHCAL_ULX;
|
||||
yRawTouch[0] = TOUCHCAL_ULY;
|
||||
xRawTouch[1] = TOUCHCAL_URX;
|
||||
yRawTouch[1] = TOUCHCAL_URY;
|
||||
xRawTouch[3] = TOUCHCAL_LLX;
|
||||
yRawTouch[3] = TOUCHCAL_LLY;
|
||||
xRawTouch[2] = TOUCHCAL_LRX;
|
||||
yRawTouch[2] = TOUCHCAL_LRY;
|
||||
|
||||
TouchCalculateCalPoints();
|
||||
}
|
||||
|
||||
/*Use this in lv_indev_drv*/
|
||||
bool ad_touch_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
static int16_t last_x = 0;
|
||||
static int16_t last_y = 0;
|
||||
|
||||
int16_t x, y;
|
||||
|
||||
x = TouchGetX();
|
||||
y = TouchGetY();
|
||||
|
||||
if((x > 0) && (y > 0)) {
|
||||
data->point.x = x;
|
||||
data->point.y = y;
|
||||
last_x = data->point.x;
|
||||
last_y = data->point.y;
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
} else {
|
||||
data->point.x = last_x;
|
||||
data->point.y = last_y;
|
||||
data->state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Call periodically (e.g. in every 1 ms) to handle reading with ADC*/
|
||||
int16_t ad_touch_handler(void)
|
||||
{
|
||||
static int16_t tempX, tempY;
|
||||
int16_t temp;
|
||||
|
||||
switch(state) {
|
||||
case IDLE:
|
||||
adcX = 0;
|
||||
adcY = 0;
|
||||
break;
|
||||
|
||||
case SET_VALUES:
|
||||
if(!TOUCH_ADC_DONE)
|
||||
break;
|
||||
if((WORD)TOUCHSCREEN_RESISTIVE_PRESS_THRESHOLD < (WORD)ADC1BUF0) {
|
||||
adcX = 0;
|
||||
adcY = 0;
|
||||
} else {
|
||||
adcX = tempX;
|
||||
adcY = tempY;
|
||||
}
|
||||
state = SET_X;
|
||||
return 1; // touch screen acquisition is done
|
||||
|
||||
case SET_X:
|
||||
TOUCH_ADC_INPUT_SEL = ADC_XPOS;
|
||||
|
||||
ResistiveTouchScreen_XPlus_Config_As_Input();
|
||||
ResistiveTouchScreen_YPlus_Config_As_Input();
|
||||
ResistiveTouchScreen_XMinus_Config_As_Input();
|
||||
ResistiveTouchScreen_YMinus_Drive_Low();
|
||||
ResistiveTouchScreen_YMinus_Config_As_Output();
|
||||
|
||||
ADPCFG_YPOS = RESISTIVETOUCH_DIGITAL; // set to digital pin
|
||||
ADPCFG_XPOS = RESISTIVETOUCH_ANALOG; // set to analog pin
|
||||
|
||||
TOUCH_ADC_START = 1; // run conversion
|
||||
state = CHECK_X;
|
||||
break;
|
||||
|
||||
case CHECK_X:
|
||||
case CHECK_Y:
|
||||
|
||||
if(TOUCH_ADC_DONE == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if((WORD)TOUCHSCREEN_RESISTIVE_PRESS_THRESHOLD > (WORD)ADC1BUF0) {
|
||||
if(state == CHECK_X) {
|
||||
ResistiveTouchScreen_YPlus_Drive_High();
|
||||
ResistiveTouchScreen_YPlus_Config_As_Output();
|
||||
tempX = 0;
|
||||
state = RUN_X;
|
||||
} else {
|
||||
ResistiveTouchScreen_XPlus_Drive_High();
|
||||
ResistiveTouchScreen_XPlus_Config_As_Output();
|
||||
tempY = 0;
|
||||
state = RUN_Y;
|
||||
}
|
||||
} else {
|
||||
adcX = 0;
|
||||
adcY = 0;
|
||||
state = SET_X;
|
||||
return 1; // touch screen acquisition is done
|
||||
break;
|
||||
}
|
||||
|
||||
case RUN_X:
|
||||
case RUN_Y:
|
||||
TOUCH_ADC_START = 1;
|
||||
state = (state == RUN_X) ? GET_X : GET_Y;
|
||||
// no break needed here since the next state is either GET_X or GET_Y
|
||||
break;
|
||||
|
||||
case GET_X:
|
||||
case GET_Y:
|
||||
if(!TOUCH_ADC_DONE)
|
||||
break;
|
||||
|
||||
temp = ADC1BUF0;
|
||||
if(state == GET_X) {
|
||||
if(temp != tempX) {
|
||||
tempX = temp;
|
||||
state = RUN_X;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if(temp != tempY) {
|
||||
tempY = temp;
|
||||
state = RUN_Y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(state == GET_X)
|
||||
ResistiveTouchScreen_YPlus_Config_As_Input();
|
||||
else
|
||||
ResistiveTouchScreen_XPlus_Config_As_Input();
|
||||
TOUCH_ADC_START = 1;
|
||||
state = (state == GET_X) ? SET_Y : SET_VALUES;
|
||||
break;
|
||||
|
||||
case SET_Y:
|
||||
if(!TOUCH_ADC_DONE)
|
||||
break;
|
||||
|
||||
if((WORD)TOUCHSCREEN_RESISTIVE_PRESS_THRESHOLD < (WORD)ADC1BUF0) {
|
||||
adcX = 0;
|
||||
adcY = 0;
|
||||
state = SET_X;
|
||||
return 1; // touch screen acquisition is done
|
||||
break;
|
||||
}
|
||||
|
||||
TOUCH_ADC_INPUT_SEL = ADC_YPOS;
|
||||
|
||||
ResistiveTouchScreen_XPlus_Config_As_Input();
|
||||
ResistiveTouchScreen_YPlus_Config_As_Input();
|
||||
ResistiveTouchScreen_XMinus_Drive_Low();
|
||||
ResistiveTouchScreen_XMinus_Config_As_Output();
|
||||
ResistiveTouchScreen_YMinus_Config_As_Input();
|
||||
|
||||
ADPCFG_YPOS = RESISTIVETOUCH_ANALOG; // set to analog pin
|
||||
ADPCFG_XPOS = RESISTIVETOUCH_DIGITAL; // set to digital pin
|
||||
TOUCH_ADC_START = 1; // run conversion
|
||||
state = CHECK_Y;
|
||||
break;
|
||||
|
||||
default:
|
||||
state = SET_X;
|
||||
return 1; // touch screen acquisition is done
|
||||
}
|
||||
stat = state;
|
||||
temp_x = adcX;
|
||||
temp_y = adcY;
|
||||
|
||||
return 0; // touch screen acquisition is not done
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/********************************************************************/
|
||||
static int16_t TouchGetX(void)
|
||||
{
|
||||
long result;
|
||||
|
||||
result = TouchGetRawX();
|
||||
|
||||
if(result > 0) {
|
||||
result = (long)((((long)_trC * result) + _trD) >> TOUCHSCREEN_RESISTIVE_CALIBRATION_SCALE_FACTOR);
|
||||
|
||||
}
|
||||
return ((int16_t)result);
|
||||
}
|
||||
/********************************************************************/
|
||||
static int16_t TouchGetRawX(void)
|
||||
{
|
||||
#ifdef TOUCHSCREEN_RESISTIVE_SWAP_XY
|
||||
return adcY;
|
||||
#else
|
||||
return adcX;
|
||||
#endif
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
static int16_t TouchGetY(void)
|
||||
{
|
||||
|
||||
long result;
|
||||
|
||||
result = TouchGetRawY();
|
||||
|
||||
if(result > 0) {
|
||||
result = (long)((((long)_trA * result) + (long)_trB) >> TOUCHSCREEN_RESISTIVE_CALIBRATION_SCALE_FACTOR);
|
||||
|
||||
}
|
||||
return ((int16_t)result);
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
static int16_t TouchGetRawY(void)
|
||||
{
|
||||
#ifdef TOUCHSCREEN_RESISTIVE_SWAP_XY
|
||||
return adcX;
|
||||
#else
|
||||
return adcY;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void TouchCalculateCalPoints(void)
|
||||
{
|
||||
long trA, trB, trC, trD; // variables for the coefficients
|
||||
long trAhold, trBhold, trChold, trDhold;
|
||||
long test1, test2; // temp variables (must be signed type)
|
||||
|
||||
int16_t xPoint[SAMPLE_POINTS], yPoint[SAMPLE_POINTS];
|
||||
|
||||
yPoint[0] = yPoint[1] = CAL_Y_INSET;
|
||||
yPoint[2] = yPoint[3] = (GetMaxY() - CAL_Y_INSET);
|
||||
xPoint[0] = xPoint[3] = CAL_X_INSET;
|
||||
xPoint[1] = xPoint[2] = (GetMaxX() - CAL_X_INSET);
|
||||
|
||||
// calculate points transfer functiona
|
||||
// based on two simultaneous equations solve for the
|
||||
// constants
|
||||
|
||||
// use sample points 1 and 4
|
||||
// Dy1 = aTy1 + b; Dy4 = aTy4 + b
|
||||
// Dx1 = cTx1 + d; Dy4 = aTy4 + b
|
||||
|
||||
test1 = (long)yPoint[0] - (long)yPoint[3];
|
||||
test2 = (long)yRawTouch[0] - (long)yRawTouch[3];
|
||||
|
||||
trA = ((long)((long)test1 * SCALE_FACTOR) / test2);
|
||||
trB = ((long)((long)yPoint[0] * SCALE_FACTOR) - (trA * (long)yRawTouch[0]));
|
||||
|
||||
test1 = (long)xPoint[0] - (long)xPoint[2];
|
||||
test2 = (long)xRawTouch[0] - (long)xRawTouch[2];
|
||||
|
||||
trC = ((long)((long)test1 * SCALE_FACTOR) / test2);
|
||||
trD = ((long)((long)xPoint[0] * SCALE_FACTOR) - (trC * (long)xRawTouch[0]));
|
||||
|
||||
trAhold = trA;
|
||||
trBhold = trB;
|
||||
trChold = trC;
|
||||
trDhold = trD;
|
||||
|
||||
// use sample points 2 and 3
|
||||
// Dy2 = aTy2 + b; Dy3 = aTy3 + b
|
||||
// Dx2 = cTx2 + d; Dy3 = aTy3 + b
|
||||
|
||||
test1 = (long)yPoint[1] - (long)yPoint[2];
|
||||
test2 = (long)yRawTouch[1] - (long)yRawTouch[2];
|
||||
|
||||
trA = ((long)(test1 * SCALE_FACTOR) / test2);
|
||||
trB = ((long)((long)yPoint[1] * SCALE_FACTOR) - (trA * (long)yRawTouch[1]));
|
||||
|
||||
test1 = (long)xPoint[1] - (long)xPoint[3];
|
||||
test2 = (long)xRawTouch[1] - (long)xRawTouch[3];
|
||||
|
||||
trC = ((long)((long)test1 * SCALE_FACTOR) / test2);
|
||||
trD = ((long)((long)xPoint[1] * SCALE_FACTOR) - (trC * (long)xRawTouch[1]));
|
||||
|
||||
// get the average and use the average
|
||||
_trA = (trA + trAhold) >> 1;
|
||||
_trB = (trB + trBhold) >> 1;
|
||||
_trC = (trC + trChold) >> 1;
|
||||
_trD = (trD + trDhold) >> 1;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,120 +0,0 @@
|
||||
/**
|
||||
* @file AD_touch.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AD_TOUCH_H
|
||||
#define AD_TOUCH_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_AD_TOUCH
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#define _SUPPRESS_PLIB_WARNING
|
||||
#include <plib.h>
|
||||
|
||||
#include "GenericTypeDefs.h"
|
||||
|
||||
#define DISP_ORIENTATION 0
|
||||
#define DISP_HOR_RESOLUTION 320
|
||||
#define DISP_VER_RESOLUTION 240
|
||||
|
||||
/*GetMaxX Macro*/
|
||||
#if (DISP_ORIENTATION == 90) || (DISP_ORIENTATION == 270)
|
||||
#define GetMaxX() (DISP_VER_RESOLUTION - 1)
|
||||
#elif (DISP_ORIENTATION == 0) || (DISP_ORIENTATION == 180)
|
||||
#define GetMaxX() (DISP_HOR_RESOLUTION - 1)
|
||||
#endif
|
||||
|
||||
/*GetMaxY Macro*/
|
||||
#if (DISP_ORIENTATION == 90) || (DISP_ORIENTATION == 270)
|
||||
#define GetMaxY() (DISP_HOR_RESOLUTION - 1)
|
||||
#elif (DISP_ORIENTATION == 0) || (DISP_ORIENTATION == 180)
|
||||
#define GetMaxY() (DISP_VER_RESOLUTION - 1)
|
||||
#endif
|
||||
|
||||
/*********************************************************************
|
||||
* HARDWARE PROFILE FOR THE RESISTIVE TOUCHSCREEN
|
||||
*********************************************************************/
|
||||
|
||||
#define TOUCH_ADC_INPUT_SEL AD1CHS
|
||||
|
||||
// ADC Sample Start
|
||||
#define TOUCH_ADC_START AD1CON1bits.SAMP
|
||||
|
||||
// ADC Status
|
||||
#define TOUCH_ADC_DONE AD1CON1bits.DONE
|
||||
|
||||
#define RESISTIVETOUCH_ANALOG 1
|
||||
#define RESISTIVETOUCH_DIGITAL 0
|
||||
|
||||
// ADC channel constants
|
||||
#define ADC_XPOS ADC_CH0_POS_SAMPLEA_AN12
|
||||
#define ADC_YPOS ADC_CH0_POS_SAMPLEA_AN13
|
||||
|
||||
// ADC Port Control Bits
|
||||
#define ADPCFG_XPOS AD1PCFGbits.PCFG12 //XR
|
||||
#define ADPCFG_YPOS AD1PCFGbits.PCFG13 //YD
|
||||
|
||||
// X port definitions
|
||||
#define ResistiveTouchScreen_XPlus_Drive_High() LATBbits.LATB12 = 1
|
||||
#define ResistiveTouchScreen_XPlus_Drive_Low() LATBbits.LATB12 = 0 //LAT_XPOS
|
||||
#define ResistiveTouchScreen_XPlus_Config_As_Input() TRISBbits.TRISB12 = 1 //TRIS_XPOS
|
||||
#define ResistiveTouchScreen_XPlus_Config_As_Output() TRISBbits.TRISB12 = 0
|
||||
|
||||
#define ResistiveTouchScreen_XMinus_Drive_High() LATFbits.LATF0 = 1
|
||||
#define ResistiveTouchScreen_XMinus_Drive_Low() LATFbits.LATF0 = 0 //LAT_XNEG
|
||||
#define ResistiveTouchScreen_XMinus_Config_As_Input() TRISFbits.TRISF0 = 1 //TRIS_XNEG
|
||||
#define ResistiveTouchScreen_XMinus_Config_As_Output() TRISFbits.TRISF0 = 0
|
||||
|
||||
// Y port definitions
|
||||
#define ResistiveTouchScreen_YPlus_Drive_High() LATBbits.LATB13 = 1
|
||||
#define ResistiveTouchScreen_YPlus_Drive_Low() LATBbits.LATB13 = 0 //LAT_YPOS
|
||||
#define ResistiveTouchScreen_YPlus_Config_As_Input() TRISBbits.TRISB13 = 1 //TRIS_YPOS
|
||||
#define ResistiveTouchScreen_YPlus_Config_As_Output() TRISBbits.TRISB13 = 0
|
||||
|
||||
#define ResistiveTouchScreen_YMinus_Drive_High() LATFbits.LATF1 = 1
|
||||
#define ResistiveTouchScreen_YMinus_Drive_Low() LATFbits.LATF1 = 0 //LAT_YNEG
|
||||
#define ResistiveTouchScreen_YMinus_Config_As_Input() TRISFbits.TRISF1 = 1 //TRIS_YNEG
|
||||
#define ResistiveTouchScreen_YMinus_Config_As_Output() TRISFbits.TRISF1 = 0
|
||||
|
||||
// Default calibration points
|
||||
#define TOUCHCAL_ULX 0x0348
|
||||
#define TOUCHCAL_ULY 0x00CC
|
||||
#define TOUCHCAL_URX 0x00D2
|
||||
#define TOUCHCAL_URY 0x00CE
|
||||
#define TOUCHCAL_LLX 0x034D
|
||||
#define TOUCHCAL_LLY 0x0335
|
||||
#define TOUCHCAL_LRX 0x00D6
|
||||
#define TOUCHCAL_LRY 0x032D
|
||||
|
||||
void ad_touch_init(void);
|
||||
bool ad_touch_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
int16_t ad_touch_handler(void);
|
||||
|
||||
#endif /* USE_AD_TOUCH */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* AD_TOUCH_H */
|
@ -1,179 +0,0 @@
|
||||
/**
|
||||
* @file FT5406EE8.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "FT5406EE8.h"
|
||||
#if USE_FT5406EE8
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include LV_DRV_INDEV_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
#define I2C_WR_BIT 0x00
|
||||
#define I2C_RD_BIT 0x01
|
||||
|
||||
/*DEVICE MODES*/
|
||||
#define OPERAT_MD 0x00
|
||||
#define TEST_MD 0x04
|
||||
#define SYS_INF_MD 0x01
|
||||
|
||||
/*OPERATING MODE*/
|
||||
#define DEVICE_MODE 0x00
|
||||
#define GEST_ID 0x01
|
||||
#define TD_STATUS 0x02
|
||||
|
||||
#define FT5406EE8_FINGER_MAX 10
|
||||
|
||||
/*Register adresses*/
|
||||
#define FT5406EE8_REG_DEVICE_MODE 0x00
|
||||
#define FT5406EE8_REG_GEST_ID 0x01
|
||||
#define FT5406EE8_REG_TD_STATUS 0x02
|
||||
#define FT5406EE8_REG_YH 0x03
|
||||
#define FT5406EE8_REG_YL 0x04
|
||||
#define FT5406EE8_REG_XH 0x05
|
||||
#define FT5406EE8_REG_XL 0x06
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
static bool ft5406ee8_get_touch_num(void);
|
||||
static bool ft5406ee8_read_finger1(int16_t * x, int16_t * y);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void ft5406ee8_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current position and state of the touchpad
|
||||
* @param data store the read data here
|
||||
* @return false: because no ore data to be read
|
||||
*/
|
||||
bool ft5406ee8_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
static int16_t x_last;
|
||||
static int16_t y_last;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
bool valid = true;
|
||||
|
||||
valid = ft5406ee8_get_touch_num();
|
||||
if(valid == true) {
|
||||
valid = ft5406ee8_read_finger1(&x, &y);
|
||||
}
|
||||
|
||||
if(valid == true) {
|
||||
x = (uint32_t)((uint32_t)x * 320) / 2048;
|
||||
y = (uint32_t)((uint32_t)y * 240) / 2048;
|
||||
|
||||
|
||||
x_last = x;
|
||||
y_last = y;
|
||||
} else {
|
||||
x = x_last;
|
||||
y = y_last;
|
||||
}
|
||||
|
||||
data->point.x = x;
|
||||
data->point.y = y;
|
||||
data->state = valid == false ? LV_INDEV_STATE_REL : LV_INDEV_STATE_PR;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static bool ft5406ee8_get_touch_num(void)
|
||||
{
|
||||
bool ok = true;
|
||||
uint8_t t_num = 0;
|
||||
|
||||
LV_DRV_INDEV_I2C_START;
|
||||
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_WR_BIT);
|
||||
LV_DRV_INDEV_I2C_WR(FT5406EE8_REG_TD_STATUS)
|
||||
LV_DRV_INDEV_I2C_RESTART;
|
||||
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_RD_BIT);
|
||||
t_num = LV_DRV_INDEV_I2C_READ(0);
|
||||
|
||||
/* Error if not touched or too much finger */
|
||||
if(t_num > FT5406EE8_FINGER_MAX || t_num == 0) {
|
||||
ok = false;
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the x and y coordinated
|
||||
* @param x store the x coordinate here
|
||||
* @param y store the y coordinate here
|
||||
* @return false: not valid point; true: valid point
|
||||
*/
|
||||
static bool ft5406ee8_read_finger1(int16_t * x, int16_t * y)
|
||||
{
|
||||
uint8_t temp_xH = 0;
|
||||
uint8_t temp_xL = 0;
|
||||
uint8_t temp_yH = 0;
|
||||
uint8_t temp_yL = 0;
|
||||
|
||||
/*Read Y High and low byte*/
|
||||
LV_DRV_INDEV_I2C_START;
|
||||
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_WR_BIT);
|
||||
LV_DRV_INDEV_I2C_WR(FT5406EE8_REG_YH)
|
||||
LV_DRV_INDEV_I2C_RESTART;
|
||||
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_RD_BIT);
|
||||
temp_yH = LV_DRV_INDEV_I2C_READ(1);
|
||||
temp_yL = LV_DRV_INDEV_I2C_READ(1);
|
||||
|
||||
/*The upper two bit must be 2 on valid press*/
|
||||
if(((temp_yH >> 6) & 0xFF) != 2) {
|
||||
(void) LV_DRV_INDEV_I2C_READ(0); /*Dummy read to close read sequence*/
|
||||
*x = 0;
|
||||
*y = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*Read X High and low byte*/
|
||||
temp_xH = LV_DRV_INDEV_I2C_READ(1);
|
||||
temp_xL = LV_DRV_INDEV_I2C_READ(0);
|
||||
|
||||
/*Save the result*/
|
||||
*x = (temp_xH & 0x0F) << 8;
|
||||
*x += temp_xL;
|
||||
*y = (temp_yH & 0x0F) << 8;
|
||||
*y += temp_yL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,56 +0,0 @@
|
||||
/**
|
||||
* @file FT5406EE8.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef FT5406EE8_H
|
||||
#define FT5406EE8_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_FT5406EE8
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void ft5406ee8_init(void);
|
||||
bool ft5406ee8_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_FT5406EE8 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* FT5406EE8_H */
|
@ -1,210 +0,0 @@
|
||||
/**
|
||||
* @file XPT2046.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "XPT2046.h"
|
||||
#if USE_XPT2046
|
||||
|
||||
#include <stddef.h>
|
||||
#include LV_DRV_INDEV_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
#include <SPI.h>
|
||||
#include "XPT2046_Touchscreen.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define CMD_X_READ 0b10010000
|
||||
#define CMD_Y_READ 0b11010000
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void xpt2046_corr(int16_t * x, int16_t * y);
|
||||
static void xpt2046_avg(int16_t * x, int16_t * y);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
int16_t avg_buf_x[XPT2046_AVG];
|
||||
int16_t avg_buf_y[XPT2046_AVG];
|
||||
uint8_t avg_last;
|
||||
#if defined(STM32F407ZG)
|
||||
#include "SoftSPI.h"
|
||||
SoftSPI xpt2046_spi(PF11, PB2, PB0);
|
||||
XPT2046_Touchscreen ts(PC13);
|
||||
#else
|
||||
SPIClass xpt2046_spi(PB15, PB14, PB13, PB12);
|
||||
XPT2046_Touchscreen ts(PB12);
|
||||
#endif
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the XPT2046
|
||||
*/
|
||||
void xpt2046_init(uint8_t rotation)
|
||||
{
|
||||
ts.begin();
|
||||
ts.setRotation(rotation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current position and state of the touchpad
|
||||
* @param data store the read data here
|
||||
* @return false: because no ore data to be read
|
||||
*/
|
||||
bool xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
static int16_t last_x = 0;
|
||||
static int16_t last_y = 0;
|
||||
uint8_t buf;
|
||||
|
||||
int16_t x = 0;
|
||||
int16_t y = 0;
|
||||
|
||||
// uint8_t irq = LV_DRV_INDEV_IRQ_READ;
|
||||
data->state = ts.touched();
|
||||
|
||||
if(data->state) {
|
||||
TS_Point p = ts.getPoint();
|
||||
x = p.x;
|
||||
y = p.y;
|
||||
xpt2046_corr(&x, &y);
|
||||
|
||||
#if 0
|
||||
// LV_DRV_INDEV_SPI_CS(0);
|
||||
xpt2046_spi.beginTransaction(SPI_SETTING);
|
||||
digitalWrite(PB12, LOW);
|
||||
|
||||
xpt2046_spi.transfer(CMD_X_READ); /*Start x read*/
|
||||
|
||||
buf = xpt2046_spi.transfer(0); /*Read x MSB*/
|
||||
x = buf << 8;
|
||||
buf = xpt2046_spi.transfer(CMD_Y_READ); /*Until x LSB converted y command can be sent*/
|
||||
x += buf;
|
||||
|
||||
buf = xpt2046_spi.transfer(0); /*Read y MSB*/
|
||||
y = buf << 8;
|
||||
|
||||
buf = xpt2046_spi.transfer(0); /*Read y LSB*/
|
||||
y += buf;
|
||||
|
||||
/*Normalize Data*/
|
||||
x = x >> 3;
|
||||
y = y >> 3;
|
||||
xpt2046_corr(&x, &y);
|
||||
xpt2046_avg(&x, &y);
|
||||
|
||||
last_x = x;
|
||||
last_y = y;
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
|
||||
if(data->state) {
|
||||
Serial.print(x);
|
||||
Serial.print(" - ");
|
||||
Serial.println(y);
|
||||
} else {
|
||||
Serial.print(".");
|
||||
}
|
||||
|
||||
// LV_DRV_INDEV_SPI_CS(1);
|
||||
digitalWrite(PB12, HIGH);
|
||||
xpt2046_spi.endTransaction();
|
||||
#endif
|
||||
} else {
|
||||
x = last_x;
|
||||
y = last_y;
|
||||
avg_last = 0;
|
||||
data->state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
|
||||
data->point.x = x;
|
||||
data->point.y = y;
|
||||
if(data->state) {
|
||||
Serial.print(x);
|
||||
Serial.print(" - ");
|
||||
Serial.println(y);
|
||||
} else {
|
||||
// Serial.print(".");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
static void xpt2046_corr(int16_t * x, int16_t * y)
|
||||
{
|
||||
#if XPT2046_XY_SWAP != 0
|
||||
int16_t swap_tmp;
|
||||
swap_tmp = *x;
|
||||
*x = *y;
|
||||
*y = swap_tmp;
|
||||
#endif
|
||||
|
||||
if((*x) > XPT2046_X_MIN)
|
||||
(*x) -= XPT2046_X_MIN;
|
||||
else
|
||||
(*x) = 0;
|
||||
|
||||
if((*y) > XPT2046_Y_MIN)
|
||||
(*y) -= XPT2046_Y_MIN;
|
||||
else
|
||||
(*y) = 0;
|
||||
|
||||
(*x) = (uint32_t)((uint32_t)(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN);
|
||||
|
||||
(*y) = (uint32_t)((uint32_t)(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN);
|
||||
|
||||
#if XPT2046_X_INV != 0
|
||||
(*x) = XPT2046_HOR_RES - (*x);
|
||||
#endif
|
||||
|
||||
#if XPT2046_Y_INV != 0
|
||||
(*y) = XPT2046_VER_RES - (*y);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void xpt2046_avg(int16_t * x, int16_t * y)
|
||||
{
|
||||
/*Shift out the oldest data*/
|
||||
uint8_t i;
|
||||
for(i = XPT2046_AVG - 1; i > 0; i--) {
|
||||
avg_buf_x[i] = avg_buf_x[i - 1];
|
||||
avg_buf_y[i] = avg_buf_y[i - 1];
|
||||
}
|
||||
|
||||
/*Insert the new point*/
|
||||
avg_buf_x[0] = *x;
|
||||
avg_buf_y[0] = *y;
|
||||
if(avg_last < XPT2046_AVG) avg_last++;
|
||||
|
||||
/*Sum the x and y coordinates*/
|
||||
int32_t x_sum = 0;
|
||||
int32_t y_sum = 0;
|
||||
for(i = 0; i < avg_last; i++) {
|
||||
x_sum += avg_buf_x[i];
|
||||
y_sum += avg_buf_y[i];
|
||||
}
|
||||
|
||||
/*Normalize the sums*/
|
||||
(*x) = (int32_t)x_sum / avg_last;
|
||||
(*y) = (int32_t)y_sum / avg_last;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,56 +0,0 @@
|
||||
/**
|
||||
* @file XPT2046.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef XPT2046_H
|
||||
#define XPT2046_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_XPT2046
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void xpt2046_init(uint8_t rotation);
|
||||
bool xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_XPT2046 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* XPT2046_H */
|
@ -1,75 +0,0 @@
|
||||
/**
|
||||
* @file XPT2046.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "XPT2046_alt_drv.h"
|
||||
#if USE_XPT2046_ALT_DRV
|
||||
|
||||
#include <stddef.h>
|
||||
#include LV_DRV_INDEV_INCLUDE
|
||||
#include LV_DRV_DELAY_INCLUDE
|
||||
#include <XPT2046_Touchscreen.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define CS_PIN PB12
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
XPT2046_Touchscreen ts(CS_PIN);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the XPT2046
|
||||
*/
|
||||
void xpt2046_alt_drv_init(uint8_t rotation)
|
||||
{
|
||||
ts.begin();
|
||||
ts.setRotation(rotation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current position and state of the touchpad
|
||||
* @param data store the read data here
|
||||
* @return false: because no more data to be read
|
||||
*/
|
||||
bool xpt2046_alt_drv_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
data->state = ts.touched();
|
||||
if(data->state) {
|
||||
TS_Point p = ts.getPoint();
|
||||
data->point.x = p.x;
|
||||
data->point.y = p.y;
|
||||
Serial.print(p.x);
|
||||
Serial.print(" - ");
|
||||
Serial.println(p.y);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
@ -1,56 +0,0 @@
|
||||
/**
|
||||
* @file XPT2046_alt_drv.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef XPT2046_ALT_DRV_H
|
||||
#define XPT2046_ALT_DRV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_XPT2046_ALT_DRV
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void xpt2046_alt_drv_init(uint8_t rotation);
|
||||
bool xpt2046_alt_drv_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_XPT2046_ALT_DRV */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* XPT2046_ALT_DRV_H */
|
@ -1,223 +0,0 @@
|
||||
/**
|
||||
* @file evdev.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "evdev.h"
|
||||
#if USE_EVDEV != 0
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
int map(int x, int in_min, int in_max, int out_min, int out_max);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
int evdev_fd;
|
||||
int evdev_root_x;
|
||||
int evdev_root_y;
|
||||
int evdev_button;
|
||||
|
||||
int evdev_key_val;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the evdev interface
|
||||
*/
|
||||
void evdev_init(void)
|
||||
{
|
||||
evdev_fd = open(EVDEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
if(evdev_fd == -1) {
|
||||
perror("unable open evdev interface:");
|
||||
return;
|
||||
}
|
||||
|
||||
fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK);
|
||||
|
||||
evdev_root_x = 0;
|
||||
evdev_root_y = 0;
|
||||
evdev_key_val = 0;
|
||||
evdev_button = LV_INDEV_STATE_REL;
|
||||
}
|
||||
/**
|
||||
* reconfigure the device file for evdev
|
||||
* @param dev_name set the evdev device filename
|
||||
* @return true: the device file set complete
|
||||
* false: the device file doesn't exist current system
|
||||
*/
|
||||
bool evdev_set_file(char* dev_name)
|
||||
{
|
||||
if(evdev_fd != -1) {
|
||||
close(evdev_fd);
|
||||
}
|
||||
evdev_fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
|
||||
if(evdev_fd == -1) {
|
||||
perror("unable open evdev interface:");
|
||||
return false;
|
||||
}
|
||||
|
||||
fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK);
|
||||
|
||||
evdev_root_x = 0;
|
||||
evdev_root_y = 0;
|
||||
evdev_key_val = 0;
|
||||
evdev_button = LV_INDEV_STATE_REL;
|
||||
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Get the current position and state of the evdev
|
||||
* @param data store the evdev data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
|
||||
{
|
||||
struct input_event in;
|
||||
|
||||
while(read(evdev_fd, &in, sizeof(struct input_event)) > 0) {
|
||||
if(in.type == EV_REL) {
|
||||
if(in.code == REL_X)
|
||||
#if EVDEV_SWAP_AXES
|
||||
evdev_root_y += in.value;
|
||||
#else
|
||||
evdev_root_x += in.value;
|
||||
#endif
|
||||
else if(in.code == REL_Y)
|
||||
#if EVDEV_SWAP_AXES
|
||||
evdev_root_x += in.value;
|
||||
#else
|
||||
evdev_root_y += in.value;
|
||||
#endif
|
||||
} else if(in.type == EV_ABS) {
|
||||
if(in.code == ABS_X)
|
||||
#if EVDEV_SWAP_AXES
|
||||
evdev_root_y = in.value;
|
||||
#else
|
||||
evdev_root_x = in.value;
|
||||
#endif
|
||||
else if(in.code == ABS_Y)
|
||||
#if EVDEV_SWAP_AXES
|
||||
evdev_root_x = in.value;
|
||||
#else
|
||||
evdev_root_y = in.value;
|
||||
#endif
|
||||
else if(in.code == ABS_MT_POSITION_X)
|
||||
#if EVDEV_SWAP_AXES
|
||||
evdev_root_y = in.value;
|
||||
#else
|
||||
evdev_root_x = in.value;
|
||||
#endif
|
||||
else if(in.code == ABS_MT_POSITION_Y)
|
||||
#if EVDEV_SWAP_AXES
|
||||
evdev_root_x = in.value;
|
||||
#else
|
||||
evdev_root_y = in.value;
|
||||
#endif
|
||||
} else if(in.type == EV_KEY) {
|
||||
if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) {
|
||||
if(in.value == 0)
|
||||
evdev_button = LV_INDEV_STATE_REL;
|
||||
else if(in.value == 1)
|
||||
evdev_button = LV_INDEV_STATE_PR;
|
||||
} else if(drv->type == LV_INDEV_TYPE_KEYPAD) {
|
||||
data->state = (in.value) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
||||
switch(in.code) {
|
||||
case KEY_BACKSPACE:
|
||||
data->key = LV_KEY_BACKSPACE;
|
||||
break;
|
||||
case KEY_ENTER:
|
||||
data->key = LV_KEY_ENTER;
|
||||
break;
|
||||
case KEY_UP:
|
||||
data->key = LV_KEY_UP;
|
||||
break;
|
||||
case KEY_LEFT:
|
||||
data->key = LV_KEY_PREV;
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
data->key = LV_KEY_NEXT;
|
||||
break;
|
||||
case KEY_DOWN:
|
||||
data->key = LV_KEY_DOWN;
|
||||
break;
|
||||
default:
|
||||
data->key = 0;
|
||||
break;
|
||||
}
|
||||
evdev_key_val = data->key;
|
||||
evdev_button = data->state;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(drv->type == LV_INDEV_TYPE_KEYPAD) {
|
||||
/* No data retrieved */
|
||||
data->key = evdev_key_val;
|
||||
data->state = evdev_button;
|
||||
return false;
|
||||
}
|
||||
if(drv->type != LV_INDEV_TYPE_POINTER)
|
||||
return false;
|
||||
/*Store the collected data*/
|
||||
|
||||
#if EVDEV_SCALE
|
||||
data->point.x = map(evdev_root_x, 0, EVDEV_SCALE_HOR_RES, 0, lv_disp_get_hor_res(drv->disp));
|
||||
data->point.y = map(evdev_root_y, 0, EVDEV_SCALE_VER_RES, 0, lv_disp_get_ver_res(drv->disp));
|
||||
#endif
|
||||
#if EVDEV_CALIBRATE
|
||||
data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, lv_disp_get_hor_res(drv->disp));
|
||||
data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, lv_disp_get_ver_res(drv->disp));
|
||||
#else
|
||||
data->point.x = evdev_root_x;
|
||||
data->point.y = evdev_root_y;
|
||||
#endif
|
||||
|
||||
data->state = evdev_button;
|
||||
|
||||
if(data->point.x < 0)
|
||||
data->point.x = 0;
|
||||
if(data->point.y < 0)
|
||||
data->point.y = 0;
|
||||
if(data->point.x >= lv_disp_get_hor_res(drv->disp))
|
||||
data->point.x = lv_disp_get_hor_res(drv->disp) - 1;
|
||||
if(data->point.y >= lv_disp_get_ver_res(drv->disp))
|
||||
data->point.y = lv_disp_get_ver_res(drv->disp) - 1;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
int map(int x, int in_min, int in_max, int out_min, int out_max)
|
||||
{
|
||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,73 +0,0 @@
|
||||
/**
|
||||
* @file evdev.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EVDEV_H
|
||||
#define EVDEV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_EVDEV
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the evdev
|
||||
*/
|
||||
void evdev_init(void);
|
||||
/**
|
||||
* reconfigure the device file for evdev
|
||||
* @param dev_name set the evdev device filename
|
||||
* @return true: the device file set complete
|
||||
* false: the device file doesn't exist current system
|
||||
*/
|
||||
bool evdev_set_file(char* dev_name);
|
||||
/**
|
||||
* Get the current position and state of the evdev
|
||||
* @param data store the evdev data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data);
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_EVDEV */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* EVDEV_H */
|
@ -1,12 +0,0 @@
|
||||
CSRCS += FT5406EE8.c
|
||||
CSRCS += keyboard.c
|
||||
CSRCS += mouse.c
|
||||
CSRCS += mousewheel.c
|
||||
CSRCS += evdev.c
|
||||
CSRCS += libinput.c
|
||||
CSRCS += XPT2046.c
|
||||
|
||||
DEPPATH += --dep-path $(LVGL_DIR)/lv_drivers/indev
|
||||
VPATH += :$(LVGL_DIR)/lv_drivers/indev
|
||||
|
||||
CFLAGS += "-I$(LVGL_DIR)/lv_drivers/indev"
|
@ -1,130 +0,0 @@
|
||||
/**
|
||||
* @file sdl_kb.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "keyboard.h"
|
||||
#if USE_KEYBOARD
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static uint32_t keycode_to_ascii(uint32_t sdl_key);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static uint32_t last_key;
|
||||
static lv_indev_state_t state;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the keyboard
|
||||
*/
|
||||
void keyboard_init(void)
|
||||
{
|
||||
/*Nothing to init*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last pressed or released character from the PC's keyboard
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the read data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool keyboard_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
(void) indev_drv; /*Unused*/
|
||||
data->state = state;
|
||||
data->key = keycode_to_ascii(last_key);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* It is called periodically from the SDL thread to check a key is pressed/released
|
||||
* @param event describes the event
|
||||
*/
|
||||
void keyboard_handler(SDL_Event * event)
|
||||
{
|
||||
/* We only care about SDL_KEYDOWN and SDL_KEYUP events */
|
||||
switch(event->type) {
|
||||
case SDL_KEYDOWN: /*Button press*/
|
||||
last_key = event->key.keysym.sym; /*Save the pressed key*/
|
||||
state = LV_INDEV_STATE_PR; /*Save the key is pressed now*/
|
||||
break;
|
||||
case SDL_KEYUP: /*Button release*/
|
||||
state = LV_INDEV_STATE_REL; /*Save the key is released but keep the last key*/
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Convert the key code LV_KEY_... "codes" or leave them if they are not control characters
|
||||
* @param sdl_key the key code
|
||||
* @return
|
||||
*/
|
||||
static uint32_t keycode_to_ascii(uint32_t sdl_key)
|
||||
{
|
||||
/*Remap some key to LV_KEY_... to manage groups*/
|
||||
switch(sdl_key) {
|
||||
case SDLK_RIGHT:
|
||||
case SDLK_KP_PLUS:
|
||||
return LV_KEY_RIGHT;
|
||||
|
||||
case SDLK_LEFT:
|
||||
case SDLK_KP_MINUS:
|
||||
return LV_KEY_LEFT;
|
||||
|
||||
case SDLK_UP:
|
||||
return LV_KEY_UP;
|
||||
|
||||
case SDLK_DOWN:
|
||||
return LV_KEY_DOWN;
|
||||
|
||||
case SDLK_ESCAPE:
|
||||
return LV_KEY_ESC;
|
||||
|
||||
#ifdef LV_KEY_BACKSPACE /*For backward compatibility*/
|
||||
case SDLK_BACKSPACE:
|
||||
return LV_KEY_BACKSPACE;
|
||||
#endif
|
||||
|
||||
#ifdef LV_KEY_DEL /*For backward compatibility*/
|
||||
case SDLK_DELETE:
|
||||
return LV_KEY_DEL;
|
||||
#endif
|
||||
case SDLK_KP_ENTER:
|
||||
case '\r':
|
||||
return LV_KEY_ENTER;
|
||||
|
||||
default:
|
||||
return sdl_key;
|
||||
}
|
||||
}
|
||||
#endif
|
@ -1,78 +0,0 @@
|
||||
/**
|
||||
* @file keyboard.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef KEYBOARD_H
|
||||
#define KEYBOARD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_KEYBOARD
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#ifndef MONITOR_SDL_INCLUDE_PATH
|
||||
#define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
#include MONITOR_SDL_INCLUDE_PATH
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
/**
|
||||
* Initialize the keyboard
|
||||
*/
|
||||
void keyboard_init(void);
|
||||
|
||||
/**
|
||||
* Get the last pressed or released character from the PC's keyboard
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the read data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool keyboard_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
/**
|
||||
* It is called periodically from the SDL thread to check a key is pressed/released
|
||||
* @param event describes the event
|
||||
*/
|
||||
void keyboard_handler(SDL_Event *event);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_KEYBOARD*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*KEYBOARD_H*/
|
@ -1,175 +0,0 @@
|
||||
/**
|
||||
* @file libinput.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "libinput_drv.h"
|
||||
#if USE_LIBINPUT != 0
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/limits.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <poll.h>
|
||||
#include <libinput.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static int open_restricted(const char *path, int flags, void *user_data);
|
||||
static void close_restricted(int fd, void *user_data);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static int libinput_fd;
|
||||
static int libinput_button;
|
||||
static const int timeout = 0; // do not block
|
||||
static const nfds_t nfds = 1;
|
||||
static struct pollfd fds[1];
|
||||
static lv_point_t most_recent_touch_point = { .x = 0, .y = 0};
|
||||
|
||||
static struct libinput *libinput_context;
|
||||
static struct libinput_device *libinput_device;
|
||||
const static struct libinput_interface interface = {
|
||||
.open_restricted = open_restricted,
|
||||
.close_restricted = close_restricted,
|
||||
};
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* reconfigure the device file for libinput
|
||||
* @param dev_name set the libinput device filename
|
||||
* @return true: the device file set complete
|
||||
* false: the device file doesn't exist current system
|
||||
*/
|
||||
bool libinput_set_file(char* dev_name)
|
||||
{
|
||||
// This check *should* not be necessary, yet applications crashes even on NULL handles.
|
||||
// citing libinput.h:libinput_path_remove_device:
|
||||
// > If no matching device exists, this function does nothing.
|
||||
if (libinput_device) {
|
||||
libinput_device = libinput_device_unref(libinput_device);
|
||||
libinput_path_remove_device(libinput_device);
|
||||
}
|
||||
|
||||
libinput_device = libinput_path_add_device(libinput_context, dev_name);
|
||||
if(!libinput_device) {
|
||||
perror("unable to add device to libinput context:");
|
||||
return false;
|
||||
}
|
||||
libinput_device = libinput_device_ref(libinput_device);
|
||||
if(!libinput_device) {
|
||||
perror("unable to reference device within libinput context:");
|
||||
return false;
|
||||
}
|
||||
|
||||
libinput_button = LV_INDEV_STATE_REL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the libinput interface
|
||||
*/
|
||||
void libinput_init(void)
|
||||
{
|
||||
libinput_device = NULL;
|
||||
libinput_context = libinput_path_create_context(&interface, NULL);
|
||||
if(!libinput_set_file(LIBINPUT_NAME)) {
|
||||
perror("unable to add device \"" LIBINPUT_NAME "\" to libinput context:");
|
||||
return;
|
||||
}
|
||||
libinput_fd = libinput_get_fd(libinput_context);
|
||||
|
||||
/* prepare poll */
|
||||
fds[0].fd = libinput_fd;
|
||||
fds[0].events = POLLIN;
|
||||
fds[0].revents = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current position and state of the libinput
|
||||
* @param indev_drv driver object itself
|
||||
* @param data store the libinput data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool libinput_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
struct libinput_event *event;
|
||||
struct libinput_event_touch *touch_event = NULL;
|
||||
int rc = 0;
|
||||
|
||||
rc = poll(fds, nfds, timeout);
|
||||
switch (rc){
|
||||
case -1:
|
||||
perror(NULL);
|
||||
case 0:
|
||||
goto report_most_recent_state;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
libinput_dispatch(libinput_context);
|
||||
while((event = libinput_get_event(libinput_context)) != NULL) {
|
||||
enum libinput_event_type type = libinput_event_get_type(event);
|
||||
switch (type) {
|
||||
case LIBINPUT_EVENT_TOUCH_MOTION:
|
||||
case LIBINPUT_EVENT_TOUCH_DOWN:
|
||||
touch_event = libinput_event_get_touch_event(event);
|
||||
most_recent_touch_point.x = libinput_event_touch_get_x_transformed(touch_event, LV_HOR_RES);
|
||||
most_recent_touch_point.y = libinput_event_touch_get_y_transformed(touch_event, LV_VER_RES);
|
||||
libinput_button = LV_INDEV_STATE_PR;
|
||||
break;
|
||||
case LIBINPUT_EVENT_TOUCH_UP:
|
||||
libinput_button = LV_INDEV_STATE_REL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
libinput_event_destroy(event);
|
||||
}
|
||||
report_most_recent_state:
|
||||
data->point.x = most_recent_touch_point.x;
|
||||
data->point.y = most_recent_touch_point.y;
|
||||
data->state = libinput_button;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static int open_restricted(const char *path, int flags, void *user_data)
|
||||
{
|
||||
int fd = open(path, flags);
|
||||
return fd < 0 ? -errno : fd;
|
||||
}
|
||||
|
||||
static void close_restricted(int fd, void *user_data)
|
||||
{
|
||||
close(fd);
|
||||
}
|
||||
|
||||
#endif
|
@ -1,74 +0,0 @@
|
||||
/**
|
||||
* @file libinput.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LVGL_LIBINPUT_H
|
||||
#define LVGL_LIBINPUT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_LIBINPUT
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the libinput
|
||||
*/
|
||||
void libinput_init(void);
|
||||
/**
|
||||
* reconfigure the device file for libinput
|
||||
* @param dev_name set the libinput device filename
|
||||
* @return true: the device file set complete
|
||||
* false: the device file doesn't exist current system
|
||||
*/
|
||||
bool libinput_set_file(char* dev_name);
|
||||
/**
|
||||
* Get the current position and state of the libinput
|
||||
* @param indev_drv driver object itself
|
||||
* @param data store the libinput data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool libinput_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_LIBINPUT */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LVGL_LIBINPUT_H */
|
@ -1,100 +0,0 @@
|
||||
/**
|
||||
* @file mouse.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "mouse.h"
|
||||
#if USE_MOUSE != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#ifndef MONITOR_ZOOM
|
||||
#define MONITOR_ZOOM 1
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static bool left_button_down = false;
|
||||
static int16_t last_x = 0;
|
||||
static int16_t last_y = 0;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the mouse
|
||||
*/
|
||||
void mouse_init(void)
|
||||
{}
|
||||
|
||||
/**
|
||||
* Get the current position and state of the mouse
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the mouse data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool mouse_read(lv_indev_drv_t* indev_drv, lv_indev_data_t* data)
|
||||
{
|
||||
(void)indev_drv; /*Unused*/
|
||||
|
||||
/*Store the collected data*/
|
||||
data->point.x = last_x;
|
||||
data->point.y = last_y;
|
||||
data->state = left_button_down ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* It will be called from the main SDL thread
|
||||
*/
|
||||
void mouse_handler(SDL_Event* event)
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
|
||||
SDL_Window* window = SDL_GetWindowFromID(event->window.windowID);
|
||||
SDL_GetWindowSize(window, &x, &y);
|
||||
|
||||
switch(event->type) {
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
if(event->button.button == SDL_BUTTON_LEFT) left_button_down = false;
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
if(event->button.button == SDL_BUTTON_LEFT) {
|
||||
left_button_down = true;
|
||||
if(x != 0) last_x = event->motion.x * TFT_WIDTH / x; // / MONITOR_ZOOM;
|
||||
if(y != 0) last_y = event->motion.y * TFT_HEIGHT / y; // / MONITOR_ZOOM;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
if(x != 0) last_x = event->motion.x * TFT_WIDTH / x; // / MONITOR_ZOOM;
|
||||
if(y != 0) last_y = event->motion.y * TFT_HEIGHT / y; // / MONITOR_ZOOM;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
@ -1,78 +0,0 @@
|
||||
/**
|
||||
* @file mouse.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MOUSE_H
|
||||
#define MOUSE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_MOUSE
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#ifndef MONITOR_SDL_INCLUDE_PATH
|
||||
#define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
#include MONITOR_SDL_INCLUDE_PATH
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the mouse
|
||||
*/
|
||||
void mouse_init(void);
|
||||
|
||||
/**
|
||||
* Get the current position and state of the mouse
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the mouse data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
bool mouse_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
/**
|
||||
* It will be called from the main SDL thread
|
||||
*/
|
||||
void mouse_handler(SDL_Event *event);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* USE_MOUSE */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* MOUSE_H */
|
@ -1,100 +0,0 @@
|
||||
/**
|
||||
* @file mousewheel.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "mousewheel.h"
|
||||
#if USE_MOUSEWHEEL
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static int16_t enc_diff = 0;
|
||||
static lv_indev_state_t state = LV_INDEV_STATE_REL;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the mousewheel
|
||||
*/
|
||||
void mousewheel_init(void)
|
||||
{
|
||||
/*Nothing to init*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Get encoder (i.e. mouse wheel) ticks difference and pressed state
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the read data here
|
||||
* @return false: all ticks and button state are handled
|
||||
*/
|
||||
bool mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
(void) indev_drv; /*Unused*/
|
||||
|
||||
data->state = state;
|
||||
data->enc_diff = enc_diff;
|
||||
enc_diff = 0;
|
||||
|
||||
return false; /*No more data to read so return false*/
|
||||
}
|
||||
|
||||
/**
|
||||
* It is called periodically from the SDL thread to check mouse wheel state
|
||||
* @param event describes the event
|
||||
*/
|
||||
void mousewheel_handler(SDL_Event * event)
|
||||
{
|
||||
switch(event->type) {
|
||||
case SDL_MOUSEWHEEL:
|
||||
// Scroll down (y = -1) means positive encoder turn,
|
||||
// so invert it
|
||||
#ifdef __EMSCRIPTEN__
|
||||
/*Escripten scales it wrong*/
|
||||
if(event->wheel.y < 0) enc_diff++;
|
||||
if(event->wheel.y > 0) enc_diff--;
|
||||
#else
|
||||
enc_diff = -event->wheel.y;
|
||||
#endif
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
if(event->button.button == SDL_BUTTON_MIDDLE) {
|
||||
state = LV_INDEV_STATE_PR;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
if(event->button.button == SDL_BUTTON_MIDDLE) {
|
||||
state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
@ -1,79 +0,0 @@
|
||||
/**
|
||||
* @file mousewheel.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MOUSEWHEEL_H
|
||||
#define MOUSEWHEEL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_MOUSEWHEEL
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#ifndef MONITOR_SDL_INCLUDE_PATH
|
||||
#define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
#include MONITOR_SDL_INCLUDE_PATH
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the encoder
|
||||
*/
|
||||
void mousewheel_init(void);
|
||||
|
||||
/**
|
||||
* Get encoder (i.e. mouse wheel) ticks difference and pressed state
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the read data here
|
||||
* @return false: all ticks and button state are handled
|
||||
*/
|
||||
bool mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
|
||||
/**
|
||||
* It is called periodically from the SDL thread to check a key is pressed/released
|
||||
* @param event describes the event
|
||||
*/
|
||||
void mousewheel_handler(SDL_Event *event);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_MOUSEWHEEL*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*MOUSEWHEEL_H*/
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "lv_drivers",
|
||||
"version": "6.0.2",
|
||||
"keywords": "littlevgl, lvgl, driver, display, touchpad",
|
||||
"description": "Drivers for LittlevGL graphics library.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/littlevgl/lv_drivers.git"
|
||||
},
|
||||
"build": {
|
||||
"includeDir": "."
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
include $(LVGL_DIR)/lv_drivers/display/display.mk
|
||||
include $(LVGL_DIR)/lv_drivers/indev/indev.mk
|
||||
|
||||
|
||||
CSRCS += win_drv.c
|
||||
|
||||
DEPPATH += --dep-path $(LVGL_DIR)/lv_drivers
|
||||
VPATH += :$(LVGL_DIR)/lv_drivers
|
||||
|
||||
CFLAGS += "-I$(LVGL_DIR)/lv_drivers"
|
@ -1,357 +0,0 @@
|
||||
/**
|
||||
* @file lv_drv_conf.h
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPY THIS FILE AS lv_drv_conf.h
|
||||
*/
|
||||
|
||||
#if 0 /*Set it to "1" to enable the content*/
|
||||
|
||||
#ifndef LV_DRV_CONF_H
|
||||
#define LV_DRV_CONF_H
|
||||
|
||||
#include "lv_conf.h"
|
||||
|
||||
/*********************
|
||||
* DELAY INTERFACE
|
||||
*********************/
|
||||
#define LV_DRV_DELAY_INCLUDE <stdint.h> /*Dummy include by default*/
|
||||
#define LV_DRV_DELAY_US(us) /*delay_us(us)*/ /*Delay the given number of microseconds*/
|
||||
#define LV_DRV_DELAY_MS(ms) /*delay_ms(ms)*/ /*Delay the given number of milliseconds*/
|
||||
|
||||
/*********************
|
||||
* DISPLAY INTERFACE
|
||||
*********************/
|
||||
|
||||
/*------------
|
||||
* Common
|
||||
*------------*/
|
||||
#define LV_DRV_DISP_INCLUDE <stdint.h> /*Dummy include by default*/
|
||||
#define LV_DRV_DISP_CMD_DATA(val) /*pin_x_set(val)*/ /*Set the command/data pin to 'val'*/
|
||||
#define LV_DRV_DISP_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/
|
||||
|
||||
/*---------
|
||||
* SPI
|
||||
*---------*/
|
||||
#define LV_DRV_DISP_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/
|
||||
#define LV_DRV_DISP_SPI_WR_BYTE(data) /*spi_wr(data)*/ /*Write a byte the SPI bus*/
|
||||
#define LV_DRV_DISP_SPI_WR_ARRAY(adr, n) /*spi_wr_mem(adr, n)*/ /*Write 'n' bytes to SPI bus from 'adr'*/
|
||||
|
||||
/*------------------
|
||||
* Parallel port
|
||||
*-----------------*/
|
||||
#define LV_DRV_DISP_PAR_CS(val) /*par_cs_set(val)*/ /*Set the Parallel port's Chip select to 'val'*/
|
||||
#define LV_DRV_DISP_PAR_SLOW /*par_slow()*/ /*Set low speed on the parallel port*/
|
||||
#define LV_DRV_DISP_PAR_FAST /*par_fast()*/ /*Set high speed on the parallel port*/
|
||||
#define LV_DRV_DISP_PAR_WR_WORD(data) /*par_wr(data)*/ /*Write a word to the parallel port*/
|
||||
#define LV_DRV_DISP_PAR_WR_ARRAY(adr, n) /*par_wr_mem(adr,n)*/ /*Write 'n' bytes to Parallel ports from 'adr'*/
|
||||
|
||||
/***************************
|
||||
* INPUT DEVICE INTERFACE
|
||||
***************************/
|
||||
|
||||
/*----------
|
||||
* Common
|
||||
*----------*/
|
||||
#define LV_DRV_INDEV_INCLUDE <stdint.h> /*Dummy include by default*/
|
||||
#define LV_DRV_INDEV_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/
|
||||
#define LV_DRV_INDEV_IRQ_READ 0 /*pn_x_read()*/ /*Read the IRQ pin*/
|
||||
|
||||
/*---------
|
||||
* SPI
|
||||
*---------*/
|
||||
#define LV_DRV_INDEV_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/
|
||||
#define LV_DRV_INDEV_SPI_XCHG_BYTE(data) 0 /*spi_xchg(val)*/ /*Write 'val' to SPI and give the read value*/
|
||||
|
||||
/*---------
|
||||
* I2C
|
||||
*---------*/
|
||||
#define LV_DRV_INDEV_I2C_START /*i2c_start()*/ /*Make an I2C start*/
|
||||
#define LV_DRV_INDEV_I2C_STOP /*i2c_stop()*/ /*Make an I2C stop*/
|
||||
#define LV_DRV_INDEV_I2C_RESTART /*i2c_restart()*/ /*Make an I2C restart*/
|
||||
#define LV_DRV_INDEV_I2C_WR(data) /*i2c_wr(data)*/ /*Write a byte to the I1C bus*/
|
||||
#define LV_DRV_INDEV_I2C_READ(last_read) 0 /*i2c_rd()*/ /*Read a byte from the I2C bud*/
|
||||
|
||||
|
||||
/*********************
|
||||
* DISPLAY DRIVERS
|
||||
*********************/
|
||||
|
||||
/*-------------------
|
||||
* Monitor of PC
|
||||
*-------------------*/
|
||||
#ifndef USE_MONITOR
|
||||
# define USE_MONITOR 0
|
||||
#endif
|
||||
|
||||
#if USE_MONITOR
|
||||
# define MONITOR_HOR_RES LV_HOR_RES
|
||||
# define MONITOR_VER_RES LV_VER_RES
|
||||
|
||||
/* Scale window by this factor (useful when simulating small screens) */
|
||||
# define MONITOR_ZOOM 1
|
||||
|
||||
/* Used to test true double buffering with only address changing.
|
||||
* Set LV_VDB_SIZE = (LV_HOR_RES * LV_VER_RES) and LV_VDB_DOUBLE = 1 and LV_COLOR_DEPTH = 32" */
|
||||
# define MONITOR_DOUBLE_BUFFERED 0
|
||||
|
||||
/*Eclipse: <SDL2/SDL.h> Visual Studio: <SDL.h>*/
|
||||
# define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
|
||||
|
||||
/*Different rendering might be used if running in a Virtual machine*/
|
||||
# define MONITOR_VIRTUAL_MACHINE 0
|
||||
|
||||
/*Open two windows to test multi display support*/
|
||||
# define MONITOR_DUAL 0
|
||||
#endif
|
||||
|
||||
/*-----------------------------------
|
||||
* Native Windows (including mouse)
|
||||
*----------------------------------*/
|
||||
#ifndef USE_WINDOWS
|
||||
# define USE_WINDOWS 0
|
||||
#endif
|
||||
|
||||
#define USE_WINDOWS 0
|
||||
#if USE_WINDOWS
|
||||
# define WINDOW_HOR_RES 480
|
||||
# define WINDOW_VER_RES 320
|
||||
#endif
|
||||
|
||||
/*----------------
|
||||
* SSD1963
|
||||
*--------------*/
|
||||
#ifndef USE_SSD1963
|
||||
# define USE_SSD1963 0
|
||||
#endif
|
||||
|
||||
#if USE_SSD1963
|
||||
# define SSD1963_HOR_RES LV_HOR_RES
|
||||
# define SSD1963_VER_RES LV_VER_RES
|
||||
# define SSD1963_HT 531
|
||||
# define SSD1963_HPS 43
|
||||
# define SSD1963_LPS 8
|
||||
# define SSD1963_HPW 10
|
||||
# define SSD1963_VT 288
|
||||
# define SSD1963_VPS 12
|
||||
# define SSD1963_FPS 4
|
||||
# define SSD1963_VPW 10
|
||||
# define SSD1963_HS_NEG 0 /*Negative hsync*/
|
||||
# define SSD1963_VS_NEG 0 /*Negative vsync*/
|
||||
# define SSD1963_ORI 0 /*0, 90, 180, 270*/
|
||||
# define SSD1963_COLOR_DEPTH 16
|
||||
#endif
|
||||
|
||||
/*----------------
|
||||
* R61581
|
||||
*--------------*/
|
||||
#ifndef USE_R61581
|
||||
# define USE_R61581 0
|
||||
#endif
|
||||
|
||||
#if USE_R61581
|
||||
# define R61581_HOR_RES LV_HOR_RES
|
||||
# define R61581_VER_RES LV_VER_RES
|
||||
# define R61581_HSPL 0 /*HSYNC signal polarity*/
|
||||
# define R61581_HSL 10 /*HSYNC length (Not Implemented)*/
|
||||
# define R61581_HFP 10 /*Horitontal Front poarch (Not Implemented)*/
|
||||
# define R61581_HBP 10 /*Horitontal Back poarch (Not Implemented */
|
||||
# define R61581_VSPL 0 /*VSYNC signal polarity*/
|
||||
# define R61581_VSL 10 /*VSYNC length (Not Implemented)*/
|
||||
# define R61581_VFP 8 /*Vertical Front poarch*/
|
||||
# define R61581_VBP 8 /*Vertical Back poarch */
|
||||
# define R61581_DPL 0 /*DCLK signal polarity*/
|
||||
# define R61581_EPL 1 /*ENABLE signal polarity*/
|
||||
# define R61581_ORI 0 /*0, 180*/
|
||||
# define R61581_LV_COLOR_DEPTH 16 /*Fix 16 bit*/
|
||||
#endif
|
||||
|
||||
/*------------------------------
|
||||
* ST7565 (Monochrome, low res.)
|
||||
*-----------------------------*/
|
||||
#ifndef USE_ST7565
|
||||
# define USE_ST7565 0
|
||||
#endif
|
||||
|
||||
#if USE_ST7565
|
||||
/*No settings*/
|
||||
#endif /*USE_ST7565*/
|
||||
|
||||
/*------------------------------------------
|
||||
* UC1610 (4 gray 160*[104|128])
|
||||
* (EA DOGXL160 160x104 tested)
|
||||
*-----------------------------------------*/
|
||||
#ifndef USE_UC1610
|
||||
# define USE_UC1610 0
|
||||
#endif
|
||||
|
||||
#if USE_UC1610
|
||||
# define UC1610_HOR_RES LV_HOR_RES
|
||||
# define UC1610_VER_RES LV_VER_RES
|
||||
# define UC1610_INIT_CONTRAST 33 /* init contrast, values in [%] */
|
||||
# define UC1610_INIT_HARD_RST 0 /* 1 : hardware reset at init, 0 : software reset */
|
||||
# define UC1610_TOP_VIEW 0 /* 0 : Bottom View, 1 : Top View */
|
||||
#endif /*USE_UC1610*/
|
||||
|
||||
/*-------------------------------------------------
|
||||
* SHARP memory in pixel monochrome display series
|
||||
* LS012B7DD01 (184x38 pixels.)
|
||||
* LS013B7DH03 (128x128 pixels.)
|
||||
* LS013B7DH05 (144x168 pixels.)
|
||||
* LS027B7DH01 (400x240 pixels.) (tested)
|
||||
* LS032B7DD02 (336x536 pixels.)
|
||||
* LS044Q7DH01 (320x240 pixels.)
|
||||
*------------------------------------------------*/
|
||||
#ifndef USE_SHARP_MIP
|
||||
# define USE_SHARP_MIP 0
|
||||
#endif
|
||||
|
||||
#if USE_SHARP_MIP
|
||||
# define SHARP_MIP_HOR_RES LV_HOR_RES
|
||||
# define SHARP_MIP_VER_RES LV_VER_RES
|
||||
# define SHARP_MIP_SOFT_COM_INVERSION 0
|
||||
# define SHARP_MIP_REV_BYTE(b) /*((uint8_t) __REV(__RBIT(b)))*/ /*Architecture / compiler dependent byte bits order reverse*/
|
||||
#endif /*USE_SHARP_MIP*/
|
||||
|
||||
/*-----------------------------------------
|
||||
* Linux frame buffer device (/dev/fbx)
|
||||
*-----------------------------------------*/
|
||||
#ifndef USE_FBDEV
|
||||
# define USE_FBDEV 0
|
||||
#endif
|
||||
|
||||
#if USE_FBDEV
|
||||
# define FBDEV_PATH "/dev/fb0"
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------
|
||||
* FreeBSD frame buffer device (/dev/fbx)
|
||||
*.........................................*/
|
||||
#ifndef USE_BSD_FBDEV
|
||||
# define USE_BSD_FBDEV 0
|
||||
#endif
|
||||
|
||||
#if USE_BSD_FBDEV
|
||||
# define FBDEV_PATH "/dev/fb0"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INPUT DEVICES
|
||||
*********************/
|
||||
|
||||
/*--------------
|
||||
* XPT2046
|
||||
*--------------*/
|
||||
#ifndef USE_XPT2046
|
||||
# define USE_XPT2046 0
|
||||
#endif
|
||||
|
||||
#if USE_XPT2046
|
||||
# define XPT2046_HOR_RES 480
|
||||
# define XPT2046_VER_RES 320
|
||||
# define XPT2046_X_MIN 200
|
||||
# define XPT2046_Y_MIN 200
|
||||
# define XPT2046_X_MAX 3800
|
||||
# define XPT2046_Y_MAX 3800
|
||||
# define XPT2046_AVG 4
|
||||
# define XPT2046_INV 0
|
||||
#endif
|
||||
|
||||
/*-----------------
|
||||
* FT5406EE8
|
||||
*-----------------*/
|
||||
#ifndef USE_FT5406EE8
|
||||
# define USE_FT5406EE8 0
|
||||
#endif
|
||||
|
||||
#if USE_FT5406EE8
|
||||
# define FT5406EE8_I2C_ADR 0x38 /*7 bit address*/
|
||||
#endif
|
||||
|
||||
/*---------------
|
||||
* AD TOUCH
|
||||
*--------------*/
|
||||
#ifndef USE_AD_TOUCH
|
||||
# define USE_AD_TOUCH 0
|
||||
#endif
|
||||
|
||||
#if USE_AD_TOUCH
|
||||
/*No settings*/
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------------------
|
||||
* Mouse or touchpad on PC (using SDL)
|
||||
*-------------------------------------*/
|
||||
#ifndef USE_MOUSE
|
||||
# define USE_MOUSE 0
|
||||
#endif
|
||||
|
||||
#if USE_MOUSE
|
||||
/*No settings*/
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------
|
||||
* Mousewheel as encoder on PC (using SDL)
|
||||
*------------------------------------------*/
|
||||
#ifndef USE_MOUSEWHEEL
|
||||
# define USE_MOUSEWHEEL 0
|
||||
#endif
|
||||
|
||||
#if USE_MOUSEWHEEL
|
||||
/*No settings*/
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------
|
||||
* Touchscreen as libinput interface (for Linux based systems)
|
||||
*------------------------------------------------*/
|
||||
#ifndef USE_LIBINPUT
|
||||
# define USE_LIBINPUT 0
|
||||
#endif
|
||||
|
||||
#if USE_LIBINPUT
|
||||
# define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/
|
||||
#endif /*USE_LIBINPUT*/
|
||||
|
||||
/*-------------------------------------------------
|
||||
* Mouse or touchpad as evdev interface (for Linux based systems)
|
||||
*------------------------------------------------*/
|
||||
#ifndef USE_EVDEV
|
||||
# define USE_EVDEV 0
|
||||
#endif
|
||||
|
||||
#if USE_EVDEV
|
||||
# define EVDEV_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/
|
||||
# define EVDEV_SWAP_AXES 0 /*Swap the x and y axes of the touchscreen*/
|
||||
|
||||
# define EVDEV_SCALE 0 /* Scale input, e.g. if touchscreen resolution does not match display resolution */
|
||||
# if EVDEV_SCALE
|
||||
# define EVDEV_SCALE_HOR_RES (4096) /* Horizontal resolution of touchscreen */
|
||||
# define EVDEV_SCALE_VER_RES (4096) /* Vertical resolution of touchscreen */
|
||||
# endif /*EVDEV_SCALE*/
|
||||
|
||||
# define EVDEV_CALIBRATE 0 /*Scale and offset the touchscreen coordinates by using maximum and minimum values for each axis*/
|
||||
# if EVDEV_CALIBRATE
|
||||
# define EVDEV_HOR_MIN 3800 /*If EVDEV_XXX_MIN > EVDEV_XXX_MAX the XXX axis is automatically inverted*/
|
||||
# define EVDEV_HOR_MAX 200
|
||||
# define EVDEV_VER_MIN 200
|
||||
# define EVDEV_VER_MAX 3800
|
||||
# endif /*EVDEV_SCALE*/
|
||||
#endif /*USE_EVDEV*/
|
||||
|
||||
/*-------------------------------
|
||||
* Keyboard of a PC (using SDL)
|
||||
*------------------------------*/
|
||||
#ifndef USE_KEYBOARD
|
||||
# define USE_KEYBOARD 0
|
||||
#endif
|
||||
|
||||
#if USE_KEYBOARD
|
||||
/*No settings*/
|
||||
#endif
|
||||
|
||||
#endif /*LV_DRV_CONF_H*/
|
||||
|
||||
#endif /*End of "Content enable"*/
|
@ -1,318 +0,0 @@
|
||||
/**
|
||||
* @file win_drv.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "win_drv.h"
|
||||
#if USE_WINDOWS
|
||||
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include "lvgl/lvgl.h"
|
||||
|
||||
#if LV_COLOR_DEPTH < 16
|
||||
#error Windows driver only supports true RGB colors at this time
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* DEFINES
|
||||
**********************/
|
||||
|
||||
#define WINDOW_STYLE (WS_OVERLAPPEDWINDOW & ~(WS_SIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME))
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void do_register(void);
|
||||
static void win_drv_flush(lv_disp_t *drv, lv_area_t *area, const lv_color_t * color_p);
|
||||
static void win_drv_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color);
|
||||
static void win_drv_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p);
|
||||
static bool win_drv_read(lv_indev_t *drv, lv_indev_data_t * data);
|
||||
static void msg_handler(void *param);
|
||||
|
||||
static COLORREF lv_color_to_colorref(const lv_color_t color);
|
||||
|
||||
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
|
||||
/**********************
|
||||
* GLOBAL VARIABLES
|
||||
**********************/
|
||||
|
||||
bool lv_win_exit_flag = false;
|
||||
lv_disp_t *lv_windows_disp;
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static HWND hwnd;
|
||||
static uint32_t *fbp = NULL; /* Raw framebuffer memory */
|
||||
static bool mouse_pressed;
|
||||
static int mouse_x, mouse_y;
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
const char g_szClassName[] = "LittlevGL";
|
||||
|
||||
HWND windrv_init(void)
|
||||
{
|
||||
WNDCLASSEX wc;
|
||||
RECT winrect;
|
||||
HICON lvgl_icon;
|
||||
|
||||
//Step 1: Registering the Window Class
|
||||
wc.cbSize = sizeof(WNDCLASSEX);
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = GetModuleHandle(NULL);
|
||||
lvgl_icon = (HICON) LoadImage( NULL, "lvgl_icon.bmp", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
|
||||
|
||||
if(lvgl_icon == NULL)
|
||||
lvgl_icon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
|
||||
wc.hIcon = lvgl_icon;
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = g_szClassName;
|
||||
wc.hIconSm = lvgl_icon;
|
||||
|
||||
if(!RegisterClassEx(&wc))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
winrect.left = 0;
|
||||
winrect.right = WINDOW_HOR_RES - 1;
|
||||
winrect.top = 0;
|
||||
winrect.bottom = WINDOW_VER_RES - 1;
|
||||
AdjustWindowRectEx(&winrect, WINDOW_STYLE, FALSE, WS_EX_CLIENTEDGE);
|
||||
OffsetRect(&winrect, -winrect.left, -winrect.top);
|
||||
// Step 2: Creating the Window
|
||||
hwnd = CreateWindowEx(
|
||||
WS_EX_CLIENTEDGE,
|
||||
g_szClassName,
|
||||
"LittlevGL Simulator",
|
||||
WINDOW_STYLE,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, winrect.right, winrect.bottom,
|
||||
NULL, NULL, GetModuleHandle(NULL), NULL);
|
||||
|
||||
if(hwnd == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ShowWindow(hwnd, SW_SHOWDEFAULT);
|
||||
UpdateWindow(hwnd);
|
||||
|
||||
|
||||
lv_task_create(msg_handler, 0, LV_TASK_PRIO_HIGHEST, NULL);
|
||||
lv_win_exit_flag = false;
|
||||
do_register();
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void do_register(void)
|
||||
{
|
||||
/*-----------------------------
|
||||
* Create a buffer for drawing
|
||||
*----------------------------*/
|
||||
|
||||
/* LittlevGL requires a buffer where it draw the objects. The buffer's has to be greater than 1 display row
|
||||
*
|
||||
* There are three buffering configurations:
|
||||
* 1. Create ONE buffer some rows: LittlevGL will draw the display's content here and writes it to your display
|
||||
* 2. Create TWO buffer some rows: LittlevGL will draw the display's content to a buffer and writes it your display.
|
||||
* You should use DMA to write the buffer's content to the display.
|
||||
* It will enable LittlevGL to draw the next part of the screen to the other buffer while
|
||||
* the data is being sent form the first buffer. It makes rendering and flushing parallel.
|
||||
* 3. Create TWO screen buffer: Similar to 2) but the buffer have to be screen sized. When LittlevGL is ready it will give the
|
||||
* whole frame to display. This way you only need to change the frame buffer's address instead of
|
||||
* copying the pixels.
|
||||
* */
|
||||
|
||||
/* Example for 1) */
|
||||
static lv_disp_buf_t disp_buf_1;
|
||||
static lv_color_t buf1_1[WINDOW_HOR_RES * WINDOW_VER_RES]; /*A buffer for 10 rows*/
|
||||
lv_disp_buf_init(&disp_buf_1, buf1_1, NULL, WINDOW_HOR_RES * WINDOW_VER_RES); /*Initialize the display buffer*/
|
||||
|
||||
|
||||
/*-----------------------------------
|
||||
* Register the display in LittlevGL
|
||||
*----------------------------------*/
|
||||
|
||||
lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
|
||||
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
|
||||
|
||||
/*Set up the functions to access to your display*/
|
||||
|
||||
/*Set the resolution of the display*/
|
||||
disp_drv.hor_res = WINDOW_HOR_RES;
|
||||
disp_drv.ver_res = WINDOW_VER_RES;
|
||||
|
||||
/*Used to copy the buffer's content to the display*/
|
||||
disp_drv.flush_cb = win_drv_flush;
|
||||
|
||||
/*Set a display buffer*/
|
||||
disp_drv.buffer = &disp_buf_1;
|
||||
|
||||
/*Finally register the driver*/
|
||||
lv_windows_disp = lv_disp_drv_register(&disp_drv);
|
||||
lv_indev_drv_t indev_drv;
|
||||
lv_indev_drv_init(&indev_drv);
|
||||
indev_drv.type = LV_INDEV_TYPE_POINTER;
|
||||
indev_drv.read_cb = win_drv_read;
|
||||
lv_indev_drv_register(&indev_drv);
|
||||
}
|
||||
|
||||
static void msg_handler(void *param)
|
||||
{
|
||||
(void)param;
|
||||
|
||||
MSG msg;
|
||||
BOOL bRet;
|
||||
if( (bRet = PeekMessage( &msg, NULL, 0, 0, TRUE )) != 0)
|
||||
{
|
||||
if (bRet == -1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
if(msg.message == WM_QUIT)
|
||||
lv_win_exit_flag = true;
|
||||
}
|
||||
|
||||
static bool win_drv_read(lv_indev_t *drv, lv_indev_data_t * data)
|
||||
{
|
||||
data->state = mouse_pressed ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
||||
data->point.x = mouse_x;
|
||||
data->point.y = mouse_y;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void on_paint(void)
|
||||
{
|
||||
HBITMAP bmp = CreateBitmap(WINDOW_HOR_RES, WINDOW_VER_RES, 1, 32, fbp);
|
||||
PAINTSTRUCT ps;
|
||||
|
||||
HDC hdc = BeginPaint(hwnd, &ps);
|
||||
|
||||
HDC hdcMem = CreateCompatibleDC(hdc);
|
||||
HBITMAP hbmOld = SelectObject(hdcMem, bmp);
|
||||
|
||||
BitBlt(hdc, 0, 0, WINDOW_HOR_RES, WINDOW_VER_RES, hdcMem, 0, 0, SRCCOPY);
|
||||
|
||||
SelectObject(hdcMem, hbmOld);
|
||||
DeleteDC(hdcMem);
|
||||
|
||||
EndPaint(hwnd, &ps);
|
||||
DeleteObject(bmp);
|
||||
|
||||
}
|
||||
/**
|
||||
* Flush a buffer to the marked area
|
||||
* @param x1 left coordinate
|
||||
* @param y1 top coordinate
|
||||
* @param x2 right coordinate
|
||||
* @param y2 bottom coordinate
|
||||
* @param color_p an array of colors
|
||||
*/
|
||||
static void win_drv_flush(lv_disp_t *drv, lv_area_t *area, const lv_color_t * color_p)
|
||||
{
|
||||
win_drv_map(area->x1, area->y1, area->x2, area->y2, color_p);
|
||||
lv_disp_flush_ready(drv);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a color map to the marked area
|
||||
* @param x1 left coordinate
|
||||
* @param y1 top coordinate
|
||||
* @param x2 right coordinate
|
||||
* @param y2 bottom coordinate
|
||||
* @param color_p an array of colors
|
||||
*/
|
||||
static void win_drv_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p)
|
||||
{
|
||||
for(int y = y1; y <= y2; y++)
|
||||
{
|
||||
for(int x = x1; x <= x2; x++)
|
||||
{
|
||||
fbp[y*WINDOW_HOR_RES+x] = lv_color_to32(*color_p);
|
||||
color_p++;
|
||||
}
|
||||
}
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
UpdateWindow(hwnd);
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
HDC hdc;
|
||||
PAINTSTRUCT ps;
|
||||
switch(msg) {
|
||||
case WM_CREATE:
|
||||
fbp = malloc(4*WINDOW_HOR_RES*WINDOW_VER_RES);
|
||||
if(fbp == NULL)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_LBUTTONUP:
|
||||
mouse_x = GET_X_LPARAM(lParam);
|
||||
mouse_y = GET_Y_LPARAM(lParam);
|
||||
if(msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP) {
|
||||
mouse_pressed = (msg == WM_LBUTTONDOWN);
|
||||
}
|
||||
return 0;
|
||||
case WM_CLOSE:
|
||||
free(fbp);
|
||||
fbp = NULL;
|
||||
DestroyWindow(hwnd);
|
||||
return 0;
|
||||
case WM_PAINT:
|
||||
on_paint();
|
||||
return 0;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
}
|
||||
static COLORREF lv_color_to_colorref(const lv_color_t color)
|
||||
{
|
||||
uint32_t raw_color = lv_color_to32(color);
|
||||
lv_color32_t tmp;
|
||||
tmp.full = raw_color;
|
||||
uint32_t colorref = RGB(tmp.ch.red, tmp.ch.green, tmp.ch.blue);
|
||||
return colorref;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1,60 +0,0 @@
|
||||
/**
|
||||
* @file fbdev.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef WINDRV_H
|
||||
#define WINDRV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#ifndef LV_DRV_NO_CONF
|
||||
#ifdef LV_CONF_INCLUDE_SIMPLE
|
||||
#include "lv_drv_conf.h"
|
||||
#else
|
||||
#include "../lv_drv_conf.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if USE_WINDOWS
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
extern bool lv_win_exit_flag;
|
||||
extern lv_disp_t *lv_windows_disp;
|
||||
|
||||
HWND windrv_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_WINDOWS*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*WIN_DRV_H*/
|
@ -21,30 +21,30 @@
|
||||
**********************/
|
||||
|
||||
/* Create a type to store the required data about your file.*/
|
||||
typedef FIL file_t;
|
||||
typedef FIL file_t;
|
||||
|
||||
/*Similarly to `file_t` create a type for directory reading too */
|
||||
typedef DIR dir_t;
|
||||
typedef DIR dir_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void fs_init(void);
|
||||
|
||||
static lv_fs_res_t fs_open (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode);
|
||||
static lv_fs_res_t fs_close (lv_fs_drv_t * drv, void * file_p);
|
||||
static lv_fs_res_t fs_read (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br);
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw);
|
||||
static lv_fs_res_t fs_seek (lv_fs_drv_t * drv, void * file_p, uint32_t pos);
|
||||
static lv_fs_res_t fs_size (lv_fs_drv_t * drv, void * file_p, uint32_t * size_p);
|
||||
static lv_fs_res_t fs_tell (lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p);
|
||||
static lv_fs_res_t fs_remove (lv_fs_drv_t * drv, const char *path);
|
||||
static lv_fs_res_t fs_trunc (lv_fs_drv_t * drv, void * file_p);
|
||||
static lv_fs_res_t fs_rename (lv_fs_drv_t * drv, const char * oldname, const char * newname);
|
||||
static lv_fs_res_t fs_free (lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * free_p);
|
||||
static lv_fs_res_t fs_dir_open (lv_fs_drv_t * drv, void * dir_p, const char *path);
|
||||
static lv_fs_res_t fs_dir_read (lv_fs_drv_t * drv, void * dir_p, char *fn);
|
||||
static lv_fs_res_t fs_dir_close (lv_fs_drv_t * drv, void * dir_p);
|
||||
static lv_fs_res_t fs_open(lv_fs_drv_t* drv, void* file_p, const char* path, lv_fs_mode_t mode);
|
||||
static lv_fs_res_t fs_close(lv_fs_drv_t* drv, void* file_p);
|
||||
static lv_fs_res_t fs_read(lv_fs_drv_t* drv, void* file_p, void* buf, uint32_t btr, uint32_t* br);
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw);
|
||||
static lv_fs_res_t fs_seek(lv_fs_drv_t* drv, void* file_p, uint32_t pos);
|
||||
static lv_fs_res_t fs_size(lv_fs_drv_t* drv, void* file_p, uint32_t* size_p);
|
||||
static lv_fs_res_t fs_tell(lv_fs_drv_t* drv, void* file_p, uint32_t* pos_p);
|
||||
static lv_fs_res_t fs_remove(lv_fs_drv_t* drv, const char* path);
|
||||
static lv_fs_res_t fs_trunc(lv_fs_drv_t* drv, void* file_p);
|
||||
static lv_fs_res_t fs_rename(lv_fs_drv_t* drv, const char* oldname, const char* newname);
|
||||
static lv_fs_res_t fs_free(lv_fs_drv_t* drv, uint32_t* total_p, uint32_t* free_p);
|
||||
static lv_fs_res_t fs_dir_open(lv_fs_drv_t* drv, void* dir_p, const char* path);
|
||||
static lv_fs_res_t fs_dir_read(lv_fs_drv_t* drv, void* dir_p, char* fn);
|
||||
static lv_fs_res_t fs_dir_close(lv_fs_drv_t* drv, void* dir_p);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
@ -70,28 +70,28 @@ void lv_fs_if_fatfs_init(void)
|
||||
*--------------------------------------------------*/
|
||||
|
||||
/* Add a simple drive to open images */
|
||||
lv_fs_drv_t fs_drv; /*A driver descriptor*/
|
||||
lv_fs_drv_init(&fs_drv);
|
||||
static lv_fs_drv_t fs_drv; /*A driver descriptor*/
|
||||
lv_fs_drv_init(&fs_drv);
|
||||
|
||||
/*Set up fields...*/
|
||||
fs_drv.file_size = sizeof(file_t);
|
||||
fs_drv.letter = LV_FS_IF_FATFS;
|
||||
fs_drv.open_cb = fs_open;
|
||||
fs_drv.close_cb = fs_close;
|
||||
fs_drv.read_cb = fs_read;
|
||||
fs_drv.write_cb = fs_write;
|
||||
fs_drv.seek_cb = fs_seek;
|
||||
fs_drv.tell_cb = fs_tell;
|
||||
fs_drv.file_size = sizeof(file_t);
|
||||
fs_drv.letter = LV_FS_IF_FATFS;
|
||||
fs_drv.open_cb = fs_open;
|
||||
fs_drv.close_cb = fs_close;
|
||||
fs_drv.read_cb = fs_read;
|
||||
fs_drv.write_cb = fs_write;
|
||||
fs_drv.seek_cb = fs_seek;
|
||||
fs_drv.tell_cb = fs_tell;
|
||||
fs_drv.free_space_cb = fs_free;
|
||||
fs_drv.size_cb = fs_size;
|
||||
fs_drv.remove_cb = fs_remove;
|
||||
fs_drv.rename_cb = fs_rename;
|
||||
fs_drv.trunc_cb = fs_trunc;
|
||||
fs_drv.size_cb = fs_size;
|
||||
fs_drv.remove_cb = fs_remove;
|
||||
fs_drv.rename_cb = fs_rename;
|
||||
fs_drv.trunc_cb = fs_trunc;
|
||||
|
||||
fs_drv.rddir_size = sizeof(dir_t);
|
||||
fs_drv.rddir_size = sizeof(dir_t);
|
||||
fs_drv.dir_close_cb = fs_dir_close;
|
||||
fs_drv.dir_open_cb = fs_dir_open;
|
||||
fs_drv.dir_read_cb = fs_dir_read;
|
||||
fs_drv.dir_open_cb = fs_dir_open;
|
||||
fs_drv.dir_read_cb = fs_dir_read;
|
||||
|
||||
lv_fs_drv_register(&fs_drv);
|
||||
}
|
||||
@ -115,25 +115,27 @@ static void fs_init(void)
|
||||
* @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_open (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode)
|
||||
static lv_fs_res_t fs_open(lv_fs_drv_t* drv, void* file_p, const char* path, lv_fs_mode_t mode)
|
||||
{
|
||||
uint8_t flags = 0;
|
||||
|
||||
if(mode == LV_FS_MODE_WR) flags = FA_WRITE | FA_OPEN_ALWAYS;
|
||||
else if(mode == LV_FS_MODE_RD) flags = FA_READ;
|
||||
else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS;
|
||||
if(mode == LV_FS_MODE_WR)
|
||||
flags = FA_WRITE | FA_OPEN_ALWAYS;
|
||||
else if(mode == LV_FS_MODE_RD)
|
||||
flags = FA_READ;
|
||||
else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD))
|
||||
flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS;
|
||||
|
||||
FRESULT res = f_open(file_p, path, flags);
|
||||
|
||||
if(res == FR_OK) {
|
||||
f_lseek(file_p, 0);
|
||||
return LV_FS_RES_OK;
|
||||
f_lseek(file_p, 0);
|
||||
return LV_FS_RES_OK;
|
||||
} else {
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close an opened file
|
||||
* @param drv pointer to a driver where this function belongs
|
||||
@ -141,7 +143,7 @@ static lv_fs_res_t fs_open (lv_fs_drv_t * drv, void * file_p, const char * path,
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_close (lv_fs_drv_t * drv, void * file_p)
|
||||
static lv_fs_res_t fs_close(lv_fs_drv_t* drv, void* file_p)
|
||||
{
|
||||
f_close(file_p);
|
||||
return LV_FS_RES_OK;
|
||||
@ -157,11 +159,13 @@ static lv_fs_res_t fs_close (lv_fs_drv_t * drv, void * file_p)
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_read (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br)
|
||||
static lv_fs_res_t fs_read(lv_fs_drv_t* drv, void* file_p, void* buf, uint32_t btr, uint32_t* br)
|
||||
{
|
||||
FRESULT res = f_read(file_p, buf, btr, (UINT*)br);
|
||||
if(res == FR_OK) return LV_FS_RES_OK;
|
||||
else return LV_FS_RES_UNKNOWN;
|
||||
if(res == FR_OK)
|
||||
return LV_FS_RES_OK;
|
||||
else
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -173,11 +177,13 @@ static lv_fs_res_t fs_read (lv_fs_drv_t * drv, void * file_p, void * buf, uint32
|
||||
* @param br the number of real written bytes (Bytes Written). NULL if unused.
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw)
|
||||
{
|
||||
FRESULT res = f_write(file_p, buf, btw, (UINT*)bw);
|
||||
if(res == FR_OK) return LV_FS_RES_OK;
|
||||
else return LV_FS_RES_UNKNOWN;
|
||||
FRESULT res = f_write(file_p, buf, btw, (UINT*)bw);
|
||||
if(res == FR_OK)
|
||||
return LV_FS_RES_OK;
|
||||
else
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -188,7 +194,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf,
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_seek (lv_fs_drv_t * drv, void * file_p, uint32_t pos)
|
||||
static lv_fs_res_t fs_seek(lv_fs_drv_t* drv, void* file_p, uint32_t pos)
|
||||
{
|
||||
f_lseek(file_p, pos);
|
||||
return LV_FS_RES_OK;
|
||||
@ -201,9 +207,9 @@ static lv_fs_res_t fs_seek (lv_fs_drv_t * drv, void * file_p, uint32_t pos)
|
||||
* @param size pointer to a variable to store the size
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_size (lv_fs_drv_t * drv, void * file_p, uint32_t * size_p)
|
||||
static lv_fs_res_t fs_size(lv_fs_drv_t* drv, void* file_p, uint32_t* size_p)
|
||||
{
|
||||
(*size_p) = f_size(((file_t *)file_p));
|
||||
(*size_p) = f_size(((file_t*)file_p));
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
|
||||
@ -215,9 +221,9 @@ static lv_fs_res_t fs_size (lv_fs_drv_t * drv, void * file_p, uint32_t * size_p)
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_tell (lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
|
||||
static lv_fs_res_t fs_tell(lv_fs_drv_t* drv, void* file_p, uint32_t* pos_p)
|
||||
{
|
||||
*pos_p = f_tell(((file_t *)file_p));
|
||||
*pos_p = f_tell(((file_t*)file_p));
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
|
||||
@ -227,7 +233,7 @@ static lv_fs_res_t fs_tell (lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
|
||||
* @param path path of the file to delete
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_remove (lv_fs_drv_t * drv, const char *path)
|
||||
static lv_fs_res_t fs_remove(lv_fs_drv_t* drv, const char* path)
|
||||
{
|
||||
lv_fs_res_t res = LV_FS_RES_NOT_IMP;
|
||||
|
||||
@ -243,9 +249,9 @@ static lv_fs_res_t fs_remove (lv_fs_drv_t * drv, const char *path)
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_trunc (lv_fs_drv_t * drv, void * file_p)
|
||||
static lv_fs_res_t fs_trunc(lv_fs_drv_t* drv, void* file_p)
|
||||
{
|
||||
f_sync(file_p); /*If not syncronized fclose can write the truncated part*/
|
||||
f_sync(file_p); /*If not syncronized fclose can write the truncated part*/
|
||||
f_truncate(file_p);
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
@ -257,13 +263,15 @@ static lv_fs_res_t fs_trunc (lv_fs_drv_t * drv, void * file_p)
|
||||
* @param newname path with the new name
|
||||
* @return LV_FS_RES_OK or any error from 'fs_res_t'
|
||||
*/
|
||||
static lv_fs_res_t fs_rename (lv_fs_drv_t * drv, const char * oldname, const char * newname)
|
||||
static lv_fs_res_t fs_rename(lv_fs_drv_t* drv, const char* oldname, const char* newname)
|
||||
{
|
||||
|
||||
|
||||
FRESULT res = f_rename(oldname, newname);
|
||||
|
||||
if(res == FR_OK) return LV_FS_RES_OK;
|
||||
else return LV_FS_RES_UNKNOWN;
|
||||
if(res == FR_OK)
|
||||
return LV_FS_RES_OK;
|
||||
else
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -274,7 +282,7 @@ static lv_fs_res_t fs_rename (lv_fs_drv_t * drv, const char * oldname, const cha
|
||||
* @param free_p pointer to store the free size [kB]
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_free (lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * free_p)
|
||||
static lv_fs_res_t fs_free(lv_fs_drv_t* drv, uint32_t* total_p, uint32_t* free_p)
|
||||
{
|
||||
lv_fs_res_t res = LV_FS_RES_NOT_IMP;
|
||||
|
||||
@ -290,11 +298,13 @@ static lv_fs_res_t fs_free (lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * fr
|
||||
* @param path path to a directory
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_dir_open (lv_fs_drv_t * drv, void * dir_p, const char *path)
|
||||
static lv_fs_res_t fs_dir_open(lv_fs_drv_t* drv, void* dir_p, const char* path)
|
||||
{
|
||||
FRESULT res = f_opendir(dir_p, path);
|
||||
if(res == FR_OK) return LV_FS_RES_OK;
|
||||
else return LV_FS_RES_UNKNOWN;
|
||||
if(res == FR_OK)
|
||||
return LV_FS_RES_OK;
|
||||
else
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -305,21 +315,21 @@ static lv_fs_res_t fs_dir_open (lv_fs_drv_t * drv, void * dir_p, const char *pat
|
||||
* @param fn pointer to a buffer to store the filename
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_dir_read (lv_fs_drv_t * drv, void * dir_p, char *fn)
|
||||
static lv_fs_res_t fs_dir_read(lv_fs_drv_t* drv, void* dir_p, char* fn)
|
||||
{
|
||||
FRESULT res;
|
||||
FILINFO fno;
|
||||
fn[0] = '\0';
|
||||
FRESULT res;
|
||||
FILINFO fno;
|
||||
fn[0] = '\0';
|
||||
|
||||
do {
|
||||
res = f_readdir(dir_p, &fno);
|
||||
if(res != FR_OK) return LV_FS_RES_UNKNOWN;
|
||||
res = f_readdir(dir_p, &fno);
|
||||
if(res != FR_OK) return LV_FS_RES_UNKNOWN;
|
||||
|
||||
if(fno.fattrib & AM_DIR) {
|
||||
fn[0] = '/';
|
||||
strcpy(&fn[1], fno.fname);
|
||||
}
|
||||
else strcpy(fn, fno.fname);
|
||||
if(fno.fattrib & AM_DIR) {
|
||||
fn[0] = '/';
|
||||
strcpy(&fn[1], fno.fname);
|
||||
} else
|
||||
strcpy(fn, fno.fname);
|
||||
|
||||
} while(strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0);
|
||||
|
||||
@ -332,11 +342,11 @@ static lv_fs_res_t fs_dir_read (lv_fs_drv_t * drv, void * dir_p, char *fn)
|
||||
* @param dir_p pointer to an initialized 'fs_read_dir_t' variable
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_dir_close (lv_fs_drv_t * drv, void * dir_p)
|
||||
static lv_fs_res_t fs_dir_close(lv_fs_drv_t* drv, void* dir_p)
|
||||
{
|
||||
f_closedir(dir_p);
|
||||
f_closedir(dir_p);
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
|
||||
#endif /*LV_USE_FS_IF*/
|
||||
#endif /*LV_FS_IF_FATFS*/
|
||||
#endif /*LV_USE_FS_IF*/
|
||||
#endif /*LV_FS_IF_FATFS*/
|
||||
|
@ -87,7 +87,7 @@ void lv_fs_if_pc_init(void)
|
||||
*--------------------------------------------------*/
|
||||
|
||||
/* Add a simple drive to open images */
|
||||
lv_fs_drv_t fs_drv; /*A driver descriptor*/
|
||||
static lv_fs_drv_t fs_drv; /*A driver descriptor*/
|
||||
lv_fs_drv_init(&fs_drv);
|
||||
|
||||
/*Set up fields...*/
|
||||
|
@ -14,27 +14,27 @@
|
||||
#include "ArduinoLog.h"
|
||||
|
||||
#if LV_USE_FS_IF
|
||||
#if LV_FS_IF_SPIFFS != '\0'
|
||||
#if LV_FS_IF_SPIFFS != '\0'
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
#if HASP_USE_SPIFFS > 0
|
||||
#include "SPIFFS.h"
|
||||
#define LV_FS_SPIFFS SPIFFS
|
||||
#elif HASP_USE_LITTLEFS > 0
|
||||
#include "LITTLEFS.h"
|
||||
#define LV_FS_SPIFFS LITTLEFS
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
#include "LittleFS.h"
|
||||
#define LV_FS_SPIFFS LittleFS
|
||||
#endif // ARDUINO_ARCH
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
#if HASP_USE_SPIFFS > 0
|
||||
#include "SPIFFS.h"
|
||||
#define LV_FS_SPIFFS SPIFFS
|
||||
#elif HASP_USE_LITTLEFS > 0
|
||||
#include "LITTLEFS.h"
|
||||
#define LV_FS_SPIFFS LITTLEFS
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
#include "LittleFS.h"
|
||||
#define LV_FS_SPIFFS LittleFS
|
||||
#endif // ARDUINO_ARCH
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||
#include <FS.h>
|
||||
#include <Esp.h>
|
||||
#endif // ARDUINO_ARCH
|
||||
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||
#include <FS.h>
|
||||
#include <Esp.h>
|
||||
#endif // ARDUINO_ARCH
|
||||
|
||||
#define TAG_LVFS 91
|
||||
#define TAG_LVFS 91
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
@ -47,34 +47,34 @@
|
||||
/* Create a type to store the required data about your file.*/
|
||||
typedef File lv_spiffs_file_t;
|
||||
|
||||
/*Similarly to `file_t` create a type for directory reading too */
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
/*Similarly to `file_t` create a type for directory reading too */
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
typedef File lv_spiffs_dir_t;
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
typedef Dir lv_spiffs_dir_t;
|
||||
#define FILE_READ "r"
|
||||
#define FILE_WRITE "r+"
|
||||
#endif
|
||||
#define FILE_READ "r"
|
||||
#define FILE_WRITE "r+"
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void fs_init(void);
|
||||
|
||||
static lv_fs_res_t fs_open(lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode);
|
||||
static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p);
|
||||
static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br);
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw);
|
||||
static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos);
|
||||
static lv_fs_res_t fs_size(lv_fs_drv_t * drv, void * file_p, uint32_t * size_p);
|
||||
static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p);
|
||||
static lv_fs_res_t fs_remove(lv_fs_drv_t * drv, const char * path);
|
||||
static lv_fs_res_t fs_trunc(lv_fs_drv_t * drv, void * file_p);
|
||||
static lv_fs_res_t fs_rename(lv_fs_drv_t * drv, const char * oldname, const char * newname);
|
||||
static lv_fs_res_t fs_free(lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * free_p);
|
||||
static lv_fs_res_t fs_dir_open(lv_fs_drv_t * drv, void * dir_p, const char * path);
|
||||
static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn);
|
||||
static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p);
|
||||
static lv_fs_res_t fs_open(lv_fs_drv_t* drv, void* file_p, const char* path, lv_fs_mode_t mode);
|
||||
static lv_fs_res_t fs_close(lv_fs_drv_t* drv, void* file_p);
|
||||
static lv_fs_res_t fs_read(lv_fs_drv_t* drv, void* file_p, void* buf, uint32_t btr, uint32_t* br);
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw);
|
||||
static lv_fs_res_t fs_seek(lv_fs_drv_t* drv, void* file_p, uint32_t pos);
|
||||
static lv_fs_res_t fs_size(lv_fs_drv_t* drv, void* file_p, uint32_t* size_p);
|
||||
static lv_fs_res_t fs_tell(lv_fs_drv_t* drv, void* file_p, uint32_t* pos_p);
|
||||
static lv_fs_res_t fs_remove(lv_fs_drv_t* drv, const char* path);
|
||||
static lv_fs_res_t fs_trunc(lv_fs_drv_t* drv, void* file_p);
|
||||
static lv_fs_res_t fs_rename(lv_fs_drv_t* drv, const char* oldname, const char* newname);
|
||||
static lv_fs_res_t fs_free(lv_fs_drv_t* drv, uint32_t* total_p, uint32_t* free_p);
|
||||
static lv_fs_res_t fs_dir_open(lv_fs_drv_t* drv, void* dir_p, const char* path);
|
||||
static lv_fs_res_t fs_dir_read(lv_fs_drv_t* drv, void* dir_p, char* fn);
|
||||
static lv_fs_res_t fs_dir_close(lv_fs_drv_t* drv, void* dir_p);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
@ -100,7 +100,7 @@ void lv_fs_if_spiffs_init(void)
|
||||
*--------------------------------------------------*/
|
||||
|
||||
/* Add a simple drive to open images */
|
||||
lv_fs_drv_t fs_drv; /*A driver descriptor*/
|
||||
static lv_fs_drv_t fs_drv; /*A driver descriptor*/
|
||||
lv_fs_drv_init(&fs_drv);
|
||||
|
||||
/*Set up fields...*/
|
||||
@ -144,14 +144,14 @@ static void fs_init(void)
|
||||
* @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_open(lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode)
|
||||
static lv_fs_res_t fs_open(lv_fs_drv_t* drv, void* file_p, const char* path, lv_fs_mode_t mode)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
|
||||
char filename[32];
|
||||
snprintf_P(filename, sizeof(filename), PSTR("/%s"), path);
|
||||
|
||||
lv_spiffs_file_t * fp = (lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t* fp = (lv_spiffs_file_t*)file_p;
|
||||
if(fp == NULL) return LV_FS_RES_INV_PARAM;
|
||||
|
||||
LOG_VERBOSE(TAG_LVFS, F("Opening %s"), filename);
|
||||
@ -186,10 +186,10 @@ static lv_fs_res_t fs_open(lv_fs_drv_t * drv, void * file_p, const char * path,
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p)
|
||||
static lv_fs_res_t fs_close(lv_fs_drv_t* drv, void* file_p)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
lv_spiffs_file_t * fp = (lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t* fp = (lv_spiffs_file_t*)file_p;
|
||||
if(fp == NULL) return LV_FS_RES_INV_PARAM;
|
||||
|
||||
lv_spiffs_file_t file = *fp;
|
||||
@ -217,10 +217,10 @@ static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p)
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br)
|
||||
static lv_fs_res_t fs_read(lv_fs_drv_t* drv, void* file_p, void* buf, uint32_t btr, uint32_t* br)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
lv_spiffs_file_t * fp = (lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t* fp = (lv_spiffs_file_t*)file_p;
|
||||
if(fp == NULL) return LV_FS_RES_INV_PARAM;
|
||||
|
||||
lv_spiffs_file_t file = *fp;
|
||||
@ -232,7 +232,7 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
|
||||
} else {
|
||||
// LOG_VERBOSE(TAG_LVFS, F("Reading %u bytes from %s at position %u"), btr, file.name(), file.position());
|
||||
uint32_t len = 0;
|
||||
char * chp = (char *)buf;
|
||||
char* chp = (char*)buf;
|
||||
if(chp != NULL && btr > 0)
|
||||
len = file.readBytes(chp, btr);
|
||||
else
|
||||
@ -257,10 +257,10 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
|
||||
* @param br the number of real written bytes (Bytes Written). NULL if unused.
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
|
||||
static lv_fs_res_t fs_write(lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t*)file_p;
|
||||
// File file = fp;
|
||||
|
||||
if(!file) {
|
||||
@ -268,7 +268,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf,
|
||||
return LV_FS_RES_NOT_EX;
|
||||
|
||||
} else {
|
||||
*bw = (uint32_t)file.write((byte *)buf, btw);
|
||||
*bw = (uint32_t)file.write((byte*)buf, btw);
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
}
|
||||
@ -281,10 +281,10 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf,
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos)
|
||||
static lv_fs_res_t fs_seek(lv_fs_drv_t* drv, void* file_p, uint32_t pos)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t*)file_p;
|
||||
// File file = fp;
|
||||
|
||||
if(!file) {
|
||||
@ -304,10 +304,10 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos)
|
||||
* @param size pointer to a variable to store the size
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_size(lv_fs_drv_t * drv, void * file_p, uint32_t * size_p)
|
||||
static lv_fs_res_t fs_size(lv_fs_drv_t* drv, void* file_p, uint32_t* size_p)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t*)file_p;
|
||||
// File file = fp;
|
||||
|
||||
if(!file) {
|
||||
@ -328,10 +328,10 @@ static lv_fs_res_t fs_size(lv_fs_drv_t * drv, void * file_p, uint32_t * size_p)
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
|
||||
static lv_fs_res_t fs_tell(lv_fs_drv_t* drv, void* file_p, uint32_t* pos_p)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t *)file_p;
|
||||
lv_spiffs_file_t file = *(lv_spiffs_file_t*)file_p;
|
||||
// File file = fp;
|
||||
|
||||
if(!file) {
|
||||
@ -350,7 +350,7 @@ static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
|
||||
* @param path path of the file to delete
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_remove(lv_fs_drv_t * drv, const char * path)
|
||||
static lv_fs_res_t fs_remove(lv_fs_drv_t* drv, const char* path)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
|
||||
@ -375,7 +375,7 @@ static lv_fs_res_t fs_remove(lv_fs_drv_t * drv, const char * path)
|
||||
* @return LV_FS_RES_OK: no error, the file is read
|
||||
* any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_trunc(lv_fs_drv_t * drv, void * file_p)
|
||||
static lv_fs_res_t fs_trunc(lv_fs_drv_t* drv, void* file_p)
|
||||
{
|
||||
return LV_FS_RES_NOT_IMP;
|
||||
}
|
||||
@ -387,7 +387,7 @@ static lv_fs_res_t fs_trunc(lv_fs_drv_t * drv, void * file_p)
|
||||
* @param newname path with the new name
|
||||
* @return LV_FS_RES_OK or any error from 'fs_res_t'
|
||||
*/
|
||||
static lv_fs_res_t fs_rename(lv_fs_drv_t * drv, const char * oldname, const char * newname)
|
||||
static lv_fs_res_t fs_rename(lv_fs_drv_t* drv, const char* oldname, const char* newname)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
char fromname[32];
|
||||
@ -411,23 +411,23 @@ static lv_fs_res_t fs_rename(lv_fs_drv_t * drv, const char * oldname, const char
|
||||
* @param free_p pointer to store the free size [kB]
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_free(lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * free_p)
|
||||
static lv_fs_res_t fs_free(lv_fs_drv_t* drv, uint32_t* total_p, uint32_t* free_p)
|
||||
{
|
||||
(void)drv; /*Unused*/
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
FSInfo fs_info;
|
||||
LV_FS_SPIFFS.info(fs_info);
|
||||
*total_p = (uint32_t)fs_info.totalBytes;
|
||||
*free_p = (uint32_t)fs_info.totalBytes - fs_info.usedBytes;
|
||||
return LV_FS_RES_OK;
|
||||
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
*total_p = (uint32_t)LV_FS_SPIFFS.totalBytes();
|
||||
*free_p = (uint32_t)LV_FS_SPIFFS.totalBytes() - LV_FS_SPIFFS.usedBytes();
|
||||
return LV_FS_RES_OK;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return LV_FS_RES_NOT_IMP;
|
||||
}
|
||||
@ -439,23 +439,23 @@ static lv_fs_res_t fs_free(lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * fre
|
||||
* @param path path to a directory
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_dir_open(lv_fs_drv_t * drv, void * dir_p, const char * path)
|
||||
static lv_fs_res_t fs_dir_open(lv_fs_drv_t* drv, void* dir_p, const char* path)
|
||||
{
|
||||
lv_spiffs_dir_t dir;
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
dir = LV_FS_SPIFFS.open(path);
|
||||
if(!dir) {
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
dir = LV_FS_SPIFFS.openDir(path);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
lv_spiffs_dir_t * dp = (lv_spiffs_dir_t *)dir_p; /*Just avoid the confusing casings*/
|
||||
*dp = dir;
|
||||
lv_spiffs_dir_t* dp = (lv_spiffs_dir_t*)dir_p; /*Just avoid the confusing casings*/
|
||||
*dp = dir;
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
|
||||
@ -467,11 +467,11 @@ static lv_fs_res_t fs_dir_open(lv_fs_drv_t * drv, void * dir_p, const char * pat
|
||||
* @param fn pointer to a buffer to store the filename
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
|
||||
static lv_fs_res_t fs_dir_read(lv_fs_drv_t* drv, void* dir_p, char* fn)
|
||||
{
|
||||
lv_spiffs_dir_t dir = *(lv_spiffs_dir_t *)dir_p; /*Convert type*/
|
||||
lv_spiffs_dir_t dir = *(lv_spiffs_dir_t*)dir_p; /*Convert type*/
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
File file = dir.openNextFile();
|
||||
if(file) {
|
||||
strcpy(fn, file.name());
|
||||
@ -479,16 +479,16 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
|
||||
} else {
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
if(dir.next()) {
|
||||
strcpy(fn, dir.fileName().c_str());
|
||||
return LV_FS_RES_OK;
|
||||
} else {
|
||||
return LV_FS_RES_UNKNOWN;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return LV_FS_RES_NOT_IMP;
|
||||
}
|
||||
@ -499,12 +499,12 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
|
||||
* @param dir_p pointer to an initialized 'fs_read_dir_t' variable
|
||||
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
|
||||
*/
|
||||
static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p)
|
||||
static lv_fs_res_t fs_dir_close(lv_fs_drv_t* drv, void* dir_p)
|
||||
{
|
||||
return LV_FS_RES_OK;
|
||||
}
|
||||
|
||||
#endif /*LV_USE_FS_IF*/
|
||||
#endif /*LV_FS_IF_SPIFFS*/
|
||||
#endif /*LV_USE_FS_IF*/
|
||||
#endif /*LV_FS_IF_SPIFFS*/
|
||||
|
||||
#endif /*ARDUINO*/
|
@ -15,7 +15,7 @@ Obtain or create a font file:
|
||||
lv_zifont_init();
|
||||
|
||||
static lv_font_t font1;
|
||||
lv_zifont_font_init(&font1, "./notosans_32.zi", 0);
|
||||
lv_zifont_font_init(&font1, "/notosans_32.zi", 0);
|
||||
|
||||
static lv_style_t ft_style;
|
||||
lv_style_copy(&ft_style, &lv_style_plain);
|
||||
|
@ -2,7 +2,7 @@
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#if !(defined(WINDOWS)||defined(POSIX))
|
||||
#if !(defined(WINDOWS) || defined(POSIX))
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <stdio.h>
|
||||
@ -55,8 +55,8 @@ enum zifont_codepage_t8_t { ASCII = 0x01, ISO_8859_1 = 0x03, UTF_8 = 0x18 };
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
const uint8_t * IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t * font, uint32_t unicode_letter);
|
||||
bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
|
||||
const uint8_t* IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t* font, uint32_t unicode_letter);
|
||||
bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t* font, lv_font_glyph_dsc_t* dsc_out,
|
||||
uint32_t unicode_letter, uint32_t unicode_letter_next);
|
||||
|
||||
/**********************
|
||||
@ -73,7 +73,7 @@ lv_zifont_char_t lastCharInfo; // Holds the last Glyph DSC
|
||||
#define CHAR_CACHE_SIZE 95
|
||||
// static lv_zifont_char_t charCache[256 - 32]; // glyphID DSC cache
|
||||
#endif
|
||||
static uint8_t * charBitmap_p;
|
||||
static uint8_t* charBitmap_p;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
@ -83,18 +83,19 @@ static uint8_t * charBitmap_p;
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void IRAM_ATTR blackAdd(uint8_t * charBitmap_p, uint16_t pos);
|
||||
static void IRAM_ATTR colorsAdd(uint8_t * charBitmap_p, uint8_t color1, uint16_t pos);
|
||||
static void IRAM_ATTR blackAdd(uint8_t* charBitmap_p, uint16_t pos);
|
||||
static void IRAM_ATTR colorsAdd(uint8_t* charBitmap_p, uint8_t color1, uint16_t pos);
|
||||
// static uint16_t unicode2codepoint(uint32_t unicode, uint8_t codepage);
|
||||
// static void printBuffer(uint8_t * charBitmap_p, uint8_t w, uint8_t h);
|
||||
|
||||
int lv_zifont_init(void)
|
||||
{
|
||||
// FS.begin(true);
|
||||
// charBitmap_p = (uint8_t *)lv_mem_alloc(32 * 32);
|
||||
return LV_RES_OK; // OK
|
||||
}
|
||||
|
||||
static inline bool openFont(File & file, const char * filename)
|
||||
static inline bool openFont(File& file, const char* filename)
|
||||
{
|
||||
if(*filename != '/') return false;
|
||||
|
||||
@ -103,6 +104,7 @@ static inline bool openFont(File & file, const char * filename)
|
||||
LOG_ERROR(TAG_FONT, F("Opening font: %s"), filename);
|
||||
return false;
|
||||
}
|
||||
// LOG_TRACE(TAG_FONT, F("Opening font: %s"), filename);
|
||||
return file;
|
||||
}
|
||||
|
||||
@ -110,7 +112,7 @@ static inline bool initCharacterFrame(size_t size)
|
||||
{
|
||||
if(size > _lv_mem_get_size(charBitmap_p)) {
|
||||
lv_mem_free(charBitmap_p);
|
||||
charBitmap_p = (uint8_t *)lv_mem_alloc(size);
|
||||
charBitmap_p = (uint8_t*)lv_mem_alloc(size);
|
||||
LOG_WARNING(TAG_FONT, F("Pixel buffer is %d bytes"), _lv_mem_get_size(charBitmap_p));
|
||||
}
|
||||
|
||||
@ -123,29 +125,34 @@ static inline bool initCharacterFrame(size_t size)
|
||||
}
|
||||
}
|
||||
|
||||
int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size)
|
||||
int lv_zifont_font_init(lv_font_t** font, const char* font_path, uint16_t size)
|
||||
{
|
||||
charInBuffer = 0; // invalidate any previous cache
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - lv_zifont_font_init"), __FILE__, __LINE__);
|
||||
|
||||
if(!*font) {
|
||||
*font = (lv_font_t *)lv_mem_alloc(sizeof(lv_font_t));
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - init font"), __FILE__, __LINE__);
|
||||
*font = (lv_font_t*)lv_mem_alloc(sizeof(lv_font_t));
|
||||
LV_ASSERT_MEM(*font);
|
||||
_lv_memset_00(*font, sizeof(lv_font_t)); // lv_mem_alloc might be dirty
|
||||
}
|
||||
|
||||
lv_font_fmt_zifont_dsc_t * dsc;
|
||||
lv_font_fmt_zifont_dsc_t* dsc;
|
||||
if(!(*font)->dsc) {
|
||||
dsc = (lv_font_fmt_zifont_dsc_t *)lv_mem_alloc(sizeof(lv_font_fmt_zifont_dsc_t));
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - init font dsc"), __FILE__, __LINE__);
|
||||
dsc = (lv_font_fmt_zifont_dsc_t*)lv_mem_alloc(sizeof(lv_font_fmt_zifont_dsc_t));
|
||||
LV_ASSERT_MEM(dsc);
|
||||
_lv_memset_00(dsc, sizeof(lv_font_fmt_zifont_dsc_t)); // lv_mem_alloc might be dirty
|
||||
dsc->ascii_glyph_dsc = NULL;
|
||||
} else {
|
||||
dsc = (lv_font_fmt_zifont_dsc_t *)(*font)->dsc;
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - reuse font dsc"), __FILE__, __LINE__);
|
||||
dsc = (lv_font_fmt_zifont_dsc_t*)(*font)->dsc;
|
||||
}
|
||||
LV_ASSERT_MEM(dsc);
|
||||
if(!dsc) return ZIFONT_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
/* Initialize Last Glyph DSC */
|
||||
dsc->last_glyph_dsc = (lv_zifont_char_t *)lv_mem_alloc(sizeof(lv_zifont_char_t));
|
||||
dsc->last_glyph_dsc = (lv_zifont_char_t*)lv_mem_alloc(sizeof(lv_zifont_char_t));
|
||||
_lv_memset_00(dsc->last_glyph_dsc, sizeof(lv_zifont_char_t)); // lv_mem_alloc might be dirty
|
||||
|
||||
if(dsc->last_glyph_dsc == NULL) return ZIFONT_ERROR_OUT_OF_MEMORY;
|
||||
@ -158,7 +165,9 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size
|
||||
|
||||
/* Read file header as dsc */
|
||||
zi_font_header_t header;
|
||||
size_t readSize = file.readBytes((char *)&header, sizeof(zi_font_header_t));
|
||||
size_t readSize = file.readBytes((char*)&header, sizeof(zi_font_header_t));
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
/* Check that we read the correct size */
|
||||
if(readSize != sizeof(zi_font_header_t)) {
|
||||
@ -167,6 +176,8 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size
|
||||
return ZIFONT_ERROR_READING_DATA;
|
||||
}
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
/* Check ziFile Header Format */
|
||||
if(header.Password != 4 || header.Version != 5) {
|
||||
LOG_ERROR(TAG_FONT, F("Unknown font file format"));
|
||||
@ -174,6 +185,8 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size
|
||||
return ZIFONT_ERROR_UNKNOWN_HEADER;
|
||||
}
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
dsc->CharHeight = header.CharHeight;
|
||||
dsc->CharWidth = header.CharWidth;
|
||||
dsc->Maximumnumchars = header.Maximumnumchars;
|
||||
@ -182,20 +195,33 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size
|
||||
dsc->Startdataaddress = header.Startdataaddress + header.Descriptionlength;
|
||||
dsc->Fontdataadd8byte = header.Fontdataadd8byte;
|
||||
|
||||
if(!dsc->ascii_glyph_dsc) {
|
||||
dsc->ascii_glyph_dsc = (lv_zifont_char_t *)lv_mem_alloc(sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE);
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - %d"), __FILE__, __LINE__, dsc->ascii_glyph_dsc);
|
||||
|
||||
if(dsc->ascii_glyph_dsc == NULL) {
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - ascii_glyph_dsc init"), __FILE__, __LINE__);
|
||||
dsc->ascii_glyph_dsc = (lv_zifont_char_t*)lv_mem_alloc(sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE);
|
||||
LV_ASSERT_MEM(dsc->ascii_glyph_dsc);
|
||||
_lv_memset_00(dsc->ascii_glyph_dsc, sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE); // lv_mem_alloc might be dirty
|
||||
}
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
if(dsc->ascii_glyph_dsc == NULL) {
|
||||
file.close();
|
||||
return ZIFONT_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d - Seerkset: %d"), __FILE__, __LINE__, dsc->Startdataaddress);
|
||||
|
||||
/* read charmap into cache */
|
||||
file.seek(0 * sizeof(zi_font_header_t) + dsc->Startdataaddress, SeekSet);
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
//* read and fill charmap cache
|
||||
readSize = file.readBytes((char *)dsc->ascii_glyph_dsc, sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE);
|
||||
readSize = file.readBytes((char*)dsc->ascii_glyph_dsc, sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE);
|
||||
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
//* Check that we read the correct size
|
||||
if(readSize != sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE) {
|
||||
@ -236,9 +262,11 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size
|
||||
/* header data struct */ /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
|
||||
(*font)->subpx = 0;
|
||||
|
||||
if((*font)->user_data != (char *)font_path) {
|
||||
LOG_TRACE(TAG_FONT, F("File %s - Line %d"), __FILE__, __LINE__);
|
||||
|
||||
if((*font)->user_data != (char*)font_path) {
|
||||
if((*font)->user_data) free((*font)->user_data);
|
||||
(*font)->user_data = (char *)font_path;
|
||||
(*font)->user_data = (char*)font_path;
|
||||
}
|
||||
|
||||
return ZIFONT_NO_ERROR;
|
||||
@ -254,7 +282,7 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size
|
||||
* @param unicode_letter an unicode letter which bitmap should be get
|
||||
* @return pointer to the bitmap or NULL if not found
|
||||
*/
|
||||
const uint8_t * IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t * font, uint32_t unicode_letter)
|
||||
const uint8_t* IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t* font, uint32_t unicode_letter)
|
||||
{
|
||||
/* Bitmap still in buffer */
|
||||
if(charInBuffer == unicode_letter && charBitmap_p) {
|
||||
@ -263,8 +291,8 @@ const uint8_t * IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t * font,
|
||||
return charBitmap_p;
|
||||
}
|
||||
|
||||
lv_font_fmt_zifont_dsc_t * fdsc = (lv_font_fmt_zifont_dsc_t *)font->dsc; /* header data struct */
|
||||
lv_zifont_char_t * charInfo;
|
||||
lv_font_fmt_zifont_dsc_t* fdsc = (lv_font_fmt_zifont_dsc_t*)font->dsc; /* header data struct */
|
||||
lv_zifont_char_t* charInfo;
|
||||
|
||||
/* Space */
|
||||
if(unicode_letter == 0x20) {
|
||||
@ -289,7 +317,7 @@ const uint8_t * IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t * font,
|
||||
charmap_position = 25 + sizeof(zi_font_header_t);
|
||||
glyphID = unicode_letter - 0xf000; // start of fontawesome
|
||||
} else {
|
||||
strcpy(filename, (char *)font->user_data);
|
||||
strcpy(filename, (char*)font->user_data);
|
||||
charmap_position = fdsc->Startdataaddress;
|
||||
glyphID = unicode_letter - 0x20; // simple unicode to ascii - space is charNum=0
|
||||
}
|
||||
@ -303,11 +331,11 @@ const uint8_t * IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t * font,
|
||||
} else {
|
||||
Serial.print("%");
|
||||
/* Read Character Table */
|
||||
charInfo = (lv_zifont_char_t *)lv_mem_alloc(sizeof(lv_zifont_char_t));
|
||||
charInfo = (lv_zifont_char_t*)lv_mem_alloc(sizeof(lv_zifont_char_t));
|
||||
// lv_memset(charInfo, 0x00, sizeof(lv_zifont_char_t)); // lv_mem_alloc might be dirty
|
||||
uint32_t char_position = glyphID * sizeof(lv_zifont_char_t) + charmap_position;
|
||||
file.seek(char_position, SeekSet);
|
||||
size_t readSize = file.readBytes((char *)charInfo, sizeof(lv_zifont_char_t));
|
||||
size_t readSize = file.readBytes((char*)charInfo, sizeof(lv_zifont_char_t));
|
||||
|
||||
/* Check that we read the correct size */
|
||||
if(readSize != sizeof(lv_zifont_char_t)) {
|
||||
@ -441,7 +469,7 @@ const uint8_t * IRAM_ATTR lv_font_get_bitmap_fmt_zifont(const lv_font_t * font,
|
||||
* @return true: descriptor is successfully loaded into `dsc_out`.
|
||||
* false: the letter was not found, no data is loaded to `dsc_out`
|
||||
*/
|
||||
bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
|
||||
bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t* font, lv_font_glyph_dsc_t* dsc_out,
|
||||
uint32_t unicode_letter, uint32_t unicode_letter_next)
|
||||
{
|
||||
/* Only ascii characteres supported for now */
|
||||
@ -452,7 +480,7 @@ bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_
|
||||
// if(unicode_letter > 0xff) Serial.printf("Char# %u\n", unicode_letter);
|
||||
|
||||
// ulong startMillis = millis();
|
||||
lv_font_fmt_zifont_dsc_t * fdsc = (lv_font_fmt_zifont_dsc_t *)font->dsc; /* header data struct */
|
||||
lv_font_fmt_zifont_dsc_t* fdsc = (lv_font_fmt_zifont_dsc_t*)font->dsc; /* header data struct */
|
||||
|
||||
uint16_t glyphID;
|
||||
File file;
|
||||
@ -482,7 +510,7 @@ bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_
|
||||
snprintf_P(filename, sizeof(filename), PSTR("/fontawesome%u.zi"), fdsc->CharHeight);
|
||||
if(!openFont(file, filename)) return false;
|
||||
} else {
|
||||
if(!openFont(file, (char *)font->user_data)) return false;
|
||||
if(!openFont(file, (char*)font->user_data)) return false;
|
||||
}
|
||||
|
||||
/* read 10 bytes charmap */
|
||||
@ -490,7 +518,7 @@ bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_
|
||||
lv_zifont_char_t myCharIndex;
|
||||
uint32_t char_position = glyphID * sizeof(lv_zifont_char_t) + charmap_position;
|
||||
file.seek(char_position, SeekSet);
|
||||
size_t readSize = file.readBytes((char *)&myCharIndex, sizeof(lv_zifont_char_t));
|
||||
size_t readSize = file.readBytes((char*)&myCharIndex, sizeof(lv_zifont_char_t));
|
||||
file.close();
|
||||
|
||||
/* Check that we read the correct size */
|
||||
@ -536,7 +564,7 @@ bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_
|
||||
return true;
|
||||
}
|
||||
|
||||
static void IRAM_ATTR blackAdd(uint8_t * charBitmap_p, uint16_t pos)
|
||||
static void IRAM_ATTR blackAdd(uint8_t* charBitmap_p, uint16_t pos)
|
||||
{
|
||||
uint8_t col = pos & 0x0001; // remainder
|
||||
uint16_t map_p = pos >> 1; // devide by 2
|
||||
@ -548,7 +576,7 @@ static void IRAM_ATTR blackAdd(uint8_t * charBitmap_p, uint16_t pos)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void IRAM_ATTR colorsAdd(uint8_t * charBitmap_p, uint8_t color1, uint16_t pos)
|
||||
static inline void IRAM_ATTR colorsAdd(uint8_t* charBitmap_p, uint8_t color1, uint16_t pos)
|
||||
{
|
||||
uint32_t col = pos & 0x0001; // remainder
|
||||
uint32_t map_p = pos >> 1; // devide by 2
|
||||
|
@ -39,8 +39,8 @@ monitor_speed = 115200
|
||||
|
||||
build_flags =
|
||||
-D PIOENV=\"${PIOENV}\"
|
||||
;-Os ; Code Size Optimization
|
||||
-Og ; Code Debug Optimization
|
||||
-Os ; Code Size Optimization
|
||||
;-Og ; Code Debug Optimization
|
||||
;-w ; Suppress warnings
|
||||
-D CORE_DEBUG_LEVEL=0 ; 0=Silent, 1=Errors, 2=Warnings
|
||||
-I include ; include lv_conf.h and hasp_conf.h
|
||||
@ -73,8 +73,8 @@ lib_deps =
|
||||
git+https://github.com/fvanroie/ConsoleInput.git
|
||||
;git+https://github.com/andrethomas/TasmotaSlave.git
|
||||
;git+https://github.com/fvanroie/lv_components.git
|
||||
git+https://github.com/lvgl/lvgl.git
|
||||
;lvgl/lvgl @^7.11.0 ; from PIO library
|
||||
;git+https://github.com/lvgl/lvgl.git
|
||||
lvgl/lvgl @^7.11.0 ; from PIO library
|
||||
;bodmer/TFT_eSPI @ 2.3.4 ; Tft SPI drivers EXACT version 2.3.5 has compile error
|
||||
git+https://github.com/Bodmer/TFT_eSPI.git
|
||||
; ------ Unused / Test libraries
|
||||
@ -83,7 +83,6 @@ lib_deps =
|
||||
;AsyncTCP
|
||||
;https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip
|
||||
;https://github.com/me-no-dev/ESPAsyncTCP/archive/master.zip
|
||||
adafruit/Adafruit STMPE610@^1.1.3 ;STMPE610 touch controller
|
||||
|
||||
src_filter = +<*> -<.git/> -<examples/> -<test/> -<tests/> -<stm32f4/> -<lv_font_montserrat_*.c>
|
||||
|
||||
@ -93,7 +92,7 @@ extra_scripts = tools/copy_fw.py ; tools/pre:extra_script.py
|
||||
[esp32]
|
||||
framework = arduino
|
||||
platform = espressif32
|
||||
board_build.partitions = user_setups/esp32_partition_app1300k_spiffs1216k.csv
|
||||
board_build.partitions = user_setups/esp32/partition_app1536k_spiffs1024k.csv
|
||||
|
||||
; ----- crash reporter
|
||||
monitor_filters = esp32_exception_decoder
|
||||
@ -148,7 +147,6 @@ extra_scripts =
|
||||
tools/copy_partitions.py
|
||||
tools/analyze_elf.py
|
||||
|
||||
|
||||
; -- The ESP32 has 2 SPI Hardware Busses available to use:
|
||||
vspi =
|
||||
-D TFT_MISO=19
|
||||
|
@ -9,8 +9,9 @@ extra_configs =
|
||||
; user_setups/esp32/*.ini
|
||||
; user_setups/esp8266/*.ini
|
||||
; user_setups/stm32f4xx/*.ini
|
||||
; user_setups/win32/*.ini
|
||||
; user_setups/darwin_sdl/*.ini
|
||||
; user_setups/linux_sdl/*.ini
|
||||
; user_setups/win32/*.ini
|
||||
|
||||
[override]
|
||||
; -- Hasp config options --------------------------------------
|
||||
@ -74,7 +75,7 @@ board = nodemcu-32s
|
||||
upload_port = COM12 ; To change the port, use platform_override.ini
|
||||
monitor_port = COM12 ; To change the port, use platform_override.ini
|
||||
|
||||
board_build.partitions = user_setups/esp32_partition_app1300k_spiffs1216k.csv ; default.csv
|
||||
board_build.partitions = user_setups/esp32/partition_app1536k_spiffs1024k.csv ; default.csv
|
||||
|
||||
debug_tool = esp-prog
|
||||
debug_init_break = tbreak setup
|
||||
|
@ -1,12 +1,2 @@
|
||||
/* MIT License - Copyright (c) 2019-2021 Francis Van Roie
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
|
||||
#include "device.h"
|
||||
|
||||
#if defined(LANBONL8)
|
||||
#warning Lanbon L8
|
||||
#elif defined(M5STACK)
|
||||
#warning M5 Stack
|
||||
#else
|
||||
#warning Generic Device
|
||||
#endif
|
@ -37,7 +37,7 @@ class BaseDevice {
|
||||
{
|
||||
return "";
|
||||
}
|
||||
virtual const char* get_display_driver()
|
||||
virtual const char* get_chip_model()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
@ -43,11 +43,34 @@ void Esp32Device::set_hostname(const char* hostname)
|
||||
}
|
||||
const char* Esp32Device::get_core_version()
|
||||
{
|
||||
return ESP.getSdkVersion();
|
||||
return esp_get_idf_version(); // == ESP.getSdkVersion();
|
||||
}
|
||||
const char* Esp32Device::get_display_driver()
|
||||
const char* Esp32Device::get_chip_model()
|
||||
{
|
||||
return Utilities::tft_driver_name().c_str();
|
||||
esp_chip_info_t chip_info;
|
||||
esp_chip_info(&chip_info);
|
||||
|
||||
// model = chip_info.cores;
|
||||
// model += F("core ");
|
||||
switch(chip_info.model) {
|
||||
case CHIP_ESP32:
|
||||
return "ESP32";
|
||||
|
||||
#ifdef CHIP_ESP32S2
|
||||
case CHIP_ESP32S2:
|
||||
return "ESP32-S2";
|
||||
#endif
|
||||
|
||||
#ifdef CHIP_ESP32S3
|
||||
case CHIP_ESP32S3:
|
||||
return "ESP32-S3";
|
||||
#endif
|
||||
|
||||
default:
|
||||
return "Unknown ESP32";
|
||||
}
|
||||
// model += F(" rev");
|
||||
// model += chip_info.revision;
|
||||
}
|
||||
|
||||
void Esp32Device::set_backlight_pin(uint8_t pin)
|
||||
|
@ -30,7 +30,7 @@ class Esp32Device : public BaseDevice {
|
||||
const char* get_hostname();
|
||||
void set_hostname(const char*);
|
||||
const char* get_core_version();
|
||||
const char* get_display_driver();
|
||||
const char* get_chip_model();
|
||||
|
||||
void set_backlight_pin(uint8_t pin) override;
|
||||
void set_backlight_level(uint8_t val) override;
|
||||
|
@ -42,9 +42,9 @@ const char* Esp8266Device::get_core_version()
|
||||
return ESP.getCoreVersion().c_str();
|
||||
}
|
||||
|
||||
const char* Esp8266Device::get_display_driver()
|
||||
const char* Esp8266Device::get_chip_model()
|
||||
{
|
||||
return Utilities::tft_driver_name().c_str();
|
||||
return "ESP8266";
|
||||
}
|
||||
|
||||
void Esp8266Device::set_backlight_pin(uint8_t pin)
|
||||
|
@ -32,7 +32,7 @@ class Esp8266Device : public BaseDevice {
|
||||
const char* get_hostname();
|
||||
void set_hostname(const char*);
|
||||
const char* get_core_version();
|
||||
const char* get_display_driver();
|
||||
const char* get_chip_model();
|
||||
|
||||
void set_backlight_pin(uint8_t pin) override;
|
||||
void set_backlight_level(uint8_t val) override;
|
||||
|
@ -1,6 +1,7 @@
|
||||
#if defined(POSIX)
|
||||
|
||||
#include <cstdint>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "hasp_posix.h"
|
||||
|
||||
@ -10,16 +11,56 @@
|
||||
|
||||
#include "display/monitor.h"
|
||||
|
||||
// extern monitor_t monitor;
|
||||
|
||||
namespace dev {
|
||||
|
||||
PosixDevice::PosixDevice()
|
||||
{
|
||||
struct utsname uts;
|
||||
|
||||
if(uname(&uts) < 0) {
|
||||
LOG_ERROR(0, "uname() error");
|
||||
_hostname = "localhost";
|
||||
_core_version = "unknown";
|
||||
_chip_model = "unknown";
|
||||
} else {
|
||||
// LOG_VERBOSE(0,"Sysname: %s", uts.sysname);
|
||||
// LOG_VERBOSE(0,"Nodename: %s", uts.nodename);
|
||||
// LOG_VERBOSE(0,"Release: %s", uts.release);
|
||||
// LOG_VERBOSE(0,"Version: %s", uts.version);
|
||||
// LOG_VERBOSE(0,"Machine: %s", uts.machine);
|
||||
|
||||
char version[128];
|
||||
snprintf(version, sizeof(version), "%s %s", uts.sysname, uts.release);
|
||||
_core_version = version;
|
||||
_chip_model = uts.machine;
|
||||
_hostname = uts.nodename;
|
||||
}
|
||||
|
||||
_backlight_power = 1;
|
||||
_backlight_level = 100;
|
||||
}
|
||||
|
||||
void PosixDevice::reboot()
|
||||
{}
|
||||
void PosixDevice::show_info()
|
||||
{
|
||||
LOG_VERBOSE(0, F("Processor : %s"), "unknown");
|
||||
LOG_VERBOSE(0, F("CPU freq. : %i MHz"), 0);
|
||||
}
|
||||
struct utsname uts;
|
||||
|
||||
if(uname(&uts) < 0) {
|
||||
LOG_ERROR(0, "uname() error");
|
||||
} else {
|
||||
LOG_VERBOSE(0, "Sysname: %s", uts.sysname);
|
||||
LOG_VERBOSE(0, "Nodename: %s", uts.nodename);
|
||||
LOG_VERBOSE(0, "Release: %s", uts.release);
|
||||
LOG_VERBOSE(0, "Version: %s", uts.version);
|
||||
LOG_VERBOSE(0, "Machine: %s", uts.machine);
|
||||
}
|
||||
|
||||
LOG_VERBOSE(0, "Processor : %s", "unknown");
|
||||
LOG_VERBOSE(0, "CPU freq. : %i MHz", 0);
|
||||
}
|
||||
|
||||
const char* PosixDevice::get_hostname()
|
||||
{
|
||||
@ -28,14 +69,16 @@ const char* PosixDevice::get_hostname()
|
||||
void PosixDevice::set_hostname(const char* hostname)
|
||||
{
|
||||
_hostname = hostname;
|
||||
monitor_title(hostname);
|
||||
// SDL_SetWindowTitle(monitor.window, hostname);
|
||||
}
|
||||
const char* PosixDevice::get_core_version()
|
||||
{
|
||||
return "posix";
|
||||
return _core_version.c_str();
|
||||
}
|
||||
const char* PosixDevice::get_display_driver()
|
||||
const char* PosixDevice::get_chip_model()
|
||||
{
|
||||
return "SDL2";
|
||||
return _chip_model.c_str();
|
||||
}
|
||||
|
||||
void PosixDevice::set_backlight_pin(uint8_t pin)
|
||||
@ -48,8 +91,7 @@ void PosixDevice::set_backlight_level(uint8_t level)
|
||||
uint8_t new_level = level >= 0 ? level : 0;
|
||||
new_level = new_level <= 100 ? new_level : 100;
|
||||
|
||||
if(_backlight_level != new_level)
|
||||
{
|
||||
if(_backlight_level != new_level) {
|
||||
_backlight_level = new_level;
|
||||
update_backlight();
|
||||
}
|
||||
@ -73,7 +115,14 @@ bool PosixDevice::get_backlight_power()
|
||||
|
||||
void PosixDevice::update_backlight()
|
||||
{
|
||||
monitor_backlight(_backlight_power ? map(_backlight_level, 0, 100, 0, 255) : 0);
|
||||
uint8_t level = _backlight_power ? map(_backlight_level, 0, 100, 0, 255) : 0;
|
||||
monitor_backlight(level);
|
||||
// SDL_SetTextureColorMod(monitor.texture, level, level, level);
|
||||
// window_update(&monitor);
|
||||
// monitor.sdl_refr_qry = true;
|
||||
// monitor_sdl_refr(NULL);
|
||||
// const lv_area_t area = {1,1,0,0};
|
||||
// monitor_flush(NULL,&area,NULL);
|
||||
}
|
||||
|
||||
size_t PosixDevice::get_free_max_block()
|
||||
|
@ -6,20 +6,21 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
extern "C"
|
||||
{
|
||||
|
||||
extern "C" {
|
||||
#include <inttypes.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/utsname.h>
|
||||
}
|
||||
|
||||
#include "hasp_conf.h"
|
||||
#include "../device.h"
|
||||
|
||||
#if defined(POSIX)
|
||||
static inline void itoa(int i, char *out, int unused_)
|
||||
static inline void itoa(int i, char* out, int unused_)
|
||||
{
|
||||
(void) unused_;
|
||||
(void)unused_;
|
||||
sprintf(out, "%d", i);
|
||||
}
|
||||
|
||||
@ -28,12 +29,7 @@ namespace dev {
|
||||
class PosixDevice : public BaseDevice {
|
||||
|
||||
public:
|
||||
PosixDevice()
|
||||
{
|
||||
_hostname = "localhost";
|
||||
_backlight_power = 1;
|
||||
_backlight_level = 100;
|
||||
}
|
||||
PosixDevice();
|
||||
|
||||
void reboot() override;
|
||||
void show_info() override;
|
||||
@ -41,7 +37,7 @@ class PosixDevice : public BaseDevice {
|
||||
const char* get_hostname();
|
||||
void set_hostname(const char*);
|
||||
const char* get_core_version();
|
||||
const char* get_display_driver();
|
||||
const char* get_chip_model();
|
||||
|
||||
void set_backlight_pin(uint8_t pin);
|
||||
void set_backlight_level(uint8_t val);
|
||||
@ -58,6 +54,8 @@ class PosixDevice : public BaseDevice {
|
||||
|
||||
private:
|
||||
std::string _hostname;
|
||||
std::string _core_version;
|
||||
std::string _chip_model;
|
||||
|
||||
uint8_t _backlight_pin;
|
||||
uint8_t _backlight_level;
|
||||
|
@ -41,11 +41,6 @@ const char* Stm32f4Device::get_core_version()
|
||||
// return ESP.getCoreVersion().c_str();
|
||||
}
|
||||
|
||||
const char* Stm32f4Device::get_display_driver()
|
||||
{
|
||||
return Utilities::tft_driver_name().c_str();
|
||||
}
|
||||
|
||||
void Stm32f4Device::set_backlight_pin(uint8_t pin)
|
||||
{
|
||||
_backlight_pin = pin;
|
||||
@ -57,6 +52,23 @@ void Stm32f4Device::set_backlight_pin(uint8_t pin)
|
||||
}
|
||||
}
|
||||
|
||||
const char* Stm32f4Device::get_chip_model()
|
||||
{
|
||||
#if defined(STM32F407ZG)
|
||||
return "STM32F407ZG";
|
||||
#elif defined(STM32F407ZE)
|
||||
return "STM32F407ZE";
|
||||
#elif defined(STM32F407VE)
|
||||
return "STM32F407VE";
|
||||
#elif defined(STM32F407VG)
|
||||
return "STM32F407VG";
|
||||
#elif defined(STM32F4xx) || defined(ARDUINO_ARCH_STM32F4)
|
||||
return "STM32F4";
|
||||
#else
|
||||
return "Unknown STM32";
|
||||
#endif
|
||||
}
|
||||
|
||||
void Stm32f4Device::set_backlight_level(uint8_t level)
|
||||
{
|
||||
_backlight_level = level >= 0 ? level : 0;
|
||||
|
@ -32,7 +32,7 @@ class Stm32f4Device : public BaseDevice {
|
||||
const char* get_hostname();
|
||||
void set_hostname(const char*);
|
||||
const char* get_core_version();
|
||||
const char* get_display_driver();
|
||||
const char* get_chip_model();
|
||||
|
||||
void set_backlight_pin(uint8_t pin) override;
|
||||
void set_backlight_level(uint8_t val) override;
|
||||
|
@ -31,7 +31,7 @@ void Win32Device::show_info()
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
eax = 0;
|
||||
native_cpuid(&eax, &ebx, &ecx, &edx);
|
||||
printf("EAX: %08X EBX: %08X ECX: %08X EDX: %08X\n", eax, ebx, ecx, edx);
|
||||
// printf("EAX: %08X EBX: %08X ECX: %08X EDX: %08X\n", eax, ebx, ecx, edx);
|
||||
char vendor[13];
|
||||
memcpy(vendor, &ebx, 4);
|
||||
memcpy(vendor + 4, &edx, 4);
|
||||
@ -49,12 +49,14 @@ const char* Win32Device::get_hostname()
|
||||
void Win32Device::set_hostname(const char* hostname)
|
||||
{
|
||||
_hostname = hostname;
|
||||
monitor_title(hostname);
|
||||
// SDL_SetWindowTitle(monitor.window, hostname);
|
||||
}
|
||||
const char* Win32Device::get_core_version()
|
||||
{
|
||||
return "win32";
|
||||
return _core_version.c_str();
|
||||
}
|
||||
const char* Win32Device::get_display_driver()
|
||||
const char* Win32Device::get_chip_model()
|
||||
{
|
||||
return "SDL2";
|
||||
}
|
||||
@ -93,7 +95,8 @@ bool Win32Device::get_backlight_power()
|
||||
|
||||
void Win32Device::update_backlight()
|
||||
{
|
||||
monitor_backlight(_backlight_power ? map(_backlight_level, 0, 100, 0, 255) : 0);
|
||||
uint8_t level = _backlight_power ? map(_backlight_level, 0, 100, 0, 255) : 0;
|
||||
monitor_backlight(level);
|
||||
}
|
||||
|
||||
size_t Win32Device::get_free_max_block()
|
||||
|
@ -35,6 +35,17 @@ class Win32Device : public BaseDevice {
|
||||
_hostname = "localhost";
|
||||
}
|
||||
|
||||
// Get the Windows version.
|
||||
DWORD dwBuild = 0;
|
||||
DWORD dwVersion = GetVersion();
|
||||
DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
|
||||
DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
|
||||
if(dwVersion < 0x80000000) dwBuild = (DWORD)(HIWORD(dwVersion));
|
||||
|
||||
char version[128];
|
||||
snprintf(version, sizeof(version), "Windows %d.%d-%d", dwMajorVersion, dwMinorVersion, dwBuild);
|
||||
_core_version = version;
|
||||
|
||||
// _backlight_pin = -1;
|
||||
_backlight_power = 1;
|
||||
_backlight_level = 100;
|
||||
@ -46,7 +57,7 @@ class Win32Device : public BaseDevice {
|
||||
const char* get_hostname();
|
||||
void set_hostname(const char*);
|
||||
const char* get_core_version();
|
||||
const char* get_display_driver();
|
||||
const char* get_chip_model();
|
||||
|
||||
void set_backlight_pin(uint8_t pin);
|
||||
void set_backlight_level(uint8_t val);
|
||||
@ -63,6 +74,7 @@ class Win32Device : public BaseDevice {
|
||||
|
||||
private:
|
||||
std::string _hostname;
|
||||
std::string _core_version;
|
||||
|
||||
uint8_t _backlight_pin;
|
||||
uint8_t _backlight_level;
|
||||
|
@ -1,31 +0,0 @@
|
||||
/* MIT License - Copyright (c) 2019-2021 Francis Van Roie
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
|
||||
// #include "hasp_drv_display.h"
|
||||
// #include "tft_espi_drv.h"
|
||||
// //#include "fsmc_ili9341.h"
|
||||
|
||||
// void drv_display_init(lv_disp_drv_t* disp_drv, uint8_t rotation, bool invert_display)
|
||||
// {
|
||||
// /* TFT init */
|
||||
// #if defined(USE_FSMC)
|
||||
// fsmc_ili9341_init(rotation, invert_display);
|
||||
// disp_drv->flush_cb = fsmc_ili9341_flush; // Normal callback when flushing
|
||||
// // xpt2046_init(rotation);
|
||||
// #else
|
||||
// tft_espi_init(rotation, invert_display);
|
||||
// disp_drv->flush_cb = tft_espi_flush; // Normal callback when flushing
|
||||
// #endif
|
||||
// }
|
||||
|
||||
// /* Callback used for screenshots only: */
|
||||
|
||||
// /* indirect callback to flush screenshot data to the screen */
|
||||
// void drv_display_flush_cb(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p)
|
||||
// {
|
||||
// #if defined(USE_FSMC)
|
||||
// fsmc_ili9341_flush(disp, area, color_p);
|
||||
// #else
|
||||
// tft_espi_flush(disp, area, color_p);
|
||||
// #endif
|
||||
// }
|
@ -1,19 +0,0 @@
|
||||
/* MIT License - Copyright (c) 2019-2021 Francis Van Roie
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
|
||||
#if 0 // ndef HASP_DRV_DISPLAY_H
|
||||
#define HASP_DRV_DISPLAY_H
|
||||
|
||||
#include "lvgl.h"
|
||||
|
||||
// Select Display Driver
|
||||
#if defined(USE_FSMC)
|
||||
#include "fsmc_ili9341.h"
|
||||
#else
|
||||
#include "tft_espi_drv.h"
|
||||
#endif
|
||||
|
||||
void drv_display_init(lv_disp_drv_t* disp_drv, uint8_t rotation, bool invert_display);
|
||||
void drv_display_flush_cb(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p);
|
||||
|
||||
#endif
|
@ -75,7 +75,7 @@ static inline bool drv_touchpad_getXY(int16_t* touchX, int16_t* touchY)
|
||||
int16_t normal_x;
|
||||
int16_t normal_y;
|
||||
#if TOUCH_DRIVER == 2046 // XPT2046 Resistive touch panel driver
|
||||
touched = haspTft.tft.getTouch((uint16_t*)&normal_x, (uint16_t*)&normal_y, 20);
|
||||
touched = haspTft.tft.getTouch((uint16_t*)&normal_x, (uint16_t*)&normal_y, 300);
|
||||
|
||||
#elif TOUCH_DRIVER == 0x2046B
|
||||
touched = XPT2046_getXY(&normal_x, &normal_y, true);
|
||||
|
@ -7,6 +7,7 @@
|
||||
#ifdef ARDUINO
|
||||
#include "Arduino.h"
|
||||
#endif
|
||||
|
||||
#include "lvgl.h"
|
||||
|
||||
namespace dev {
|
||||
@ -27,24 +28,28 @@ class BaseTft {
|
||||
{
|
||||
return false;
|
||||
}
|
||||
virtual const char* get_tft_model()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace dev
|
||||
|
||||
#if defined(ESP32)
|
||||
#warning Building for ESP32 Devices
|
||||
#warning Building for ESP32 Tfts
|
||||
#include "tft_driver_tftespi.h"
|
||||
#elif defined(ESP8266)
|
||||
#warning Building for ESP8266 Devices
|
||||
#warning Building for ESP8266 Tfts
|
||||
#include "tft_driver_tftespi.h"
|
||||
#elif defined(STM32F4)
|
||||
#warning Building for STM32F4xx Devices
|
||||
#warning Building for STM32F4xx Tfts
|
||||
#include "tft_driver_tftespi.h"
|
||||
#elif defined(WINDOWS) || defined(POSIX)
|
||||
#warning Building for Win32 Devices
|
||||
#warning Building for SDL2
|
||||
#include "tft_driver_sdl2.h"
|
||||
#else
|
||||
#warning Building for Generic Devices
|
||||
#warning Building for Generic Tfts
|
||||
using dev::BaseTft;
|
||||
extern dev::BaseTft haspTft;
|
||||
#endif
|
||||
|
100
src/drv/tft_driver_sdl2.cpp
Normal file
100
src/drv/tft_driver_sdl2.cpp
Normal file
@ -0,0 +1,100 @@
|
||||
/* MIT License - Copyright (c) 2019-2021 Francis Van Roie
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
|
||||
#if defined(WINDOWS) || defined(POSIX)
|
||||
|
||||
#include "lvgl.h"
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#include "display/monitor.h"
|
||||
#include "indev/mouse.h"
|
||||
|
||||
#include "drv/tft_driver.h"
|
||||
#include "tft_driver_sdl2.h"
|
||||
|
||||
#include "dev/device.h"
|
||||
#include "hasp_debug.h"
|
||||
|
||||
#include "tft_driver_sdl2.h"
|
||||
|
||||
//#include "bootscreen.h" // Sketch tab header for xbm images
|
||||
|
||||
namespace dev {
|
||||
|
||||
/**
|
||||
* A task to measure the elapsed time for LittlevGL
|
||||
* @param data unused
|
||||
* @return never return
|
||||
*/
|
||||
static int tick_thread(void* data)
|
||||
{
|
||||
(void)data;
|
||||
|
||||
while(1) {
|
||||
SDL_Delay(5); /*Sleep for 5 millisecond*/
|
||||
lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TftSdl::init(int w, int h)
|
||||
{
|
||||
|
||||
// Workaround for sdl2 `-m32` crash
|
||||
// https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7
|
||||
#ifndef WIN32
|
||||
setenv("DBUS_FATAL_WARNINGS", "0", 1);
|
||||
#endif
|
||||
|
||||
/* Add a display
|
||||
* Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/
|
||||
monitor_init(MONITOR_HOR_RES, MONITOR_VER_RES);
|
||||
monitor_title(haspDevice.get_hostname());
|
||||
|
||||
/* Add the mouse as input device
|
||||
* Use the 'mouse' driver which reads the PC's mouse*/
|
||||
mouse_init();
|
||||
|
||||
/* Tick init.
|
||||
* You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about how much time were elapsed
|
||||
* Create an SDL thread to do this*/
|
||||
SDL_CreateThread(tick_thread, "tick", NULL);
|
||||
}
|
||||
void TftSdl::show_info()
|
||||
{
|
||||
SDL_version linked;
|
||||
SDL_GetVersion(&linked);
|
||||
LOG_VERBOSE(TAG_TFT, F("Driver : SDL2"));
|
||||
LOG_VERBOSE(TAG_TFT, F("SDL Version: v%d.%d.%d"), linked.major, linked.minor, linked.patch);
|
||||
}
|
||||
|
||||
void TftSdl::splashscreen()
|
||||
{
|
||||
// tft.fillScreen(TFT_DARKCYAN);
|
||||
// int x = (tft.width() - logoWidth) / 2;
|
||||
// int y = (tft.height() - logoHeight) / 2;
|
||||
// tft.drawXBitmap(x, y, bootscreen, logoWidth, logoHeight, TFT_WHITE);
|
||||
}
|
||||
void TftSdl::set_rotation(uint8_t rotation)
|
||||
{}
|
||||
void TftSdl::set_invert(bool invert)
|
||||
{}
|
||||
void TftSdl::flush_pixels(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p)
|
||||
{
|
||||
monitor_flush(disp, area, color_p);
|
||||
}
|
||||
bool TftSdl::is_driver_pin(uint8_t pin)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
const char* TftSdl::get_tft_model()
|
||||
{
|
||||
return "SDL2";
|
||||
}
|
||||
|
||||
} // namespace dev
|
||||
|
||||
dev::TftSdl haspTft;
|
||||
|
||||
#endif // WINDOWS || POSIX
|
@ -1,97 +1,38 @@
|
||||
/* MIT License - Copyright (c) 2019-2021 Francis Van Roie
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
|
||||
#ifndef HASP_SDL2_DRIVER_H
|
||||
#define HASP_SDL2_DRIVER_H
|
||||
|
||||
#include "lvgl.h"
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#include "display/monitor.h"
|
||||
#include "indev/mouse.h"
|
||||
|
||||
#include "tft_driver.h"
|
||||
#include "dev/device.h"
|
||||
#include "hasp_debug.h"
|
||||
|
||||
//#include "bootscreen.h" // Sketch tab header for xbm images
|
||||
#if defined(WINDOWS) || defined(POSIX)
|
||||
#warning Building H driver TFT SDL2
|
||||
|
||||
#include "lvgl.h"
|
||||
#include "indev/mouse.h"
|
||||
|
||||
namespace dev {
|
||||
|
||||
/**
|
||||
* A task to measure the elapsed time for LittlevGL
|
||||
* @param data unused
|
||||
* @return never return
|
||||
*/
|
||||
static int tick_thread(void* data)
|
||||
{
|
||||
(void)data;
|
||||
|
||||
while(1) {
|
||||
SDL_Delay(5); /*Sleep for 5 millisecond*/
|
||||
lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
class TftSdl2 : BaseTft {
|
||||
class TftSdl : BaseTft {
|
||||
public:
|
||||
void init(int w, int h)
|
||||
{
|
||||
void init(int w, int h);
|
||||
void show_info();
|
||||
void splashscreen();
|
||||
|
||||
// Workaround for sdl2 `-m32` crash
|
||||
// https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7
|
||||
#ifndef WIN32
|
||||
setenv("DBUS_FATAL_WARNINGS", "0", 1);
|
||||
#endif
|
||||
void set_rotation(uint8_t rotation);
|
||||
void set_invert(bool invert);
|
||||
|
||||
/* Add a display
|
||||
* Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/
|
||||
monitor_init();
|
||||
monitor_title(haspDevice.get_hostname());
|
||||
void flush_pixels(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p);
|
||||
bool is_driver_pin(uint8_t pin);
|
||||
|
||||
/* Add the mouse as input device
|
||||
* Use the 'mouse' driver which reads the PC's mouse*/
|
||||
mouse_init();
|
||||
|
||||
/* Tick init.
|
||||
* You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about how much time were elapsed
|
||||
* Create an SDL thread to do this*/
|
||||
SDL_CreateThread(tick_thread, "tick", NULL);
|
||||
}
|
||||
void show_info()
|
||||
{
|
||||
SDL_version linked;
|
||||
SDL_GetVersion(&linked);
|
||||
LOG_VERBOSE(TAG_TFT, F("SDL2 : v%d.%d.%d"), linked.major, linked.minor, linked.patch);
|
||||
LOG_VERBOSE(TAG_TFT, F("Driver : SDL2"));
|
||||
}
|
||||
|
||||
void splashscreen()
|
||||
{
|
||||
// tft.fillScreen(TFT_DARKCYAN);
|
||||
// int x = (tft.width() - logoWidth) / 2;
|
||||
// int y = (tft.height() - logoHeight) / 2;
|
||||
// tft.drawXBitmap(x, y, bootscreen, logoWidth, logoHeight, TFT_WHITE);
|
||||
}
|
||||
void set_rotation(uint8_t rotation)
|
||||
{}
|
||||
void set_invert(bool invert)
|
||||
{}
|
||||
static void flush_pixels(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p)
|
||||
{
|
||||
monitor_flush(disp, area, color_p);
|
||||
}
|
||||
bool is_driver_pin(uint8_t pin)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
const char* get_tft_model();
|
||||
};
|
||||
|
||||
} // namespace dev
|
||||
|
||||
using dev::TftSdl2;
|
||||
extern dev::TftSdl2 haspTft;
|
||||
#endif // defined(WINDOWS) || defined(POSIX)
|
||||
|
||||
#endif
|
||||
#endif // HASP_SDL2_DRIVER_H
|
||||
using dev::TftSdl;
|
||||
extern dev::TftSdl haspTft;
|
||||
|
@ -28,7 +28,7 @@ void TftEspi::show_info()
|
||||
|
||||
if(tftSetup.tft_driver != 0xE9D) // For ePaper displays the size is defined in the sketch
|
||||
{
|
||||
LOG_VERBOSE(TAG_TFT, F("Driver : %s"), halDisplayDriverName().c_str()); // tftSetup.tft_driver);
|
||||
LOG_VERBOSE(TAG_TFT, F("Driver : %s"), haspTft.get_tft_model()); // tftSetup.tft_driver);
|
||||
LOG_VERBOSE(TAG_TFT, F("Resolution : %ix%i"), tftSetup.tft_width, tftSetup.tft_height);
|
||||
} else if(tftSetup.tft_driver == 0xE9D)
|
||||
LOG_VERBOSE(TAG_TFT, F("Driver = ePaper"));
|
||||
@ -228,6 +228,42 @@ bool TftEspi::is_driver_pin(uint8_t pin)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* TftEspi::get_tft_model()
|
||||
{
|
||||
#if defined(ILI9341_DRIVER)
|
||||
return "ILI9341";
|
||||
#elif defined(ST7735_DRIVER)
|
||||
return "ST7735";
|
||||
#elif defined(ILI9163_DRIVER)
|
||||
return "ILI9163";
|
||||
#elif defined(S6D02A1_DRIVER)
|
||||
return "S6D02A1";
|
||||
#elif defined(ST7796_DRIVER)
|
||||
return "ST7796";
|
||||
#elif defined(ILI9486_DRIVER)
|
||||
return "ILI9486";
|
||||
#elif defined(ILI9481_DRIVER)
|
||||
return "ILI9481";
|
||||
#elif defined(ILI9488_DRIVER)
|
||||
return "ILI9488";
|
||||
#elif defined(HX8357D_DRIVER)
|
||||
return "HX8357D";
|
||||
#elif defined(EPD_DRIVER)
|
||||
return "EPD";
|
||||
#elif defined(ST7789_DRIVER)
|
||||
return "ST7789";
|
||||
#elif defined(R61581_DRIVER)
|
||||
return "R61581";
|
||||
#elif defined(ST7789_2_DRIVER)
|
||||
return "ST7789_2";
|
||||
#elif defined(RM68140_DRIVER)
|
||||
return "RM68140";
|
||||
#else
|
||||
return "Other";
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace dev
|
||||
|
||||
dev::TftEspi haspTft;
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
#ifdef ARDUINO
|
||||
#include "Arduino.h"
|
||||
#endif
|
||||
|
||||
#include "lvgl.h"
|
||||
#include "TFT_eSPI.h"
|
||||
@ -35,6 +34,8 @@ class TftEspi : BaseTft {
|
||||
void flush_pixels(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p);
|
||||
bool is_driver_pin(uint8_t pin);
|
||||
|
||||
const char* get_tft_model();
|
||||
|
||||
private:
|
||||
void tftOffsetInfo(uint8_t pin, uint8_t x_offset, uint8_t y_offset)
|
||||
{
|
||||
@ -62,4 +63,6 @@ class TftEspi : BaseTft {
|
||||
using dev::TftEspi;
|
||||
extern dev::TftEspi haspTft;
|
||||
|
||||
#endif
|
||||
#endif // ARDUINO
|
||||
|
||||
#endif // HASP_TFTESPI_DRIVER_H
|
@ -6,6 +6,8 @@
|
||||
*********************/
|
||||
#include "hasp_conf.h"
|
||||
|
||||
#if defined(TOUCH_CS)
|
||||
|
||||
#include "hal/hasp_hal.h" // for halGpioName()
|
||||
#include "dev/device.h"
|
||||
#include "drv/tft_driver.h"
|
||||
@ -14,8 +16,6 @@
|
||||
#include "ArduinoLog.h"
|
||||
#include "hasp_macro.h"
|
||||
|
||||
#if defined(TOUCH_CS)
|
||||
|
||||
void tft_espi_calibrate(uint16_t* calData)
|
||||
{
|
||||
haspTft.tft.fillScreen(TFT_BLACK);
|
||||
|
@ -19,11 +19,11 @@ void GT911_setXY(int8_t contacts, GTPoint * points)
|
||||
GT911_num_touches = contacts;
|
||||
GT911_points = points;
|
||||
|
||||
LOG_VERBOSE(TAG_GUI, F("Contacts: %d"), contacts);
|
||||
for(int i = 0; i < contacts; i++) {
|
||||
LOG_VERBOSE(TAG_GUI, F("C%d: #%d %d,%d s:%d"), i, points[i].trackId, points[i].x, points[i].y, points[i].area);
|
||||
yield();
|
||||
}
|
||||
// LOG_VERBOSE(TAG_GUI, F("Contacts: %d"), contacts);
|
||||
// for(int i = 0; i < contacts; i++) {
|
||||
// LOG_VERBOSE(TAG_GUI, F("C%d: #%d %d,%d s:%d"), i, points[i].trackId, points[i].x, points[i].y, points[i].area);
|
||||
// yield();
|
||||
// }
|
||||
}
|
||||
|
||||
// Read touch points from global variable
|
||||
|
2
src/hal/README.md
Normal file
2
src/hal/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
These files need to be obsoleted.
|
||||
The functions should be moved to the respective device ot tft objects.
|
@ -116,16 +116,16 @@ String halGetResetInfo()
|
||||
#endif
|
||||
}
|
||||
|
||||
String halGetCoreVersion()
|
||||
{
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
return String(ESP.getSdkVersion());
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
return String(ESP.getCoreVersion());
|
||||
#else
|
||||
return String(STM32_CORE_VERSION_MAJOR) + "." + STM32_CORE_VERSION_MINOR + "." + STM32_CORE_VERSION_PATCH;
|
||||
#endif
|
||||
}
|
||||
// String halGetCoreVersion()
|
||||
// {
|
||||
// #if defined(ARDUINO_ARCH_ESP32)
|
||||
// return String(ESP.getSdkVersion());
|
||||
// #elif defined(ARDUINO_ARCH_ESP8266)
|
||||
// return String(ESP.getCoreVersion());
|
||||
// #else
|
||||
// return String(STM32_CORE_VERSION_MAJOR) + "." + STM32_CORE_VERSION_MINOR + "." + STM32_CORE_VERSION_PATCH;
|
||||
// #endif
|
||||
// }
|
||||
|
||||
String halGetChipModel()
|
||||
{
|
||||
|
@ -11,11 +11,11 @@ String halGetResetInfo(void);
|
||||
// uint8_t halGetHeapFragmentation(void);
|
||||
// size_t halGetMaxFreeBlock(void);
|
||||
// size_t halGetFreeHeap(void);
|
||||
String halGetCoreVersion(void);
|
||||
String halGetChipModel();
|
||||
// String halGetCoreVersion(void);
|
||||
// String halGetChipModel();
|
||||
String halGetMacAddress(int start, const char* seperator);
|
||||
// uint16_t halGetCpuFreqMHz(void);
|
||||
String halDisplayDriverName(void);
|
||||
// String halDisplayDriverName(void);
|
||||
String halGpioName(uint8_t gpio);
|
||||
|
||||
#endif
|
@ -5,6 +5,12 @@
|
||||
#include "ArduinoLog.h"
|
||||
#endif
|
||||
|
||||
#if defined(WINDOWS) || defined(POSIX)
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#endif
|
||||
|
||||
#include "ArduinoJson.h"
|
||||
|
||||
#if HASP_USE_EEPROM > 0
|
||||
@ -86,8 +92,13 @@ lv_style_t style_mbox_bg; /*Black bg. style with opacity*/
|
||||
lv_obj_t* kb;
|
||||
// lv_font_t * defaultFont;
|
||||
|
||||
<<<<<<< HEAD
|
||||
static lv_font_t* haspFonts[4] = {nullptr, LV_THEME_DEFAULT_FONT_NORMAL, LV_THEME_DEFAULT_FONT_SUBTITLE,
|
||||
LV_THEME_DEFAULT_FONT_TITLE};
|
||||
== == == = lv_obj_t * pages[HASP_NUM_PAGES];
|
||||
static lv_font_t* haspFonts[4] = {nullptr, nullptr, nullptr, nullptr};
|
||||
uint8_t current_page = 1;
|
||||
>>>>>>> 0.4.0-dev
|
||||
|
||||
/**
|
||||
* Get Font ID
|
||||
@ -135,6 +146,12 @@ void hasp_enable_wakeup_touch()
|
||||
lv_obj_set_event_cb(lv_disp_get_layer_sys(NULL), wakeup_event_handler);
|
||||
}
|
||||
|
||||
void hasp_disable_wakeup_touch()
|
||||
{
|
||||
LOG_VERBOSE(TAG_HASP, F("Wakeup touch disabled"));
|
||||
lv_obj_set_click(lv_disp_get_layer_sys(NULL), false); // disable first touch
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the sleep times
|
||||
*/
|
||||
@ -313,19 +330,36 @@ void haspSetup(void)
|
||||
|
||||
/* ********** Font Initializations ********** */
|
||||
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, nullptr);
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, haspFonts[1]);
|
||||
// LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, &robotocondensed_regular_16_nokern);
|
||||
|
||||
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0
|
||||
#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266)
|
||||
|
||||
lv_font_t* hasp_font = nullptr; // required or font init will crash
|
||||
lv_zifont_init();
|
||||
|
||||
if(lv_zifont_font_init(&haspFonts[1], haspZiFontPath, 32) != 0) {
|
||||
// WARNING: hasp_font needs to be null !
|
||||
if(lv_zifont_font_init(&hasp_font, haspZiFontPath, 32) != 0) {
|
||||
LOG_ERROR(TAG_HASP, F("Failed to set font to %s"), haspZiFontPath);
|
||||
haspFonts[1] = LV_FONT_DEFAULT;
|
||||
} else {
|
||||
// defaultFont = haspFonts[0];
|
||||
haspFonts[0] = hasp_font; // save it
|
||||
}
|
||||
|
||||
// LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, robotocondensed_regular_16_nokern);
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, *hasp_font);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if(haspFonts[0] == nullptr) haspFonts[0] = LV_THEME_DEFAULT_FONT_SMALL;
|
||||
// if(haspFonts[1] == nullptr) haspFonts[1] = LV_THEME_DEFAULT_FONT_NORMAL;
|
||||
if(haspFonts[2] == nullptr) haspFonts[2] = LV_THEME_DEFAULT_FONT_SUBTITLE;
|
||||
if(haspFonts[3] == nullptr) haspFonts[3] = LV_THEME_DEFAULT_FONT_TITLE;
|
||||
|
||||
// haspFonts[0] = lv_font_load("E:/font_1.fnt");
|
||||
// haspFonts[2] = lv_font_load("E:/font_2.fnt");
|
||||
// haspFonts[3] = lv_font_load("E:/font_3.fnt");
|
||||
@ -493,6 +527,80 @@ void haspGetVersion(char* version, size_t len)
|
||||
snprintf_P(version, len, PSTR("%u.%u.%u"), HASP_VER_MAJ, HASP_VER_MIN, HASP_VER_REV);
|
||||
}
|
||||
|
||||
void haspClearPage(uint16_t pageid)
|
||||
{
|
||||
lv_obj_t* page = get_page_obj(pageid);
|
||||
if(!page || (pageid > HASP_NUM_PAGES)) {
|
||||
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid);
|
||||
} else if(page == lv_layer_sys() /*|| page == lv_layer_top()*/) {
|
||||
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_LAYER));
|
||||
} else {
|
||||
LOG_TRACE(TAG_HASP, F(D_HASP_CLEAR_PAGE), pageid);
|
||||
lv_obj_clean(page);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t haspGetPage()
|
||||
{
|
||||
return current_page;
|
||||
}
|
||||
|
||||
void haspSetPage(uint8_t pageid)
|
||||
{
|
||||
lv_obj_t* page = get_page_obj(pageid);
|
||||
if(!page || pageid == 0 || pageid > HASP_NUM_PAGES) {
|
||||
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid);
|
||||
} else {
|
||||
LOG_TRACE(TAG_HASP, F(D_HASP_CHANGE_PAGE), pageid);
|
||||
current_page = pageid;
|
||||
lv_scr_load(page);
|
||||
hasp_object_tree(page, pageid, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void haspLoadPage(const char* pagesfile)
|
||||
{
|
||||
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0
|
||||
if(pagesfile[0] == '\0') return;
|
||||
|
||||
if(!filesystemSetup()) {
|
||||
LOG_ERROR(TAG_HASP, F("FS not mounted. Failed to load %s"), pagesfile);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!HASP_FS.exists(pagesfile)) {
|
||||
LOG_ERROR(TAG_HASP, F("Non existing file %s"), pagesfile);
|
||||
return;
|
||||
}
|
||||
|
||||
LOG_TRACE(TAG_HASP, F("Loading file %s"), pagesfile);
|
||||
|
||||
File file = HASP_FS.open(pagesfile, "r");
|
||||
dispatch_parse_jsonl(file);
|
||||
file.close();
|
||||
|
||||
LOG_INFO(TAG_HASP, F("File %s loaded"), pagesfile);
|
||||
#else
|
||||
|
||||
#if HASP_USE_EEPROM > 0
|
||||
LOG_TRACE(TAG_HASP, F("Loading jsonl from EEPROM..."));
|
||||
EepromStream eepromStream(4096, 1024);
|
||||
dispatch_parse_jsonl(eepromStream);
|
||||
LOG_INFO(TAG_HASP, F("Loaded jsonl from EEPROM"));
|
||||
#endif
|
||||
|
||||
std::ifstream ifs("pages.json", std::ifstream::in);
|
||||
if(ifs) {
|
||||
LOG_TRACE(TAG_HASP, F("Loading file %s"), pagesfile);
|
||||
dispatch_parse_jsonl(ifs);
|
||||
LOG_INFO(TAG_HASP, F("File %s loaded"), pagesfile);
|
||||
} else {
|
||||
LOG_ERROR(TAG_HASP, F("Non existing file %s"), pagesfile);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#if HASP_USE_CONFIG > 0
|
||||
bool haspGetConfig(const JsonObject& settings)
|
||||
|
@ -74,6 +74,7 @@ bool hasp_update_sleep_state();
|
||||
void hasp_get_sleep_time(uint16_t& short_time, uint16_t& long_time);
|
||||
void hasp_set_sleep_time(uint16_t short_time, uint16_t long_time);
|
||||
void hasp_enable_wakeup_touch();
|
||||
void hasp_disable_wakeup_touch();
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include "hasplib.h"
|
||||
|
||||
LV_FONT_DECLARE(unscii_8_icon);
|
||||
extern lv_font_t* haspFonts[8];
|
||||
extern const char** btnmatrix_default_map; // memory pointer to lvgl default btnmatrix map
|
||||
|
||||
#if 0
|
||||
@ -454,10 +453,8 @@ static lv_font_t* haspPayloadToFont(const char* payload)
|
||||
uint8_t var = atoi(payload);
|
||||
|
||||
switch(var) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 0 ... 7:
|
||||
// LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, robotocondensed_regular_12_nokern);
|
||||
return hasp_get_font(var);
|
||||
|
||||
case 8:
|
||||
@ -467,22 +464,25 @@ static lv_font_t* haspPayloadToFont(const char* payload)
|
||||
|
||||
#ifdef LV_FONT_CUSTOM_12
|
||||
case 12:
|
||||
return LV_THEME_DEFAULT_FONT_SMALL;
|
||||
return &robotocondensed_regular_12_nokern;
|
||||
#endif
|
||||
|
||||
#ifdef LV_FONT_CUSTOM_16
|
||||
case 16:
|
||||
return LV_THEME_DEFAULT_FONT_NORMAL;
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, robotocondensed_regular_16_nokern);
|
||||
return &robotocondensed_regular_16_nokern;
|
||||
#endif
|
||||
|
||||
#ifdef LV_FONT_CUSTOM_22
|
||||
case 22:
|
||||
return LV_THEME_DEFAULT_FONT_SUBTITLE;
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, robotocondensed_regular_22_nokern);
|
||||
return &robotocondensed_regular_22_nokern;
|
||||
#endif
|
||||
|
||||
#ifdef LV_FONT_CUSTOM_28
|
||||
case 28:
|
||||
return LV_THEME_DEFAULT_FONT_TITLE;
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, robotocondensed_regular_28_nokern);
|
||||
return &robotocondensed_regular_28_nokern;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -885,6 +885,7 @@ static void hasp_local_style_attr(lv_obj_t* obj, const char* attr_p, uint16_t at
|
||||
case ATTR_TEXT_FONT: {
|
||||
lv_font_t* font = haspPayloadToFont(payload);
|
||||
if(font) {
|
||||
LOG_WARNING(TAG_ATTR, "%s %d %x", __FILE__, __LINE__, *font);
|
||||
uint8_t count = 3;
|
||||
if(check_obj_type(obj, LV_HASP_ROLLER)) count = my_roller_get_visible_row_count(obj);
|
||||
lv_obj_set_style_local_text_font(obj, part, state, font);
|
||||
@ -1261,9 +1262,9 @@ static void hasp_process_obj_attribute_txt(lv_obj_t* obj, const char* attr, cons
|
||||
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr);
|
||||
}
|
||||
|
||||
bool hasp_process_obj_attribute_val(lv_obj_t* obj, const char* attr, const char* payload, bool update)
|
||||
bool hasp_process_obj_attribute_val(lv_obj_t* obj, const char* attr, int16_t intval, bool boolval, bool update)
|
||||
{
|
||||
int16_t intval = atoi(payload);
|
||||
// int16_t intval = atoi(payload);
|
||||
|
||||
if(check_obj_type(obj, LV_HASP_BUTTON)) {
|
||||
if(lv_btn_get_checkable(obj)) {
|
||||
@ -1279,11 +1280,10 @@ bool hasp_process_obj_attribute_val(lv_obj_t* obj, const char* attr, const char*
|
||||
return false; // not checkable
|
||||
}
|
||||
} else if(check_obj_type(obj, LV_HASP_CHECKBOX)) {
|
||||
update ? lv_checkbox_set_checked(obj, Utilities::is_true(payload))
|
||||
: hasp_out_int(obj, attr, lv_checkbox_is_checked(obj));
|
||||
update ? lv_checkbox_set_checked(obj, boolval) : hasp_out_int(obj, attr, lv_checkbox_is_checked(obj));
|
||||
} else if(check_obj_type(obj, LV_HASP_SWITCH)) {
|
||||
if(update)
|
||||
Utilities::is_true(payload) ? lv_switch_on(obj, LV_ANIM_ON) : lv_switch_off(obj, LV_ANIM_ON);
|
||||
boolval ? lv_switch_on(obj, LV_ANIM_ON) : lv_switch_off(obj, LV_ANIM_ON);
|
||||
else
|
||||
hasp_out_int(obj, attr, lv_switch_get_state(obj));
|
||||
} else if(check_obj_type(obj, LV_HASP_DROPDOWN)) {
|
||||
@ -1415,12 +1415,14 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
|
||||
: hasp_out_int(obj, attr, obj->user_data.transitionid);
|
||||
break; // attribute_found
|
||||
|
||||
case ATTR_OBJ:
|
||||
if(update) LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_READ_ONLY), attr_p);
|
||||
hasp_out_str(obj, attr, get_obj_type_name(obj));
|
||||
break; // attribute_found
|
||||
|
||||
case ATTR_OBJID:
|
||||
if(update) {
|
||||
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_READ_ONLY), attr_p);
|
||||
} else {
|
||||
hasp_out_int(obj, attr, obj->user_data.objid);
|
||||
}
|
||||
if(update) LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_READ_ONLY), attr_p);
|
||||
hasp_out_int(obj, attr, obj->user_data.objid);
|
||||
break; // attribute_found
|
||||
|
||||
case ATTR_X:
|
||||
@ -1489,7 +1491,8 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
|
||||
break; // attribute_found
|
||||
|
||||
case ATTR_VAL:
|
||||
if(!hasp_process_obj_attribute_val(obj, attr, payload, update)) goto attribute_not_found;
|
||||
if(!hasp_process_obj_attribute_val(obj, attr, atoi(payload), Utilities::is_true(payload), update))
|
||||
goto attribute_not_found;
|
||||
break; // attribute_found
|
||||
|
||||
case ATTR_MIN:
|
||||
|
@ -25,7 +25,7 @@ void my_btnmatrix_map_clear(lv_obj_t* obj);
|
||||
void line_clear_points(lv_obj_t* obj);
|
||||
|
||||
void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* payload, bool update);
|
||||
bool hasp_process_obj_attribute_val(lv_obj_t* obj, const char* attr, const char* payload, bool update);
|
||||
bool hasp_process_obj_attribute_val(lv_obj_t* obj, const char* attr, int16_t intval, bool booval, bool update);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
@ -316,5 +316,6 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t)
|
||||
#define ATTR_TRANSITION 10933
|
||||
#define ATTR_GROUPID 48986
|
||||
#define ATTR_OBJID 41010
|
||||
#define ATTR_OBJ 53623
|
||||
|
||||
#endif
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "hasplib.h"
|
||||
|
||||
#include "dev/device.h"
|
||||
#include "drv/tft_driver.h"
|
||||
|
||||
//#include "hasp_gui.h"
|
||||
|
||||
@ -43,7 +44,7 @@ dispatch_conf_t dispatch_setings = {.teleperiod = 10};
|
||||
|
||||
uint32_t dispatchLastMillis;
|
||||
uint8_t nCommands = 0;
|
||||
haspCommand_t commands[17];
|
||||
haspCommand_t commands[18];
|
||||
|
||||
struct moodlight_t
|
||||
{
|
||||
@ -249,8 +250,13 @@ void dispatch_command(const char* topic, const char* payload)
|
||||
/* =============================== Not standard payload commands ===================================== */
|
||||
|
||||
if(strlen(topic) == 7 && topic == strstr_P(topic, PSTR("output"))) {
|
||||
int16_t state = atoi(payload);
|
||||
dispatch_normalized_group_value(atoi(topic + 6), state, NULL); // + 6 => trim 'output' from the topic
|
||||
|
||||
if(strlen(payload) == 0) {
|
||||
// reply state
|
||||
} else {
|
||||
int16_t state = atoi(payload);
|
||||
dispatch_normalized_group_value(atoi(topic + 6), NULL, state, 0, 1); // + 6 => trim 'output' from the topic
|
||||
}
|
||||
|
||||
// } else if(strcasecmp_P(topic, PSTR("screenshot")) == 0) {
|
||||
// guiTakeScreenshot("/screenshot.bmp"); // Literal String
|
||||
@ -269,7 +275,7 @@ void dispatch_command(const char* topic, const char* payload)
|
||||
|
||||
#if HASP_USE_MQTT > 0
|
||||
} else if(!strcmp_P(topic, PSTR("mqtthost")) || !strcmp_P(topic, PSTR("mqttport")) ||
|
||||
!strcmp_P(topic, PSTR("mqttport")) || !strcmp_P(topic, PSTR("mqttuser")) ||
|
||||
!strcmp_P(topic, PSTR("mqttuser")) || !strcmp_P(topic, PSTR("mqttpass")) ||
|
||||
!strcmp_P(topic, PSTR("hostname"))) {
|
||||
// char item[5];
|
||||
// memset(item, 0, sizeof(item));
|
||||
@ -664,7 +670,7 @@ static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const
|
||||
// if(groupid >= 0) {
|
||||
// bool state = dispatch_get_event_state(eventid);
|
||||
// gpio_set_group_onoff(groupid, state);
|
||||
// object_set_group_state(groupid, eventid, obj);
|
||||
// object_set_normalized_group_value(groupid, eventid, obj);
|
||||
// }
|
||||
|
||||
// char payload[8];
|
||||
@ -676,22 +682,22 @@ static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const
|
||||
// {
|
||||
// if(groupid >= 0) {
|
||||
// gpio_set_group_value(groupid, state);
|
||||
// object_set_group_state(groupid, state, obj);
|
||||
// object_set_normalized_group_value(groupid, state, obj);
|
||||
// }
|
||||
|
||||
// char payload[8];
|
||||
// // dispatch_output_group_state(groupid, payload);
|
||||
// }
|
||||
|
||||
void dispatch_normalized_group_value(uint8_t groupid, uint16_t value, lv_obj_t* obj)
|
||||
void dispatch_normalized_group_value(uint8_t groupid, lv_obj_t* obj, int16_t val, int16_t min, int16_t max)
|
||||
{
|
||||
if(groupid > 0) {
|
||||
LOG_VERBOSE(TAG_MSGR, F("GROUP %d value %d"), groupid, value);
|
||||
if(groupid == 0) return;
|
||||
|
||||
LOG_VERBOSE(TAG_MSGR, F("GROUP %d value %d (%d-%d)"), groupid, val, min, max);
|
||||
#if HASP_USE_GPIO > 0
|
||||
gpio_set_normalized_group_value(groupid, value);
|
||||
gpio_set_normalized_group_value(groupid, val, min, max); // Update GPIO states
|
||||
#endif
|
||||
// object_set_group_state(groupid, value, obj);
|
||||
}
|
||||
object_set_normalized_group_value(groupid, obj, val, min, max); // Update onsreen objects
|
||||
}
|
||||
|
||||
/********************************************** Native Commands ****************************************/
|
||||
@ -767,7 +773,7 @@ void dispatch_parse_json(const char*, const char* payload)
|
||||
#ifdef ARDUINO
|
||||
void dispatch_parse_jsonl(Stream& stream)
|
||||
#else
|
||||
void dispatch_parse_jsonl(std::istringstream& stream)
|
||||
void dispatch_parse_jsonl(std::istream& stream)
|
||||
#endif
|
||||
{
|
||||
uint8_t savedPage = haspPages.get();
|
||||
@ -960,7 +966,17 @@ void dispatch_moodlight(const char* topic, const char* payload)
|
||||
void dispatch_backlight(const char*, const char* payload)
|
||||
{
|
||||
// Set the current state
|
||||
if(strlen(payload) != 0) haspDevice.set_backlight_power(Utilities::is_true(payload));
|
||||
if(strlen(payload) != 0) {
|
||||
bool power = Utilities::is_true(payload);
|
||||
|
||||
if(haspDevice.get_backlight_power() != power) {
|
||||
haspDevice.set_backlight_power(power);
|
||||
if(power)
|
||||
hasp_disable_wakeup_touch();
|
||||
else
|
||||
hasp_enable_wakeup_touch();
|
||||
}
|
||||
}
|
||||
|
||||
// Return the current state
|
||||
char topic[8];
|
||||
@ -1048,7 +1064,7 @@ void dispatch_output_statusupdate(const char*, const char*)
|
||||
#endif
|
||||
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("\"tftDriver\":\"%s\",\"tftWidth\":%u,\"tftHeight\":%u}"),
|
||||
Utilities::tft_driver_name().c_str(), (TFT_WIDTH), (TFT_HEIGHT));
|
||||
haspTft.get_tft_model(), (TFT_WIDTH), (TFT_HEIGHT));
|
||||
strcat(data, buffer);
|
||||
}
|
||||
|
||||
@ -1075,6 +1091,12 @@ void dispatch_calibrate(const char* topic = NULL, const char* payload = NULL)
|
||||
void dispatch_wakeup(const char*, const char*)
|
||||
{
|
||||
lv_disp_trig_activity(NULL);
|
||||
hasp_disable_wakeup_touch();
|
||||
}
|
||||
|
||||
void dispatch_sleep(const char*, const char*)
|
||||
{
|
||||
hasp_enable_wakeup_touch();
|
||||
}
|
||||
|
||||
void dispatch_reboot(const char*, const char*)
|
||||
@ -1113,6 +1135,7 @@ void dispatchSetup()
|
||||
dispatch_add_command(PSTR("json"), dispatch_parse_json);
|
||||
dispatch_add_command(PSTR("page"), dispatch_page);
|
||||
dispatch_add_command(PSTR("wakeup"), dispatch_wakeup);
|
||||
dispatch_add_command(PSTR("sleep"), dispatch_sleep);
|
||||
dispatch_add_command(PSTR("statusupdate"), dispatch_output_statusupdate);
|
||||
dispatch_add_command(PSTR("clearpage"), dispatch_clear_page);
|
||||
dispatch_add_command(PSTR("jsonl"), dispatch_parse_jsonl);
|
||||
|
@ -41,7 +41,7 @@ void dispatch_text_line(const char* cmnd);
|
||||
#ifdef ARDUINO
|
||||
void dispatch_parse_jsonl(Stream& stream);
|
||||
#else
|
||||
void dispatch_parse_jsonl(std::istringstream& stream);
|
||||
void dispatch_parse_jsonl(std::istream& stream);
|
||||
#endif
|
||||
|
||||
void dispatch_clear_page(const char* page);
|
||||
@ -54,9 +54,9 @@ void dispatch_page_prev(lv_scr_load_anim_t effectid);
|
||||
void dispatch_page_back(lv_scr_load_anim_t effectid);
|
||||
|
||||
void dispatch_dim(const char* level);
|
||||
void dispatch_backlight(const char* payload);
|
||||
void dispatch_backlight(const char*, const char* payload);
|
||||
|
||||
void dispatch_web_update(const char* espOtaUrl);
|
||||
void dispatch_web_update(const char*, const char* espOtaUrl);
|
||||
void dispatch_reboot(bool saveConfig);
|
||||
|
||||
void dispatch_output_idle_state(uint8_t state);
|
||||
@ -68,7 +68,7 @@ bool dispatch_get_event_state(uint8_t eventid);
|
||||
void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size);
|
||||
void dispatch_object_value_changed(lv_obj_t* obj, int16_t state);
|
||||
|
||||
void dispatch_normalized_group_value(uint8_t groupid, uint16_t value, lv_obj_t* obj);
|
||||
void dispatch_normalized_group_value(uint8_t groupid, lv_obj_t* obj, int16_t val, int16_t min, int16_t max);
|
||||
|
||||
void dispatch_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char* attribute, const char* data);
|
||||
void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char* attribute, int32_t val);
|
||||
|
@ -152,6 +152,20 @@ bool hasp_find_id_from_obj(lv_obj_t* obj, uint8_t* pageid, uint8_t* objid)
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* Get the object type name of an object
|
||||
* @param obj an lv_obj_t* of the object to check its type
|
||||
* @return name of the object type
|
||||
* @note
|
||||
*/
|
||||
const char* get_obj_type_name(lv_obj_t* obj)
|
||||
{
|
||||
lv_obj_type_t list;
|
||||
lv_obj_get_type(obj, &list);
|
||||
const char* objtype = list.type[0];
|
||||
return objtype + 3; // skip lv_
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an lvgl objecttype name corresponds to a given HASP object ID
|
||||
* @param obj an lv_obj_t* of the object to check its type
|
||||
@ -276,12 +290,12 @@ void hasp_send_obj_attribute_color(lv_obj_t* obj, const char* attribute, lv_colo
|
||||
*/
|
||||
void wakeup_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
{
|
||||
if(obj == lv_disp_get_layer_sys(NULL)) {
|
||||
if(event == LV_EVENT_RELEASED && obj == lv_disp_get_layer_sys(NULL)) {
|
||||
hasp_update_sleep_state(); // wakeup?
|
||||
|
||||
if(event == LV_EVENT_CLICKED) {
|
||||
lv_obj_set_click(obj, false); // disable first touch
|
||||
LOG_VERBOSE(TAG_HASP, F("Wakeup touch disabled"));
|
||||
if(!haspDevice.get_backlight_power())
|
||||
dispatch_backlight(NULL, "1"); // backlight on and also disable wakeup touch
|
||||
else {
|
||||
hasp_disable_wakeup_touch(); // only disable wakeup touch
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -350,6 +364,7 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
return;
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
hasp_update_sleep_state(); // wakeup?
|
||||
|
||||
/* If an actionid is attached, perform that action on UP event only */
|
||||
@ -363,6 +378,11 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
dispatch_object_generic_event(obj, eventid); // send object event
|
||||
}
|
||||
dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(dispatch_get_event_state(eventid), 0, 1), obj);
|
||||
== == == = hasp_update_sleep_state(); // wakeup?
|
||||
dispatch_object_generic_event(obj, eventid); // send object event
|
||||
dispatch_normalized_group_value(obj->user_data.groupid, obj, dispatch_get_event_state(eventid), HASP_EVENT_OFF,
|
||||
HASP_EVENT_ON);
|
||||
>>>>>>> 0.4.0-dev
|
||||
}
|
||||
|
||||
/**
|
||||
@ -400,7 +420,7 @@ void toggle_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
|
||||
hasp_update_sleep_state(); // wakeup?
|
||||
dispatch_object_toggle_event(obj, val);
|
||||
dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, 1), obj);
|
||||
dispatch_normalized_group_value(obj->user_data.groupid, obj, val, HASP_EVENT_OFF, HASP_EVENT_ON);
|
||||
|
||||
} else if(event == LV_EVENT_DELETE) {
|
||||
LOG_VERBOSE(TAG_HASP, F(D_OBJECT_DELETED));
|
||||
@ -464,7 +484,7 @@ static void selector_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
// hasp_send_obj_attribute_str(obj, property, buffer);
|
||||
|
||||
dispatch_object_selection_changed(obj, val, buffer);
|
||||
if(max > 0) dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, max), obj);
|
||||
if(max > 0) dispatch_normalized_group_value(obj->user_data.groupid, obj, val, 0, max);
|
||||
|
||||
} else if(event == LV_EVENT_DELETE) {
|
||||
LOG_VERBOSE(TAG_HASP, F(D_OBJECT_DELETED));
|
||||
@ -510,7 +530,7 @@ void slider_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
return;
|
||||
}
|
||||
dispatch_object_value_changed(obj, val);
|
||||
dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, min, max), obj);
|
||||
dispatch_normalized_group_value(obj->user_data.groupid, obj, val, min, max);
|
||||
|
||||
} else if(event == LV_EVENT_DELETE) {
|
||||
LOG_VERBOSE(TAG_HASP, F(D_OBJECT_DELETED));
|
||||
@ -541,24 +561,7 @@ static void cpicker_event_handler(lv_obj_t* obj, lv_event_t event)
|
||||
|
||||
// ##################### State Changers ########################################################
|
||||
|
||||
// TODO make this a recursive function that goes over all objects only ONCE
|
||||
void object_set_group_state(uint8_t groupid, uint8_t eventid, lv_obj_t* src_obj)
|
||||
{
|
||||
if(groupid == 0) return;
|
||||
bool state = dispatch_get_event_state(eventid);
|
||||
|
||||
for(uint8_t page = 0; page < HASP_NUM_PAGES; page++) {
|
||||
uint8_t startid = 1;
|
||||
for(uint8_t objid = startid; objid < 20; objid++) {
|
||||
lv_obj_t* obj = hasp_find_obj_from_parent_id(haspPages.get_obj(page), objid);
|
||||
if(obj && obj != src_obj && obj->user_data.groupid == groupid) { // skip source object, if set
|
||||
lv_obj_set_state(obj, state ? LV_STATE_PRESSED | LV_STATE_CHECKED : LV_STATE_DEFAULT);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void object_set_group_value(lv_obj_t* parent, uint8_t groupid, const char* payload)
|
||||
void object_set_group_value(lv_obj_t* parent, uint8_t groupid, int16_t intval)
|
||||
{
|
||||
if(groupid == 0 || parent == nullptr) return;
|
||||
|
||||
@ -566,10 +569,10 @@ void object_set_group_value(lv_obj_t* parent, uint8_t groupid, const char* paylo
|
||||
child = lv_obj_get_child(parent, NULL);
|
||||
while(child) {
|
||||
/* child found, update it */
|
||||
if(groupid == child->user_data.groupid) hasp_process_obj_attribute_val(child, NULL, payload, true);
|
||||
if(groupid == child->user_data.groupid) hasp_process_obj_attribute_val(child, NULL, intval, intval, true);
|
||||
|
||||
/* update grandchildren */
|
||||
object_set_group_value(child, groupid, payload);
|
||||
object_set_group_value(child, groupid, intval);
|
||||
|
||||
/* check tabs */
|
||||
if(check_obj_type(child, LV_HASP_TABVIEW)) {
|
||||
@ -579,10 +582,10 @@ void object_set_group_value(lv_obj_t* parent, uint8_t groupid, const char* paylo
|
||||
lv_obj_t* tab = lv_tabview_get_tab(child, i);
|
||||
LOG_VERBOSE(TAG_HASP, F("Found tab %i"), i);
|
||||
if(tab->user_data.groupid && groupid == tab->user_data.groupid)
|
||||
hasp_process_obj_attribute_val(tab, NULL, payload, true); /* tab found, update it */
|
||||
hasp_process_obj_attribute_val(tab, NULL, intval, intval, true); /* tab found, update it */
|
||||
|
||||
/* check grandchildren */
|
||||
object_set_group_value(tab, groupid, payload);
|
||||
object_set_group_value(tab, groupid, intval);
|
||||
}
|
||||
//#endif
|
||||
}
|
||||
@ -592,10 +595,30 @@ void object_set_group_value(lv_obj_t* parent, uint8_t groupid, const char* paylo
|
||||
}
|
||||
}
|
||||
|
||||
void object_set_group_value(uint8_t groupid, int16_t state)
|
||||
// TODO make this a recursive function that goes over all objects only ONCE
|
||||
void object_set_normalized_group_value(uint8_t groupid, lv_obj_t* src_obj, int16_t val, int16_t min, int16_t max)
|
||||
{
|
||||
char payload[16];
|
||||
itoa(state, payload, DEC);
|
||||
if(groupid == 0) return;
|
||||
if(min == max) return;
|
||||
|
||||
for(uint8_t page = 0; page < HASP_NUM_PAGES; page++) {
|
||||
object_set_group_value(get_page_obj(page), groupid, val);
|
||||
// uint8_t startid = 1;
|
||||
// for(uint8_t objid = startid; objid < 20; objid++) {
|
||||
// lv_obj_t* obj = hasp_find_obj_from_parent_id(get_page_obj(page), objid);
|
||||
// if(obj && obj != src_obj && obj->user_data.groupid == groupid) { // skip source object, if set
|
||||
// LOG_VERBOSE(TAG_HASP, F("Found p%db%d in group %d"), page, objid, groupid);
|
||||
// lv_obj_set_state(obj, val > 0 ? LV_STATE_PRESSED | LV_STATE_CHECKED : LV_STATE_DEFAULT);
|
||||
// switch(obj->user_data.objid) {
|
||||
// case HASP_OBJ_ARC:
|
||||
// case HASP_OBJ_SLIDER:
|
||||
// case HASP_OBJ_CHECKBOX:
|
||||
// hasp_process_obj_attribute_val();
|
||||
// default:
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -66,6 +66,7 @@ lv_obj_t* hasp_find_obj_from_parent_id(lv_obj_t* parent, uint8_t objid);
|
||||
// lv_obj_t * hasp_find_obj_from_page_id(uint8_t pageid, uint8_t objid);
|
||||
bool hasp_find_id_from_obj(lv_obj_t* obj, uint8_t* pageid, uint8_t* objid);
|
||||
// bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype);
|
||||
const char* get_obj_type_name(lv_obj_t* obj);
|
||||
bool check_obj_type(lv_obj_t* obj, lv_hasp_obj_type_t haspobjtype);
|
||||
void hasp_object_tree(lv_obj_t* parent, uint8_t pageid, uint16_t level);
|
||||
void hasp_object_delete(lv_obj_t* obj);
|
||||
@ -75,7 +76,7 @@ void hasp_send_obj_attribute_int(lv_obj_t* obj, const char* attribute, int32_t v
|
||||
void hasp_send_obj_attribute_color(lv_obj_t* obj, const char* attribute, lv_color_t color);
|
||||
void hasp_process_attribute(uint8_t pageid, uint8_t objid, const char* attr, const char* payload);
|
||||
|
||||
void object_set_group_state(uint8_t groupid, uint8_t eventid, lv_obj_t* src_obj);
|
||||
void object_set_normalized_group_value(uint8_t groupid, lv_obj_t* src_obj, int16_t val, int16_t min, int16_t max);
|
||||
|
||||
void generic_event_handler(lv_obj_t* obj, lv_event_t event);
|
||||
void toggle_event_handler(lv_obj_t* obj, lv_event_t event);
|
||||
|
@ -54,41 +54,6 @@ int Utilities::format_bytes(size_t filesize, char* buf, size_t len)
|
||||
return snprintf_P(buf, len, PSTR("%d.%d %ciB"), filesize / 10, filesize % 10, labels[unit]);
|
||||
}
|
||||
|
||||
std::string Utilities::tft_driver_name()
|
||||
{
|
||||
#if defined(ILI9341_DRIVER)
|
||||
return "ILI9341";
|
||||
#elif defined(ST7735_DRIVER)
|
||||
return "ST7735";
|
||||
#elif defined(ILI9163_DRIVER)
|
||||
return "ILI9163";
|
||||
#elif defined(S6D02A1_DRIVER)
|
||||
return "S6D02A1";
|
||||
#elif defined(ST7796_DRIVER)
|
||||
return "ST7796";
|
||||
#elif defined(ILI9486_DRIVER)
|
||||
return "ILI9486";
|
||||
#elif defined(ILI9481_DRIVER)
|
||||
return "ILI9481";
|
||||
#elif defined(ILI9488_DRIVER)
|
||||
return "ILI9488";
|
||||
#elif defined(HX8357D_DRIVER)
|
||||
return "HX8357D";
|
||||
#elif defined(EPD_DRIVER)
|
||||
return "EPD";
|
||||
#elif defined(ST7789_DRIVER)
|
||||
return "ST7789";
|
||||
#elif defined(R61581_DRIVER)
|
||||
return "R61581";
|
||||
#elif defined(ST7789_2_DRIVER)
|
||||
return "ST7789_2";
|
||||
#elif defined(RM68140_DRIVER)
|
||||
return "RM68140";
|
||||
#else
|
||||
return "Other";
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef ARDUINO
|
||||
long map(long x, long in_min, long in_max, long out_min, long out_max)
|
||||
{
|
||||
|
@ -13,7 +13,6 @@ class Utilities {
|
||||
static bool is_true(const char* s);
|
||||
static bool is_only_digits(const char* s);
|
||||
static int format_bytes(size_t filesize, char* buf, size_t len);
|
||||
static std::string tft_driver_name();
|
||||
};
|
||||
|
||||
#ifndef ARDUINO
|
||||
|
@ -15,13 +15,15 @@
|
||||
#include "src/lv_misc/lv_gc.h"
|
||||
|
||||
#if defined(LV_GC_INCLUDE)
|
||||
#include LV_GC_INCLUDE
|
||||
#include LV_GC_INCLUDE
|
||||
#endif /* LV_ENABLE_GC */
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
#define HASP_DPX(n) hasp_dpx(n)
|
||||
|
||||
/*SCREEN*/
|
||||
|
||||
#define COLOR_SCR (IS_LIGHT ? LV_COLOR_WHITE : lv_color_hex(0x545b6a))
|
||||
@ -60,10 +62,10 @@
|
||||
#define COLOR_BG_BORDER_CHK_PR (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0x5f656e))
|
||||
#define COLOR_BG_BORDER_DIS (IS_LIGHT ? lv_color_hex(0xd6dde3) : lv_color_hex(0x5f656e))
|
||||
|
||||
#define COLOR_BG_TEXT (IS_LIGHT ? lv_color_hex(0xeeeeee) : lv_color_hex(0xeeeeee))
|
||||
#define COLOR_BG_TEXT_PR (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0xffffff))
|
||||
#define COLOR_BG_TEXT_CHK (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0xffffff))
|
||||
#define COLOR_BG_TEXT_CHK_PR (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0xffffff))
|
||||
#define COLOR_BG_TEXT lv_color_hex(0xeeeeee)
|
||||
#define COLOR_BG_TEXT_PR LV_COLOR_WHITE
|
||||
#define COLOR_BG_TEXT_CHK LV_COLOR_WHITE
|
||||
#define COLOR_BG_TEXT_CHK_PR LV_COLOR_WHITE
|
||||
#define COLOR_BG_TEXT_DIS (IS_LIGHT ? lv_color_hex3(0xaaa) : lv_color_hex3(0x999))
|
||||
|
||||
/*SECONDARY BACKGROUND*/
|
||||
@ -74,15 +76,15 @@
|
||||
#define COLOR_BG_SEC_TEXT_DIS (IS_LIGHT ? lv_color_hex(0xaaaaaa) : lv_color_hex(0xa5a8ad))
|
||||
|
||||
#define TRANSITION_TIME 0 /*((theme.flags & LV_THEME_HASP_FLAG_NO_TRANSITION) ? 0 : 150)*/
|
||||
#define BORDER_WIDTH LV_DPX(2)
|
||||
#define BORDER_WIDTH HASP_DPX(2)
|
||||
#define BORDER_COLOR ((theme.flags & IS_LIGHT) ? lv_color_make(0x40, 0x40, 0x40) : lv_color_make(0xb0, 0xb0, 0xb0))
|
||||
#define OUTLINE_WIDTH ((theme.flags & LV_THEME_HASP_FLAG_NO_FOCUS) ? 0 : LV_DPX(3))
|
||||
#define OUTLINE_WIDTH ((theme.flags & LV_THEME_HASP_FLAG_NO_FOCUS) ? 0 : HASP_DPX(3))
|
||||
#define OUTLINE_COLOR ((theme.flags & LV_THEME_HASP_FLAG_NO_FOCUS) ? BORDER_COLOR : theme.color_secondary)
|
||||
|
||||
#define IS_LIGHT (theme.flags & LV_THEME_HASP_FLAG_LIGHT)
|
||||
#define NO_FOCUS (theme.flags & LV_THEME_HASP_FLAG_NO_FOCUS)
|
||||
|
||||
#define PAD_DEF (lv_disp_get_size_category(NULL) <= LV_DISP_SIZE_MEDIUM ? LV_DPX(15) : (LV_DPX(30)))
|
||||
#define PAD_DEF (lv_disp_get_size_category(NULL) <= LV_DISP_SIZE_MEDIUM ? HASP_DPX(15) : (HASP_DPX(30)))
|
||||
|
||||
/*SCROLLBAR*/
|
||||
#define SCROLLBAR_COLOR \
|
||||
@ -162,9 +164,9 @@ typedef struct
|
||||
|
||||
#if LV_USE_PAGE
|
||||
lv_style_t sb;
|
||||
#if LV_USE_ANIMATION
|
||||
#if LV_USE_ANIMATION
|
||||
lv_style_t edge_flash;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LV_USE_SLIDER
|
||||
@ -196,14 +198,14 @@ typedef struct
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name);
|
||||
static void style_init_reset(lv_style_t * style);
|
||||
static void theme_apply(lv_theme_t* th, lv_obj_t* obj, lv_theme_style_t name);
|
||||
static void style_init_reset(lv_style_t* style);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_theme_t theme;
|
||||
static theme_styles_t * styles;
|
||||
static theme_styles_t* styles;
|
||||
|
||||
static bool inited;
|
||||
|
||||
@ -215,18 +217,25 @@ static bool inited;
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void basic_init(void)
|
||||
static lv_style_int_t hasp_dpx(lv_style_int_t n)
|
||||
{
|
||||
return (n == 0 ? 0 : LV_MATH_MAX(((LV_DPI * (n) + 80) / 160), 1)); /*+80 for rounding*/
|
||||
}
|
||||
|
||||
static void basic_init(lv_style_int_t border_width, lv_style_int_t outline_width, lv_color_t value_color,
|
||||
lv_color_t color_scr_text)
|
||||
{
|
||||
sizeof(lv_style_t);
|
||||
|
||||
// Objects with transparent background, like Checkbox, container
|
||||
style_init_reset(&styles->transparent);
|
||||
lv_style_set_bg_opa(&styles->transparent, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_border_opa(&styles->transparent, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_outline_opa(&styles->transparent, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_value_color(&styles->transparent, LV_STATE_DEFAULT, COLOR_SCR_TEXT);
|
||||
lv_style_set_value_color(&styles->transparent, LV_STATE_DEFAULT, color_scr_text);
|
||||
lv_style_set_value_font(&styles->transparent, LV_STATE_DEFAULT, theme.font_subtitle);
|
||||
|
||||
if(!NO_FOCUS) lv_style_set_outline_width(&styles->transparent, LV_STATE_DEFAULT, OUTLINE_WIDTH);
|
||||
if(!NO_FOCUS) lv_style_set_outline_width(&styles->transparent, LV_STATE_DEFAULT, outline_width);
|
||||
|
||||
// Background gradient
|
||||
style_init_reset(&styles->pretty);
|
||||
@ -244,22 +253,22 @@ static void basic_init(void)
|
||||
lv_style_set_scale_end_line_width(&styles->pretty, LV_STATE_DEFAULT, 1);
|
||||
lv_style_set_scale_end_color(&styles->pretty, LV_STATE_DEFAULT, theme.color_primary);
|
||||
|
||||
lv_style_set_text_color(&styles->pretty, LV_STATE_DEFAULT, COLOR_SCR_TEXT);
|
||||
//lv_style_set_text_font(&styles->pretty, LV_STATE_DEFAULT, theme.font_normal);
|
||||
lv_style_set_text_color(&styles->pretty, LV_STATE_DEFAULT, color_scr_text);
|
||||
// lv_style_set_text_font(&styles->pretty, LV_STATE_DEFAULT, theme.font_normal);
|
||||
|
||||
lv_style_set_value_color(&styles->pretty, LV_STATE_DEFAULT, COLOR_SCR_TEXT);
|
||||
lv_style_set_value_color(&styles->pretty, LV_STATE_DEFAULT, color_scr_text);
|
||||
lv_style_set_value_font(&styles->pretty, LV_STATE_DEFAULT, theme.font_subtitle);
|
||||
|
||||
lv_style_set_border_opa(&styles->pretty, LV_STATE_DEFAULT, LV_OPA_30);
|
||||
lv_style_set_border_width(&styles->pretty, LV_STATE_DEFAULT, BORDER_WIDTH);
|
||||
lv_style_set_border_width(&styles->pretty, LV_STATE_DEFAULT, border_width);
|
||||
lv_style_set_border_color(&styles->pretty, LV_STATE_DEFAULT, BORDER_COLOR);
|
||||
lv_style_set_border_color(&styles->pretty, LV_STATE_EDITED, lv_color_darken(theme.color_secondary, LV_OPA_30));
|
||||
|
||||
lv_style_set_outline_width(&styles->pretty, LV_STATE_DEFAULT, OUTLINE_WIDTH);
|
||||
lv_style_set_outline_width(&styles->pretty, LV_STATE_DEFAULT, outline_width);
|
||||
|
||||
if(!NO_FOCUS) {
|
||||
lv_style_set_border_color(&styles->pretty, LV_STATE_FOCUSED, theme.color_secondary);
|
||||
lv_style_set_border_width(&styles->pretty, LV_STATE_FOCUSED, OUTLINE_WIDTH);
|
||||
lv_style_set_border_width(&styles->pretty, LV_STATE_FOCUSED, outline_width);
|
||||
}
|
||||
|
||||
// Primary Colored gradient
|
||||
@ -273,23 +282,23 @@ static void basic_init(void)
|
||||
lv_style_set_line_width(&styles->pretty_color, LV_STATE_DEFAULT, 1);
|
||||
lv_style_set_scale_end_line_width(&styles->pretty_color, LV_STATE_DEFAULT, 1);
|
||||
lv_style_set_scale_end_color(&styles->pretty_color, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_text_color(&styles->pretty_color, LV_STATE_DEFAULT, COLOR_SCR_TEXT);
|
||||
lv_style_set_text_color(&styles->pretty_color, LV_STATE_DEFAULT, color_scr_text);
|
||||
lv_style_set_line_color(&styles->pretty_color, LV_STATE_DEFAULT, lv_color_make(0x20, 0x20, 0x20));
|
||||
//lv_style_set_text_font(&styles->pretty_color, LV_STATE_DEFAULT, theme.font_normal);
|
||||
// lv_style_set_text_font(&styles->pretty_color, LV_STATE_DEFAULT, theme.font_normal);
|
||||
|
||||
lv_style_set_value_font(&styles->pretty_color, LV_STATE_DEFAULT, theme.font_subtitle);
|
||||
lv_style_set_value_color(&styles->pretty_color, LV_STATE_DEFAULT, COLOR_SCR_TEXT);
|
||||
lv_style_set_value_color(&styles->pretty_color, LV_STATE_DEFAULT, color_scr_text);
|
||||
|
||||
lv_style_set_border_opa(&styles->pretty_color, LV_STATE_DEFAULT, LV_OPA_50);
|
||||
lv_style_set_border_width(&styles->pretty_color, LV_STATE_DEFAULT, BORDER_WIDTH);
|
||||
lv_style_set_border_width(&styles->pretty_color, LV_STATE_DEFAULT, border_width);
|
||||
lv_style_set_border_color(&styles->pretty_color, LV_STATE_DEFAULT, BORDER_COLOR);
|
||||
lv_style_set_border_color(&styles->pretty_color, LV_STATE_EDITED,
|
||||
lv_color_darken(theme.color_secondary, LV_OPA_30));
|
||||
|
||||
lv_style_set_outline_width(&styles->pretty_color, LV_STATE_DEFAULT, OUTLINE_WIDTH);
|
||||
lv_style_set_outline_width(&styles->pretty_color, LV_STATE_DEFAULT, outline_width);
|
||||
if(!NO_FOCUS) {
|
||||
lv_style_set_border_color(&styles->pretty_color, LV_STATE_FOCUSED, theme.color_secondary);
|
||||
lv_style_set_border_width(&styles->pretty_color, LV_STATE_FOCUSED, OUTLINE_WIDTH);
|
||||
lv_style_set_border_width(&styles->pretty_color, LV_STATE_FOCUSED, outline_width);
|
||||
}
|
||||
|
||||
/* style_init_reset(&styles->bg_sec);
|
||||
@ -353,7 +362,7 @@ static void basic_init(void)
|
||||
lv_style_set_border_color(&styles->btn, LV_STATE_DEFAULT, COLOR_BTN_BORDER);
|
||||
lv_style_set_border_color(&styles->btn, LV_STATE_CHECKED, COLOR_BTN_BORDER_CHK);
|
||||
lv_style_set_border_color(&styles->btn, LV_STATE_DISABLED, COLOR_BTN_BORDER_INA);
|
||||
lv_style_set_border_width(&styles->btn, LV_STATE_DEFAULT, BORDER_WIDTH);
|
||||
lv_style_set_border_width(&styles->btn, LV_STATE_DEFAULT, border_width);
|
||||
lv_style_set_border_opa(&styles->btn, LV_STATE_DEFAULT, LV_OPA_50);
|
||||
// lv_style_set_border_opa(&styles->btn, LV_STATE_CHECKED, LV_OPA_40);
|
||||
|
||||
@ -363,31 +372,25 @@ static void basic_init(void)
|
||||
lv_style_set_text_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, COLOR_BG_TEXT_CHK_PR);
|
||||
lv_style_set_text_color(&styles->btn, LV_STATE_DISABLED, COLOR_BG_TEXT_DIS);
|
||||
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_DEFAULT,
|
||||
IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff));
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_PRESSED,
|
||||
IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff));
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_PRESSED, lv_color_hex(0xffffff));
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_hex(0xffffff));
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_DEFAULT, value_color);
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_PRESSED, value_color);
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_PRESSED, LV_COLOR_WHITE);
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, LV_COLOR_WHITE);
|
||||
lv_style_set_image_recolor(&styles->btn, LV_STATE_DISABLED,
|
||||
IS_LIGHT ? lv_color_hex(0x888888) : lv_color_hex(0x888888));
|
||||
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_DEFAULT,
|
||||
IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff));
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_PRESSED,
|
||||
IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff));
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_CHECKED, lv_color_hex(0xffffff));
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_hex(0xffffff));
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_DEFAULT, value_color);
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_PRESSED, value_color);
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_CHECKED, LV_COLOR_WHITE);
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, LV_COLOR_WHITE);
|
||||
lv_style_set_value_color(&styles->btn, LV_STATE_DISABLED,
|
||||
IS_LIGHT ? lv_color_hex(0x888888) : lv_color_hex(0x888888));
|
||||
|
||||
lv_style_set_pad_left(&styles->btn, LV_STATE_DEFAULT, LV_DPX(40));
|
||||
lv_style_set_pad_right(&styles->btn, LV_STATE_DEFAULT, LV_DPX(40));
|
||||
lv_style_set_pad_top(&styles->btn, LV_STATE_DEFAULT, LV_DPX(15));
|
||||
lv_style_set_pad_bottom(&styles->btn, LV_STATE_DEFAULT, LV_DPX(15));
|
||||
lv_style_set_pad_inner(&styles->btn, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_pad_hor(&styles->btn, LV_STATE_DEFAULT, HASP_DPX(40));
|
||||
lv_style_set_pad_ver(&styles->btn, LV_STATE_DEFAULT, HASP_DPX(15));
|
||||
lv_style_set_pad_inner(&styles->btn, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
|
||||
lv_style_set_outline_width(&styles->btn, LV_STATE_DEFAULT, OUTLINE_WIDTH);
|
||||
lv_style_set_outline_width(&styles->btn, LV_STATE_DEFAULT, outline_width);
|
||||
if(!NO_FOCUS) {
|
||||
lv_style_set_outline_opa(&styles->btn, LV_STATE_DEFAULT, LV_OPA_0);
|
||||
lv_style_set_outline_opa(&styles->btn, LV_STATE_FOCUSED, LV_OPA_50);
|
||||
@ -404,22 +407,22 @@ static void basic_init(void)
|
||||
|
||||
style_init_reset(&styles->pad_inner);
|
||||
lv_style_set_pad_inner(&styles->pad_inner, LV_STATE_DEFAULT,
|
||||
lv_disp_get_size_category(NULL) <= LV_DISP_MEDIUM_LIMIT ? LV_DPX(20) : LV_DPX(40));
|
||||
lv_disp_get_size_category(NULL) <= LV_DISP_MEDIUM_LIMIT ? HASP_DPX(20) : HASP_DPX(40));
|
||||
|
||||
style_init_reset(&styles->pad_small);
|
||||
lv_style_int_t pad_small_value = lv_disp_get_size_category(NULL) <= LV_DISP_MEDIUM_LIMIT ? LV_DPX(10) : LV_DPX(20);
|
||||
lv_style_int_t pad_small_value =
|
||||
lv_disp_get_size_category(NULL) <= LV_DISP_MEDIUM_LIMIT ? HASP_DPX(10) : HASP_DPX(20);
|
||||
lv_style_set_pad_all(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value);
|
||||
lv_style_set_pad_inner(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value);
|
||||
|
||||
#if LV_USE_DROPDOWN || LV_USE_ROLLER
|
||||
style_init_reset(&styles->line_space);
|
||||
lv_style_set_text_line_space(&styles->line_space, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_text_line_space(&styles->line_space, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
lv_style_set_clip_corner(&styles->line_space, LV_STATE_DEFAULT, true);
|
||||
|
||||
style_init_reset(&styles->selected);
|
||||
lv_style_set_radius(&styles->selected, LV_STATE_DEFAULT, 0);
|
||||
lv_style_set_text_color(&styles->selected, LV_STATE_DEFAULT,
|
||||
IS_LIGHT ? lv_color_hex3(0xfff) : lv_color_hex3(0xfff));
|
||||
lv_style_set_text_color(&styles->selected, LV_STATE_DEFAULT, IS_LIGHT ? LV_COLOR_WHITE : LV_COLOR_WHITE);
|
||||
lv_style_set_bg_color(&styles->selected, LV_STATE_PRESSED, COLOR_BG_PR);
|
||||
lv_style_set_text_color(&styles->selected, LV_STATE_PRESSED, COLOR_BG_TEXT_PR);
|
||||
#endif
|
||||
@ -453,11 +456,11 @@ static void bar_init(void)
|
||||
lv_style_set_radius(&styles->bar_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_bg_opa(&styles->bar_bg, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->bar_bg, LV_STATE_DEFAULT, COLOR_BG_SEC);
|
||||
lv_style_set_value_color(&styles->bar_bg, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE);
|
||||
lv_style_set_value_color(&styles->bar_bg, LV_STATE_DEFAULT, value_color);
|
||||
lv_style_set_outline_color(&styles->bar_bg, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_outline_color(&styles->bar_bg, LV_STATE_EDITED, theme.color_secondary);
|
||||
lv_style_set_outline_opa(&styles->bar_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_outline_width(&styles->bar_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH);
|
||||
lv_style_set_outline_width(&styles->bar_bg, LV_STATE_DEFAULT, outline_width);
|
||||
lv_style_set_transition_time(&styles->bar_bg, LV_STATE_DEFAULT, TRANSITION_TIME);
|
||||
lv_style_set_transition_prop_6(&styles->bar_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA);
|
||||
|
||||
@ -495,10 +498,10 @@ static void led_init(void)
|
||||
lv_style_set_border_opa(&styles->led, LV_STATE_DEFAULT, LV_OPA_50);
|
||||
lv_style_set_border_color(&styles->led, LV_STATE_DEFAULT, lv_color_lighten(theme.color_primary, LV_OPA_30));
|
||||
lv_style_set_radius(&styles->led, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_shadow_width(&styles->led, LV_STATE_DEFAULT, LV_DPX(15));
|
||||
lv_style_set_shadow_width(&styles->led, LV_STATE_DEFAULT, HASP_DPX(15));
|
||||
lv_style_set_shadow_color(&styles->led, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_shadow_spread(&styles->led, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_margin_all(&styles->led, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_shadow_spread(&styles->led, LV_STATE_DEFAULT, HASP_DPX(5));
|
||||
lv_style_set_margin_all(&styles->led, LV_STATE_DEFAULT, HASP_DPX(5));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -509,18 +512,12 @@ static void slider_init(void)
|
||||
// lv_style_set_bg_opa(&styles->slider_knob, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
// lv_style_set_bg_color(&styles->slider_knob, LV_STATE_DEFAULT, IS_LIGHT ? theme.color_primary : LV_COLOR_WHITE);
|
||||
// lv_style_set_value_color(&styles->slider_knob, LV_STATE_DEFAULT,
|
||||
// IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE);
|
||||
// value_color);
|
||||
// lv_style_set_radius(&styles->slider_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_pad_left(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_right(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_top(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_bottom(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_all(&styles->slider_knob, LV_STATE_DEFAULT, HASP_DPX(7));
|
||||
|
||||
style_init_reset(&styles->slider_bg);
|
||||
lv_style_set_margin_left(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_margin_right(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_margin_top(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_margin_bottom(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_margin_all(&styles->slider_bg, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
|
||||
#endif
|
||||
}
|
||||
@ -532,10 +529,7 @@ static void switch_init(void)
|
||||
// lv_style_set_bg_opa(&styles->sw_knob, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
// lv_style_set_bg_color(&styles->sw_knob, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
||||
// lv_style_set_radius(&styles->sw_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_pad_top(&styles->sw_knob, LV_STATE_DEFAULT, LV_DPX(2));
|
||||
lv_style_set_pad_bottom(&styles->sw_knob, LV_STATE_DEFAULT, LV_DPX(2));
|
||||
lv_style_set_pad_left(&styles->sw_knob, LV_STATE_DEFAULT, LV_DPX(2));
|
||||
lv_style_set_pad_right(&styles->sw_knob, LV_STATE_DEFAULT, LV_DPX(2));
|
||||
lv_style_set_pad_all(&styles->sw_knob, LV_STATE_DEFAULT, HASP_DPX(2));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -544,17 +538,16 @@ static void linemeter_init(void)
|
||||
#if LV_USE_LINEMETER != 0
|
||||
style_init_reset(&styles->lmeter);
|
||||
lv_style_set_radius(&styles->lmeter, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_pad_left(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_pad_right(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_pad_top(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_pad_inner(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(30));
|
||||
lv_style_set_scale_width(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(25));
|
||||
lv_style_set_pad_hor(&styles->lmeter, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
lv_style_set_pad_top(&styles->lmeter, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
lv_style_set_pad_inner(&styles->lmeter, LV_STATE_DEFAULT, HASP_DPX(30));
|
||||
lv_style_set_scale_width(&styles->lmeter, LV_STATE_DEFAULT, HASP_DPX(25));
|
||||
|
||||
lv_style_set_line_color(&styles->lmeter, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_scale_grad_color(&styles->lmeter, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_scale_end_color(&styles->lmeter, LV_STATE_DEFAULT, lv_color_hex3(0x888));
|
||||
lv_style_set_line_width(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_scale_end_line_width(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_line_width(&styles->lmeter, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
lv_style_set_scale_end_line_width(&styles->lmeter, LV_STATE_DEFAULT, HASP_DPX(7));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -565,34 +558,33 @@ static void gauge_init(void)
|
||||
lv_style_set_line_color(&styles->gauge_main, LV_STATE_DEFAULT, lv_color_hex3(0x888));
|
||||
lv_style_set_scale_grad_color(&styles->gauge_main, LV_STATE_DEFAULT, lv_color_hex3(0x888));
|
||||
lv_style_set_scale_end_color(&styles->gauge_main, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_line_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(2)); // normal scale minor thick width
|
||||
lv_style_set_line_width(&styles->gauge_main, LV_STATE_DEFAULT, HASP_DPX(2)); // normal scale minor thick width
|
||||
lv_style_set_scale_end_line_width(&styles->gauge_main, LV_STATE_DEFAULT,
|
||||
LV_DPX(2)); // strong scale minor tick width
|
||||
lv_style_set_scale_end_border_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_left(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); // left margin
|
||||
lv_style_set_pad_right(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); // right margin
|
||||
lv_style_set_pad_top(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); // top margin
|
||||
lv_style_set_pad_inner(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(15)); // position of the labels
|
||||
lv_style_set_scale_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(10)); // minor thick length
|
||||
HASP_DPX(2)); // strong scale minor tick width
|
||||
lv_style_set_scale_end_border_width(&styles->gauge_main, LV_STATE_DEFAULT, HASP_DPX(3));
|
||||
lv_style_set_pad_hor(&styles->gauge_main, LV_STATE_DEFAULT, HASP_DPX(20)); // left margin
|
||||
lv_style_set_pad_top(&styles->gauge_main, LV_STATE_DEFAULT, HASP_DPX(20)); // top margin
|
||||
lv_style_set_pad_inner(&styles->gauge_main, LV_STATE_DEFAULT, HASP_DPX(15)); // position of the labels
|
||||
lv_style_set_scale_width(&styles->gauge_main, LV_STATE_DEFAULT, HASP_DPX(10)); // minor thick length
|
||||
lv_style_set_radius(&styles->gauge_main, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
|
||||
style_init_reset(&styles->gauge_strong);
|
||||
lv_style_set_line_color(&styles->gauge_strong, LV_STATE_DEFAULT, lv_color_hex3(0x888));
|
||||
lv_style_set_scale_grad_color(&styles->gauge_strong, LV_STATE_DEFAULT, lv_color_hex3(0x888));
|
||||
lv_style_set_scale_end_color(&styles->gauge_strong, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_line_width(&styles->gauge_strong, LV_STATE_DEFAULT, LV_DPX(8)); // strong scale arc width
|
||||
lv_style_set_scale_end_line_width(&styles->gauge_strong, LV_STATE_DEFAULT, LV_DPX(8));
|
||||
lv_style_set_scale_width(&styles->gauge_strong, LV_STATE_DEFAULT, LV_DPX(20)); // major thick length
|
||||
lv_style_set_line_width(&styles->gauge_strong, LV_STATE_DEFAULT, HASP_DPX(8)); // strong scale arc width
|
||||
lv_style_set_scale_end_line_width(&styles->gauge_strong, LV_STATE_DEFAULT, HASP_DPX(8));
|
||||
lv_style_set_scale_width(&styles->gauge_strong, LV_STATE_DEFAULT, HASP_DPX(20)); // major thick length
|
||||
|
||||
style_init_reset(&styles->gauge_needle);
|
||||
lv_style_set_line_color(&styles->gauge_needle, LV_STATE_DEFAULT,
|
||||
IS_LIGHT ? lv_color_hex(0x464b5b) : LV_COLOR_WHITE);
|
||||
lv_style_set_line_width(&styles->gauge_needle, LV_STATE_DEFAULT, LV_DPX(8));
|
||||
lv_style_set_line_width(&styles->gauge_needle, LV_STATE_DEFAULT, HASP_DPX(8));
|
||||
lv_style_set_bg_opa(&styles->gauge_needle, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->gauge_needle, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x464b5b) : LV_COLOR_WHITE);
|
||||
lv_style_set_radius(&styles->gauge_needle, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_size(&styles->gauge_needle, LV_STATE_DEFAULT, LV_DPX(30));
|
||||
lv_style_set_pad_inner(&styles->gauge_needle, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_size(&styles->gauge_needle, LV_STATE_DEFAULT, HASP_DPX(30));
|
||||
lv_style_set_pad_inner(&styles->gauge_needle, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -601,15 +593,15 @@ static void arc_init(void)
|
||||
#if LV_USE_ARC != 0
|
||||
style_init_reset(&styles->arc_indic);
|
||||
lv_style_set_line_color(&styles->arc_indic, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_line_width(&styles->arc_indic, LV_STATE_DEFAULT, LV_DPX(25));
|
||||
lv_style_set_line_width(&styles->arc_indic, LV_STATE_DEFAULT, HASP_DPX(25));
|
||||
lv_style_set_line_rounded(&styles->arc_indic, LV_STATE_DEFAULT, true);
|
||||
|
||||
style_init_reset(&styles->arc_bg);
|
||||
lv_style_set_line_color(&styles->arc_bg, LV_STATE_DEFAULT, lv_color_mix(BORDER_COLOR, COLOR_SCR_GRAD, 128));
|
||||
lv_style_set_line_width(&styles->arc_bg, LV_STATE_DEFAULT, LV_DPX(25));
|
||||
lv_style_set_line_width(&styles->arc_bg, LV_STATE_DEFAULT, HASP_DPX(25));
|
||||
lv_style_set_line_rounded(&styles->arc_bg, LV_STATE_DEFAULT, true);
|
||||
lv_style_set_radius(&styles->arc_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_border_width(&styles->arc_bg, LV_STATE_DEFAULT, LV_DPX(25));
|
||||
lv_style_set_border_width(&styles->arc_bg, LV_STATE_DEFAULT, HASP_DPX(25));
|
||||
/*
|
||||
lv_style_set_border_opa(&styles->pretty_color, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_border_opa(&styles->pretty_color, LV_STATE_FOCUSED, LV_OPA_30);
|
||||
@ -619,10 +611,7 @@ static void arc_init(void)
|
||||
*/
|
||||
style_init_reset(&styles->arc_knob);
|
||||
lv_style_set_radius(&styles->arc_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_pad_top(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0));
|
||||
lv_style_set_pad_bottom(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0));
|
||||
lv_style_set_pad_left(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0));
|
||||
lv_style_set_pad_right(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0));
|
||||
lv_style_set_pad_all(&styles->arc_knob, LV_STATE_DEFAULT, HASP_DPX(0));
|
||||
|
||||
#endif
|
||||
}
|
||||
@ -640,27 +629,26 @@ static void chart_init(void)
|
||||
lv_style_set_text_color(&styles->chart_bg, LV_STATE_DEFAULT, IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd));
|
||||
|
||||
style_init_reset(&styles->chart_series_bg);
|
||||
lv_style_set_line_width(&styles->chart_series_bg, LV_STATE_DEFAULT, LV_DPX(1));
|
||||
lv_style_set_line_dash_width(&styles->chart_series_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_line_dash_gap(&styles->chart_series_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_line_width(&styles->chart_series_bg, LV_STATE_DEFAULT, HASP_DPX(1));
|
||||
lv_style_set_line_dash_width(&styles->chart_series_bg, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
lv_style_set_line_dash_gap(&styles->chart_series_bg, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
lv_style_set_line_color(&styles->chart_series_bg, LV_STATE_DEFAULT, COLOR_BG_BORDER);
|
||||
|
||||
style_init_reset(&styles->chart_series);
|
||||
lv_style_set_line_width(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_size(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(4));
|
||||
lv_style_set_pad_inner(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(2)); /*Space between columns*/
|
||||
lv_style_set_radius(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(1));
|
||||
lv_style_set_line_width(&styles->chart_series, LV_STATE_DEFAULT, HASP_DPX(3));
|
||||
lv_style_set_size(&styles->chart_series, LV_STATE_DEFAULT, HASP_DPX(4));
|
||||
lv_style_set_pad_inner(&styles->chart_series, LV_STATE_DEFAULT, HASP_DPX(2)); /*Space between columns*/
|
||||
lv_style_set_radius(&styles->chart_series, LV_STATE_DEFAULT, HASP_DPX(1));
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static void calendar_init(void)
|
||||
static void calendar_init(lv_style_int_t pad_def, lv_color_t value_color)
|
||||
{
|
||||
#if LV_USE_CALENDAR
|
||||
style_init_reset(&styles->calendar_date_nums);
|
||||
lv_style_set_radius(&styles->calendar_date_nums, LV_STATE_DEFAULT, LV_DPX(4));
|
||||
lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_CHECKED,
|
||||
IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE);
|
||||
lv_style_set_radius(&styles->calendar_date_nums, LV_STATE_DEFAULT, HASP_DPX(4));
|
||||
lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_CHECKED, value_color);
|
||||
lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_DISABLED, LV_COLOR_GRAY);
|
||||
lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_CHECKED, IS_LIGHT ? LV_OPA_20 : LV_OPA_40);
|
||||
lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_PRESSED, LV_OPA_20);
|
||||
@ -673,10 +661,9 @@ static void calendar_init(void)
|
||||
lv_style_set_border_width(&styles->calendar_date_nums, LV_STATE_CHECKED, 2);
|
||||
lv_style_set_border_side(&styles->calendar_date_nums, LV_STATE_CHECKED, LV_BORDER_SIDE_LEFT);
|
||||
lv_style_set_border_color(&styles->calendar_date_nums, LV_STATE_CHECKED, theme.color_primary);
|
||||
lv_style_set_pad_inner(&styles->calendar_date_nums, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_left(&styles->calendar_date_nums, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_right(&styles->calendar_date_nums, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_bottom(&styles->calendar_date_nums, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_inner(&styles->calendar_date_nums, LV_STATE_DEFAULT, HASP_DPX(3));
|
||||
lv_style_set_pad_hor(&styles->calendar_date_nums, LV_STATE_DEFAULT, pad_def);
|
||||
lv_style_set_pad_bottom(&styles->calendar_date_nums, LV_STATE_DEFAULT, pad_def);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -684,10 +671,10 @@ static void cpicker_init(void)
|
||||
{
|
||||
#if LV_USE_CPICKER
|
||||
style_init_reset(&styles->cpicker_bg);
|
||||
lv_style_set_scale_width(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_DPX(30));
|
||||
lv_style_set_scale_width(&styles->cpicker_bg, LV_STATE_DEFAULT, HASP_DPX(30));
|
||||
lv_style_set_bg_opa(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->cpicker_bg, LV_STATE_DEFAULT, COLOR_SCR);
|
||||
lv_style_set_pad_inner(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_pad_inner(&styles->cpicker_bg, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
lv_style_set_radius(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
|
||||
style_init_reset(&styles->cpicker_indic);
|
||||
@ -698,10 +685,7 @@ static void cpicker_init(void)
|
||||
lv_style_set_border_color(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_COLOR_GRAY);
|
||||
lv_style_set_border_color(&styles->cpicker_indic, LV_STATE_FOCUSED, theme.color_primary);
|
||||
lv_style_set_border_color(&styles->cpicker_indic, LV_STATE_EDITED, theme.color_secondary);
|
||||
lv_style_set_pad_left(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13));
|
||||
lv_style_set_pad_right(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13));
|
||||
lv_style_set_pad_top(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13));
|
||||
lv_style_set_pad_bottom(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13));
|
||||
lv_style_set_pad_all(&styles->cpicker_indic, LV_STATE_DEFAULT, HASP_DPX(13));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -709,29 +693,26 @@ static void checkbox_init(void)
|
||||
{
|
||||
#if LV_USE_CHECKBOX != 0
|
||||
/* style_init_reset(&styles->cb_bg);
|
||||
lv_style_set_radius(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(4));
|
||||
lv_style_set_pad_inner(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_radius(&styles->cb_bg, LV_STATE_DEFAULT, HASP_DPX(4));
|
||||
lv_style_set_pad_inner(&styles->cb_bg, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
lv_style_set_outline_color(&styles->cb_bg, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_FOCUSED, LV_OPA_50);
|
||||
lv_style_set_outline_width(&styles->cb_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH);
|
||||
lv_style_set_outline_pad(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(10));
|
||||
lv_style_set_outline_width(&styles->cb_bg, LV_STATE_DEFAULT, outline_width);
|
||||
lv_style_set_outline_pad(&styles->cb_bg, LV_STATE_DEFAULT, HASP_DPX(10));
|
||||
lv_style_set_transition_time(&styles->cb_bg, LV_STATE_DEFAULT, TRANSITION_TIME);
|
||||
lv_style_set_transition_prop_6(&styles->cb_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA);
|
||||
*/
|
||||
style_init_reset(&styles->cb_bullet);
|
||||
lv_style_set_outline_opa(&styles->cb_bullet, LV_STATE_FOCUSED, LV_OPA_TRANSP);
|
||||
lv_style_set_radius(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(4));
|
||||
lv_style_set_radius(&styles->cb_bullet, LV_STATE_DEFAULT, HASP_DPX(4));
|
||||
lv_style_set_pattern_image(&styles->cb_bullet, LV_STATE_CHECKED, LV_SYMBOL_OK);
|
||||
lv_style_set_pattern_recolor(&styles->cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE);
|
||||
lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_CHECKED, LV_OPA_COVER);
|
||||
lv_style_set_transition_prop_3(&styles->cb_bullet, LV_STATE_DEFAULT, LV_STYLE_PATTERN_OPA);
|
||||
lv_style_set_text_font(&styles->cb_bullet, LV_STATE_CHECKED, theme.font_small);
|
||||
lv_style_set_pad_left(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_top(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_bottom(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_all(&styles->cb_bullet, LV_STATE_DEFAULT, HASP_DPX(3));
|
||||
|
||||
lv_style_set_bg_color(&styles->cb_bullet, LV_STATE_PRESSED, COLOR_BTN_PR);
|
||||
lv_style_set_bg_grad_color(&styles->cb_bullet, LV_STATE_PRESSED, COLOR_BTN_CHK_GRAD);
|
||||
@ -758,15 +739,12 @@ static void keyboard_init(void)
|
||||
#if LV_USE_KEYBOARD
|
||||
style_init_reset(&styles->kb_bg);
|
||||
lv_style_set_radius(&styles->kb_bg, LV_STATE_DEFAULT, 0);
|
||||
lv_style_set_border_width(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(4));
|
||||
lv_style_set_border_width(&styles->kb_bg, LV_STATE_DEFAULT, HASP_DPX(4));
|
||||
lv_style_set_border_side(&styles->kb_bg, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP);
|
||||
lv_style_set_border_color(&styles->kb_bg, LV_STATE_DEFAULT, IS_LIGHT ? COLOR_BG_TEXT : LV_COLOR_BLACK);
|
||||
lv_style_set_border_color(&styles->kb_bg, LV_STATE_EDITED, theme.color_secondary);
|
||||
lv_style_set_pad_left(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_pad_right(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_pad_top(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_pad_bottom(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_pad_inner(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(3));
|
||||
lv_style_set_pad_all(&styles->kb_bg, LV_STATE_DEFAULT, HASP_DPX(5));
|
||||
lv_style_set_pad_inner(&styles->kb_bg, LV_STATE_DEFAULT, HASP_DPX(3));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -774,38 +752,38 @@ static void msgbox_init(void)
|
||||
{
|
||||
#if LV_USE_MSGBOX
|
||||
style_init_reset(&styles->mbox_bg);
|
||||
lv_style_set_shadow_width(&styles->mbox_bg, LV_STATE_DEFAULT, LV_DPX(50));
|
||||
lv_style_set_shadow_width(&styles->mbox_bg, LV_STATE_DEFAULT, HASP_DPX(50));
|
||||
lv_style_set_shadow_color(&styles->mbox_bg, LV_STATE_DEFAULT, IS_LIGHT ? LV_COLOR_SILVER : lv_color_hex3(0x777));
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static void page_init(void)
|
||||
static void page_init(lv_style_int_t dpx7)
|
||||
{
|
||||
#if LV_USE_PAGE
|
||||
style_init_reset(&styles->sb);
|
||||
lv_style_set_bg_opa(&styles->sb, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->sb, LV_STATE_DEFAULT, SCROLLBAR_COLOR);
|
||||
lv_style_set_radius(&styles->sb, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
lv_style_set_size(&styles->sb, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_right(&styles->sb, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_bottom(&styles->sb, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_size(&styles->sb, LV_STATE_DEFAULT, dpx7);
|
||||
lv_style_set_pad_right(&styles->sb, LV_STATE_DEFAULT, dpx7);
|
||||
lv_style_set_pad_bottom(&styles->sb, LV_STATE_DEFAULT, dpx7);
|
||||
|
||||
#if LV_USE_ANIMATION
|
||||
#if LV_USE_ANIMATION
|
||||
style_init_reset(&styles->edge_flash);
|
||||
lv_style_set_bg_opa(&styles->edge_flash, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->edge_flash, LV_STATE_DEFAULT, lv_color_hex3(0x888));
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static void textarea_init(void)
|
||||
static void textarea_init(lv_style_int_t border_width)
|
||||
{
|
||||
#if LV_USE_TEXTAREA
|
||||
style_init_reset(&styles->ta_cursor);
|
||||
lv_style_set_border_color(&styles->ta_cursor, LV_STATE_DEFAULT, COLOR_BG_SEC_TEXT);
|
||||
lv_style_set_border_width(&styles->ta_cursor, LV_STATE_DEFAULT, BORDER_WIDTH);
|
||||
lv_style_set_pad_left(&styles->ta_cursor, LV_STATE_DEFAULT, LV_DPX(1));
|
||||
lv_style_set_border_width(&styles->ta_cursor, LV_STATE_DEFAULT, border_width);
|
||||
lv_style_set_pad_left(&styles->ta_cursor, LV_STATE_DEFAULT, HASP_DPX(1));
|
||||
lv_style_set_border_side(&styles->ta_cursor, LV_STATE_DEFAULT, LV_BORDER_SIDE_LEFT);
|
||||
|
||||
style_init_reset(&styles->ta_placeholder);
|
||||
@ -822,13 +800,12 @@ static void spinbox_init(void)
|
||||
lv_style_set_bg_opa(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->spinbox_cursor, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_text_color(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
||||
lv_style_set_pad_top(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_DPX(100));
|
||||
lv_style_set_pad_bottom(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_DPX(100));
|
||||
lv_style_set_pad_ver(&styles->spinbox_cursor, LV_STATE_DEFAULT, HASP_DPX(100));
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static void list_init(void)
|
||||
static void list_init(lv_style_int_t pad_def, lv_style_int_t border_width)
|
||||
{
|
||||
#if LV_USE_LIST != 0
|
||||
/* style_init_reset(&styles->list_bg);
|
||||
@ -859,23 +836,20 @@ static void list_init(void)
|
||||
lv_style_set_border_side(&styles->list_btn, LV_STATE_DEFAULT, LV_BORDER_SIDE_BOTTOM);
|
||||
lv_style_set_border_color(&styles->list_btn, LV_STATE_DEFAULT, COLOR_BG_BORDER);
|
||||
lv_style_set_border_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_primary);
|
||||
lv_style_set_border_width(&styles->list_btn, LV_STATE_DEFAULT, BORDER_WIDTH);
|
||||
lv_style_set_border_width(&styles->list_btn, LV_STATE_DEFAULT, border_width);
|
||||
|
||||
lv_style_set_outline_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_secondary);
|
||||
// lv_style_set_outline_width(&styles->list_btn, LV_STATE_FOCUSED, OUTLINE_WIDTH);
|
||||
lv_style_set_outline_pad(&styles->list_btn, LV_STATE_FOCUSED, -BORDER_WIDTH);
|
||||
// lv_style_set_outline_width(&styles->list_btn, LV_STATE_FOCUSED, outline_width);
|
||||
lv_style_set_outline_pad(&styles->list_btn, LV_STATE_FOCUSED, -border_width);
|
||||
|
||||
lv_style_set_pad_left(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_right(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_top(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_bottom(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_inner(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_all(&styles->list_btn, LV_STATE_DEFAULT, pad_def);
|
||||
lv_style_set_pad_inner(&styles->list_btn, LV_STATE_DEFAULT, pad_def);
|
||||
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_DEFAULT, -PAD_DEF);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_PRESSED, -BORDER_WIDTH);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_CHECKED, -BORDER_WIDTH);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_DISABLED, -BORDER_WIDTH);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_FOCUSED, -BORDER_WIDTH);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_DEFAULT, -pad_def);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_PRESSED, -border_width);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_CHECKED, -border_width);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_DISABLED, -border_width);
|
||||
lv_style_set_transform_width(&styles->list_btn, LV_STATE_FOCUSED, -border_width);
|
||||
|
||||
lv_style_set_transition_time(&styles->list_btn, LV_STATE_DEFAULT, TRANSITION_TIME);
|
||||
lv_style_set_transition_prop_6(&styles->list_btn, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR);
|
||||
@ -888,7 +862,7 @@ static void ddlist_init(void)
|
||||
#if LV_USE_DROPDOWN != 0
|
||||
|
||||
/* style_init_reset(&styles->ddlist_page);
|
||||
lv_style_set_text_line_space(&styles->ddlist_page, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_text_line_space(&styles->ddlist_page, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
lv_style_set_clip_corner(&styles->ddlist_page, LV_STATE_DEFAULT, true);
|
||||
|
||||
style_init_reset(&styles->ddlist_sel);
|
||||
@ -896,7 +870,7 @@ static void ddlist_init(void)
|
||||
// lv_style_set_bg_opa(&styles->ddlist_sel, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
// lv_style_set_bg_color(&styles->ddlist_sel, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_text_color(&styles->ddlist_sel, LV_STATE_DEFAULT,
|
||||
IS_LIGHT ? lv_color_hex3(0xfff) : lv_color_hex3(0xfff));
|
||||
IS_LIGHT ?LV_COLOR_WHITE :LV_COLOR_WHITE);
|
||||
lv_style_set_bg_color(&styles->ddlist_sel, LV_STATE_PRESSED, COLOR_BG_PR);
|
||||
lv_style_set_text_color(&styles->ddlist_sel, LV_STATE_PRESSED, COLOR_BG_TEXT_PR);
|
||||
*/
|
||||
@ -907,7 +881,7 @@ static void roller_init(void)
|
||||
{
|
||||
#if LV_USE_ROLLER != 0
|
||||
/* style_init_reset(&styles->roller_bg);
|
||||
lv_style_set_text_line_space(&styles->roller_bg, LV_STATE_DEFAULT, LV_DPX(25));
|
||||
lv_style_set_text_line_space(&styles->roller_bg, LV_STATE_DEFAULT, HASP_DPX(25));
|
||||
|
||||
style_init_reset(&styles->roller_sel);
|
||||
lv_style_set_bg_opa(&styles->roller_sel, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
@ -928,18 +902,14 @@ static void tileview_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void table_init(void)
|
||||
static void table_init(lv_style_int_t pad_def)
|
||||
{
|
||||
#if LV_USE_TABLE != 0
|
||||
style_init_reset(&styles->table_cell);
|
||||
lv_style_set_border_color(&styles->table_cell, LV_STATE_DEFAULT, COLOR_BG_BORDER);
|
||||
lv_style_set_border_width(&styles->table_cell, LV_STATE_DEFAULT, 1);
|
||||
lv_style_set_border_side(&styles->table_cell, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM);
|
||||
lv_style_set_pad_left(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_right(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_top(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_bottom(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
|
||||
|
||||
lv_style_set_pad_all(&styles->table_cell, LV_STATE_DEFAULT, pad_def);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -949,24 +919,22 @@ static void win_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void tabview_win_shared_init(void)
|
||||
static void tabview_win_shared_init(lv_style_int_t pad_def, lv_style_int_t dpx7, lv_color_t color_scr_text)
|
||||
{
|
||||
#if LV_USE_TABVIEW || LV_USE_WIN
|
||||
style_init_reset(&styles->tabview_btns_bg);
|
||||
lv_style_set_bg_opa(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, COLOR_SCR_GRAD);
|
||||
lv_style_set_text_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, COLOR_SCR_TEXT);
|
||||
lv_style_set_text_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, color_scr_text);
|
||||
lv_style_set_image_recolor(&styles->tabview_btns_bg, LV_STATE_DEFAULT, lv_color_hex(0x979a9f));
|
||||
lv_style_set_pad_top(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_left(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_right(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_DPX(7));
|
||||
lv_style_set_pad_top(&styles->tabview_btns_bg, LV_STATE_DEFAULT, dpx7);
|
||||
lv_style_set_pad_hor(&styles->tabview_btns_bg, LV_STATE_DEFAULT, dpx7);
|
||||
|
||||
style_init_reset(&styles->tabview_btns);
|
||||
lv_style_set_bg_opa(&styles->tabview_btns, LV_STATE_PRESSED, LV_OPA_50);
|
||||
lv_style_set_bg_color(&styles->tabview_btns, LV_STATE_PRESSED, lv_color_hex3(0x888));
|
||||
lv_style_set_text_color(&styles->tabview_btns, LV_STATE_CHECKED, COLOR_SCR_TEXT);
|
||||
lv_style_set_pad_top(&styles->tabview_btns, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_pad_bottom(&styles->tabview_btns, LV_STATE_DEFAULT, LV_DPX(20));
|
||||
lv_style_set_text_color(&styles->tabview_btns, LV_STATE_CHECKED, color_scr_text);
|
||||
lv_style_set_pad_ver(&styles->tabview_btns, LV_STATE_DEFAULT, HASP_DPX(20));
|
||||
lv_style_set_text_color(&styles->tabview_btns, LV_STATE_FOCUSED, theme.color_primary);
|
||||
lv_style_set_text_color(&styles->tabview_btns, LV_STATE_EDITED, theme.color_secondary);
|
||||
|
||||
@ -974,15 +942,12 @@ static void tabview_win_shared_init(void)
|
||||
lv_style_set_bg_opa(&styles->tabview_indic, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||
lv_style_set_bg_color(&styles->tabview_indic, LV_STATE_DEFAULT, theme.color_primary);
|
||||
lv_style_set_bg_color(&styles->tabview_indic, LV_STATE_EDITED, theme.color_secondary);
|
||||
lv_style_set_size(&styles->tabview_indic, LV_STATE_DEFAULT, LV_DPX(5));
|
||||
lv_style_set_size(&styles->tabview_indic, LV_STATE_DEFAULT, HASP_DPX(5));
|
||||
lv_style_set_radius(&styles->tabview_indic, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||
|
||||
style_init_reset(&styles->tabview_page_scrl);
|
||||
lv_style_set_pad_top(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_bottom(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_left(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_right(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_inner(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF);
|
||||
lv_style_set_pad_all(&styles->tabview_page_scrl, LV_STATE_DEFAULT, pad_def);
|
||||
lv_style_set_pad_inner(&styles->tabview_page_scrl, LV_STATE_DEFAULT, pad_def);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1001,9 +966,9 @@ static void tabview_win_shared_init(void)
|
||||
* @param font_title pointer to a extra large font
|
||||
* @return a pointer to reference this theme later
|
||||
*/
|
||||
lv_theme_t * lv_theme_hasp_init(lv_color_t color_primary, lv_color_t color_secondary, uint32_t flags,
|
||||
const lv_font_t * font_small, const lv_font_t * font_normal,
|
||||
const lv_font_t * font_subtitle, const lv_font_t * font_title)
|
||||
lv_theme_t* lv_theme_hasp_init(lv_color_t color_primary, lv_color_t color_secondary, uint32_t flags,
|
||||
const lv_font_t* font_small, const lv_font_t* font_normal,
|
||||
const lv_font_t* font_subtitle, const lv_font_t* font_title)
|
||||
{
|
||||
|
||||
/* This trick is required only to avoid the garbage collection of
|
||||
@ -1011,7 +976,7 @@ lv_theme_t * lv_theme_hasp_init(lv_color_t color_primary, lv_color_t color_secon
|
||||
* In a general case styles could be simple `static lv_style_t my style` variables*/
|
||||
if(!inited) {
|
||||
LV_GC_ROOT(_lv_theme_material_styles) = lv_mem_alloc(sizeof(theme_styles_t));
|
||||
styles = (theme_styles_t *)LV_GC_ROOT(_lv_theme_material_styles);
|
||||
styles = (theme_styles_t*)LV_GC_ROOT(_lv_theme_material_styles);
|
||||
}
|
||||
|
||||
theme.color_primary = color_primary;
|
||||
@ -1022,7 +987,14 @@ lv_theme_t * lv_theme_hasp_init(lv_color_t color_primary, lv_color_t color_secon
|
||||
theme.font_title = font_title;
|
||||
theme.flags = flags;
|
||||
|
||||
basic_init();
|
||||
lv_style_int_t border_width = BORDER_WIDTH;
|
||||
lv_style_int_t outline_width = OUTLINE_WIDTH;
|
||||
lv_style_int_t pad_def = PAD_DEF;
|
||||
lv_style_int_t dpx7 = HASP_DPX(7);
|
||||
lv_color_t value_color = IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE;
|
||||
lv_color_t color_scr_text = COLOR_SCR_TEXT;
|
||||
|
||||
basic_init(border_width, outline_width, value_color, color_scr_text);
|
||||
cont_init();
|
||||
btn_init();
|
||||
label_init();
|
||||
@ -1037,23 +1009,23 @@ lv_theme_t * lv_theme_hasp_init(lv_color_t color_primary, lv_color_t color_secon
|
||||
arc_init();
|
||||
spinner_init();
|
||||
chart_init();
|
||||
calendar_init();
|
||||
calendar_init(pad_def, value_color);
|
||||
cpicker_init();
|
||||
checkbox_init();
|
||||
btnmatrix_init();
|
||||
keyboard_init();
|
||||
msgbox_init();
|
||||
page_init();
|
||||
textarea_init();
|
||||
page_init(dpx7);
|
||||
textarea_init(border_width);
|
||||
spinbox_init();
|
||||
list_init();
|
||||
list_init(pad_def, border_width);
|
||||
ddlist_init();
|
||||
roller_init();
|
||||
tabview_init();
|
||||
tileview_init();
|
||||
table_init();
|
||||
table_init(pad_def);
|
||||
win_init();
|
||||
tabview_win_shared_init();
|
||||
tabview_win_shared_init(pad_def, dpx7, color_scr_text);
|
||||
|
||||
theme.apply_xcb = NULL;
|
||||
theme.apply_cb = theme_apply;
|
||||
@ -1065,11 +1037,11 @@ lv_theme_t * lv_theme_hasp_init(lv_color_t color_primary, lv_color_t color_secon
|
||||
return &theme;
|
||||
}
|
||||
|
||||
static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name)
|
||||
static void theme_apply(lv_theme_t* th, lv_obj_t* obj, lv_theme_style_t name)
|
||||
{
|
||||
LV_UNUSED(th);
|
||||
|
||||
lv_style_list_t * list;
|
||||
lv_style_list_t* list;
|
||||
|
||||
switch(name) {
|
||||
case LV_THEME_NONE:
|
||||
@ -1267,10 +1239,10 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name)
|
||||
list = lv_obj_get_style_list(obj, LV_PAGE_PART_SCROLLBAR);
|
||||
_lv_style_list_add_style(list, &styles->sb);
|
||||
|
||||
#if LV_USE_ANIMATION
|
||||
#if LV_USE_ANIMATION
|
||||
list = lv_obj_get_style_list(obj, LV_PAGE_PART_EDGE_FLASH);
|
||||
_lv_style_list_add_style(list, &styles->edge_flash);
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
#if LV_USE_TABVIEW
|
||||
@ -1303,10 +1275,10 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name)
|
||||
list = lv_obj_get_style_list(obj, LV_TILEVIEW_PART_SCROLLBAR);
|
||||
_lv_style_list_add_style(list, &styles->sb);
|
||||
|
||||
#if LV_USE_ANIMATION
|
||||
#if LV_USE_ANIMATION
|
||||
list = lv_obj_get_style_list(obj, LV_TILEVIEW_PART_EDGE_FLASH);
|
||||
_lv_style_list_add_style(list, &styles->edge_flash);
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -1518,7 +1490,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name)
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void style_init_reset(lv_style_t * style)
|
||||
static void style_init_reset(lv_style_t* style)
|
||||
{
|
||||
if(inited)
|
||||
lv_style_reset(style);
|
||||
|
437
src/hasp_debug.cpp
Normal file
437
src/hasp_debug.cpp
Normal file
@ -0,0 +1,437 @@
|
||||
/* MIT License - Copyright (c) 2019-2021 Francis Van Roie
|
||||
For full license information read the LICENSE file in the project folder */
|
||||
|
||||
#include "ArduinoJson.h"
|
||||
#include "lvgl.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "lang/lang.h"
|
||||
#include "hasp_conf.h"
|
||||
#include "hasp_debug.h"
|
||||
#include "hasp_macro.h"
|
||||
#include "hasp/hasp.h"
|
||||
|
||||
#if(!defined(WINDOWS)) && (!defined(POSIX))
|
||||
#include "ArduinoLog.h"
|
||||
|
||||
#define debug_print(io, ...) io->printf(__VA_ARGS__)
|
||||
#define debug_newline(io) io->println()
|
||||
|
||||
bool debugSerialStarted = false;
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
|
||||
#define debug_print(io, ...) fprintf(stdout, __VA_ARGS__)
|
||||
#define debug_newline(io) fprintf(stdout, "\n")
|
||||
|
||||
bool debugSerialStarted = true;
|
||||
#endif
|
||||
|
||||
bool debugAnsiCodes = true;
|
||||
|
||||
inline void debugSendAnsiCode(const __FlashStringHelper* code, Print* _logOutput)
|
||||
{
|
||||
#ifdef ARDUINO
|
||||
if(debugAnsiCodes) _logOutput->print(code);
|
||||
#else
|
||||
if(debugAnsiCodes) debug_print(_logOutput, code);
|
||||
#endif
|
||||
}
|
||||
|
||||
void debug_timestamp()
|
||||
{
|
||||
timeval curTime;
|
||||
gettimeofday(&curTime, NULL);
|
||||
int milli = curTime.tv_usec / 1000;
|
||||
|
||||
char currentTime[80];
|
||||
time_t t = curTime.tv_sec;
|
||||
// strftime(currentTime, 80, "%Y-%m-%d %H:%M.%S", localtime(&t));
|
||||
strftime(currentTime, 80, "%H:%M:%S", localtime(&t));
|
||||
printf("[%s.%03d] ", currentTime, milli);
|
||||
}
|
||||
|
||||
static void debugPrintTimestamp(int level, Print* _logOutput)
|
||||
{ /* Print Current Time */
|
||||
|
||||
timeval curTime;
|
||||
int rslt = gettimeofday(&curTime, NULL);
|
||||
time_t t = curTime.tv_sec;
|
||||
tm* timeinfo = localtime(&t);
|
||||
int milli = curTime.tv_usec / 1000;
|
||||
|
||||
debugSendAnsiCode(F(TERM_COLOR_CYAN), _logOutput);
|
||||
|
||||
if(timeinfo->tm_year >= 120) {
|
||||
char buffer[24];
|
||||
strftime(buffer, sizeof(buffer), "[%b %d %H:%M:%S", timeinfo); // Literal String
|
||||
// strftime(buffer, sizeof(buffer), "[%H:%M:%S.", timeinfo); // Literal String
|
||||
|
||||
#ifdef ARDUINO
|
||||
_logOutput->printf(PSTR("%s.%03lu]"), buffer, curTime.tv_usec / 1000);
|
||||
#else
|
||||
debug_print(_logOutput, PSTR("%s.%03lu]"), buffer, curTime.tv_usec / 1000);
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
uint32_t msecs = millis();
|
||||
#ifdef ARDUINO
|
||||
_logOutput->printf(PSTR("[%15d.%03d]"), msecs / 1000, msecs % 1000);
|
||||
#else
|
||||
debug_print(_logOutput, PSTR("[%15d.%03d]"), msecs / 1000, msecs % 1000);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* ===== Default Event Processors ===== */
|
||||
// void debugPreSetup(JsonObject settings);
|
||||
// void debugSetup();
|
||||
|
||||
static inline void debug_flush()
|
||||
{
|
||||
#if defined(ARDUINO)
|
||||
Serial.flush();
|
||||
#endif
|
||||
|
||||
#if defined(WINDOWS) || defined(POSIX)
|
||||
fflush(stdout);
|
||||
#endif
|
||||
}
|
||||
|
||||
void debugEverySecond()
|
||||
{
|
||||
// if(debugTelePeriod > 0 && (millis() - debugLastMillis) >= debugTelePeriod * 1000) {
|
||||
// dispatch_output_statusupdate(NULL, NULL);
|
||||
// debugLastMillis = millis();
|
||||
// }
|
||||
// printLocalTime();
|
||||
}
|
||||
|
||||
void debugStart()
|
||||
{
|
||||
|
||||
#if defined(WINDOWS) || defined(POSIX)
|
||||
debug_newline();
|
||||
debugPrintHaspHeader(NULL);
|
||||
debug_newline();
|
||||
|
||||
LOG_INFO(TAG_DEBG, F("Console started"));
|
||||
LOG_INFO(TAG_DEBG, F("Environment: " PIOENV));
|
||||
#endif
|
||||
|
||||
if(debugSerialStarted) {
|
||||
debug_flush;
|
||||
|
||||
// Serial.println();
|
||||
// Serial.println(debugHaspHeader());
|
||||
// debug_flush();
|
||||
}
|
||||
|
||||
// prepare syslog configuration here (can be anywhere before first call of
|
||||
// log/logf method)
|
||||
}
|
||||
|
||||
void debugStop()
|
||||
{
|
||||
if(debugSerialStarted) debug_flush();
|
||||
}
|
||||
|
||||
/* ===== Special Event Processors ===== */
|
||||
|
||||
void debugLvglLogEvent(lv_log_level_t level, const char* file, uint32_t line, const char* funcname, const char* descr)
|
||||
{
|
||||
#if LV_USE_LOG != 0
|
||||
/* used for duplicate detection */
|
||||
static uint32_t lastDbgLine;
|
||||
static uint32_t lastDbgFreeMem;
|
||||
|
||||
lv_mem_monitor_t mem_mon;
|
||||
lv_mem_monitor(&mem_mon);
|
||||
|
||||
/* Reduce the number of repeated debug message */
|
||||
if(line != lastDbgLine || mem_mon.free_biggest_size != lastDbgFreeMem) {
|
||||
switch(level) {
|
||||
case LV_LOG_LEVEL_TRACE:
|
||||
LOG_VERBOSE(TAG_LVGL, descr);
|
||||
break;
|
||||
case LV_LOG_LEVEL_WARN:
|
||||
LOG_WARNING(TAG_LVGL, descr);
|
||||
break;
|
||||
case LV_LOG_LEVEL_ERROR:
|
||||
LOG_ERROR(TAG_LVGL, descr);
|
||||
break;
|
||||
default:
|
||||
LOG_TRACE(TAG_LVGL, descr);
|
||||
}
|
||||
lastDbgLine = line;
|
||||
lastDbgFreeMem = mem_mon.free_biggest_size;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Send the HASP header and version to the output device specified
|
||||
void debugPrintHaspHeader(Print* output)
|
||||
{
|
||||
// if(debugAnsiCodes) debug_print(output,TERM_COLOR_YELLOW);
|
||||
|
||||
// debug_newline(output);
|
||||
// debug_print(output, F(""
|
||||
// " _____ _____ _____ _____\r\n"
|
||||
// " | | | _ | __| _ |\r\n"
|
||||
// " | | |__ | __|\r\n"
|
||||
// " |__|__|__|__|_____|__|\r\n"
|
||||
// " Home Automation Switch Plate\r\n"
|
||||
// " Open Hardware edition v"));
|
||||
char buffer[32];
|
||||
haspGetVersion(buffer, sizeof(buffer));
|
||||
#ifdef ARDUINO
|
||||
output->println(buffer);
|
||||
#else
|
||||
debug_print(output, buffer);
|
||||
debug_newline(output);
|
||||
#endif
|
||||
}
|
||||
|
||||
void debug_get_tag(uint8_t tag, char* buffer)
|
||||
{
|
||||
switch(tag) {
|
||||
case TAG_MAIN:
|
||||
memcpy_P(buffer, PSTR("MAIN"), 5);
|
||||
break;
|
||||
|
||||
case TAG_HASP:
|
||||
memcpy_P(buffer, PSTR("HASP"), 5);
|
||||
break;
|
||||
|
||||
case TAG_DRVR:
|
||||
memcpy_P(buffer, PSTR("DRVR"), 5);
|
||||
break;
|
||||
|
||||
case TAG_ATTR:
|
||||
memcpy_P(buffer, PSTR("ATTR"), 5);
|
||||
break;
|
||||
|
||||
case TAG_MSGR:
|
||||
memcpy_P(buffer, PSTR("MSGR"), 5);
|
||||
break;
|
||||
|
||||
case TAG_OOBE:
|
||||
memcpy_P(buffer, PSTR("OOBE"), 5);
|
||||
break;
|
||||
case TAG_HAL:
|
||||
memcpy_P(buffer, PSTR("HAL "), 5);
|
||||
break;
|
||||
|
||||
case TAG_DEBG:
|
||||
memcpy_P(buffer, PSTR("DBUG"), 5);
|
||||
break;
|
||||
case TAG_TELN:
|
||||
memcpy_P(buffer, PSTR("TELN"), 5);
|
||||
break;
|
||||
case TAG_SYSL:
|
||||
memcpy_P(buffer, PSTR("SYSL"), 5);
|
||||
break;
|
||||
case TAG_TASM:
|
||||
memcpy_P(buffer, PSTR("TASM"), 5);
|
||||
break;
|
||||
|
||||
case TAG_CONF:
|
||||
memcpy_P(buffer, PSTR("CONF"), 5);
|
||||
break;
|
||||
case TAG_GUI:
|
||||
memcpy_P(buffer, PSTR("GUI "), 5);
|
||||
break;
|
||||
case TAG_TFT:
|
||||
memcpy_P(buffer, PSTR("TFT "), 5);
|
||||
break;
|
||||
|
||||
case TAG_EPRM:
|
||||
memcpy_P(buffer, PSTR("EPRM"), 5);
|
||||
break;
|
||||
case TAG_FILE:
|
||||
memcpy_P(buffer, PSTR("FILE"), 5);
|
||||
break;
|
||||
case TAG_GPIO:
|
||||
memcpy_P(buffer, PSTR("GPIO"), 5);
|
||||
break;
|
||||
|
||||
case TAG_ETH:
|
||||
memcpy_P(buffer, PSTR("ETH "), 5);
|
||||
break;
|
||||
case TAG_WIFI:
|
||||
memcpy_P(buffer, PSTR("WIFI"), 5);
|
||||
break;
|
||||
case TAG_HTTP:
|
||||
memcpy_P(buffer, PSTR("HTTP"), 5);
|
||||
break;
|
||||
case TAG_MDNS:
|
||||
memcpy_P(buffer, PSTR("MDNS"), 5);
|
||||
break;
|
||||
case TAG_MQTT:
|
||||
memcpy_P(buffer, PSTR("MQTT"), 5);
|
||||
break;
|
||||
case TAG_MQTT_PUB:
|
||||
memcpy_P(buffer, PSTR("MQTT PUB"), 9);
|
||||
break;
|
||||
case TAG_MQTT_RCV:
|
||||
memcpy_P(buffer, PSTR("MQTT RCV"), 9);
|
||||
break;
|
||||
|
||||
case TAG_OTA:
|
||||
memcpy_P(buffer, PSTR("OTA "), 5);
|
||||
break;
|
||||
case TAG_FWUP:
|
||||
memcpy_P(buffer, PSTR("FWUP"), 5);
|
||||
break;
|
||||
|
||||
case TAG_LVGL:
|
||||
memcpy_P(buffer, PSTR("LVGL"), 5);
|
||||
break;
|
||||
case TAG_LVFS:
|
||||
memcpy_P(buffer, PSTR("LVFS"), 5);
|
||||
break;
|
||||
case TAG_FONT:
|
||||
memcpy_P(buffer, PSTR("FONT"), 5);
|
||||
break;
|
||||
|
||||
default:
|
||||
memcpy_P(buffer, PSTR("----"), 5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void debugPrintHaspMemory(int level, Print* _logOutput)
|
||||
{
|
||||
#ifdef ARDUINO
|
||||
size_t maxfree = haspDevice.get_free_max_block();
|
||||
size_t totalfree = haspDevice.get_free_heap();
|
||||
uint8_t frag = haspDevice.get_heap_fragmentation();
|
||||
|
||||
/* Print HASP Memory Info */
|
||||
if(debugAnsiCodes) {
|
||||
if(maxfree > (1024u * 5) && (totalfree > 1024u * 6) && (frag <= 10))
|
||||
debugSendAnsiCode(F(TERM_COLOR_GREEN), _logOutput);
|
||||
else if(maxfree > (1024u * 3) && (totalfree > 1024u * 5) && (frag <= 20))
|
||||
debugSendAnsiCode(F(TERM_COLOR_ORANGE), _logOutput);
|
||||
else
|
||||
debugSendAnsiCode(F(TERM_COLOR_RED), _logOutput);
|
||||
}
|
||||
_logOutput->printf(PSTR("[%5u/%5u%3u]"), maxfree, totalfree, frag);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void debugPrintLvglMemory(int level, Print* _logOutput)
|
||||
{
|
||||
#if LV_MEM_CUSTOM == 0
|
||||
lv_mem_monitor_t mem_mon;
|
||||
lv_mem_monitor(&mem_mon);
|
||||
|
||||
/* Print LVGL Memory Info */
|
||||
if(debugAnsiCodes) {
|
||||
if(mem_mon.free_biggest_size > (1024u * 2) && (mem_mon.free_size > 1024u * 2.5) && (mem_mon.frag_pct <= 10))
|
||||
debugSendAnsiCode(F(TERM_COLOR_GREEN), _logOutput);
|
||||
else if(mem_mon.free_biggest_size > (1024u * 1) && (mem_mon.free_size > 1024u * 1.5) &&
|
||||
(mem_mon.frag_pct <= 25))
|
||||
debugSendAnsiCode(F(TERM_COLOR_ORANGE), _logOutput);
|
||||
else
|
||||
debugSendAnsiCode(F(TERM_COLOR_RED), _logOutput);
|
||||
}
|
||||
|
||||
#ifdef ARDUINO
|
||||
_logOutput->printf(PSTR("[%5u/%5u%3u]"), mem_mon.free_biggest_size, mem_mon.free_size, mem_mon.frag_pct);
|
||||
#else
|
||||
debug_print(_logOutput, PSTR("[%5u/%5u%3u]"), mem_mon.free_biggest_size, mem_mon.free_size, mem_mon.frag_pct);
|
||||
#endif // ARDUINO
|
||||
|
||||
#endif // LV_MEM_CUSTOM
|
||||
}
|
||||
|
||||
static void debugPrintPriority(int level, Print* _logOutput)
|
||||
{
|
||||
// if(_logOutput == &syslogClient) {
|
||||
// }
|
||||
|
||||
switch(level) {
|
||||
case LOG_LEVEL_FATAL ... LOG_LEVEL_ERROR:
|
||||
debugSendAnsiCode(F(TERM_COLOR_RED), _logOutput);
|
||||
break;
|
||||
case LOG_LEVEL_WARNING:
|
||||
debugSendAnsiCode(F(TERM_COLOR_YELLOW), _logOutput);
|
||||
break;
|
||||
case LOG_LEVEL_NOTICE:
|
||||
debugSendAnsiCode(F(TERM_COLOR_WHITE), _logOutput);
|
||||
break;
|
||||
case LOG_LEVEL_TRACE:
|
||||
debugSendAnsiCode(F(TERM_COLOR_GRAY), _logOutput);
|
||||
break;
|
||||
case LOG_LEVEL_VERBOSE:
|
||||
debugSendAnsiCode(F(TERM_COLOR_CYAN), _logOutput);
|
||||
break;
|
||||
case LOG_LEVEL_DEBUG:
|
||||
debugSendAnsiCode(F(TERM_COLOR_BLUE), _logOutput);
|
||||
break;
|
||||
case LOG_LEVEL_OUTPUT:
|
||||
default:
|
||||
debugSendAnsiCode(F(TERM_COLOR_RESET), _logOutput);
|
||||
}
|
||||
}
|
||||
|
||||
void debugPrintPrefix(uint8_t tag, int level, Print* _logOutput)
|
||||
{
|
||||
char buffer[10];
|
||||
|
||||
#if 0 && HASP_USE_SYSLOG > 0
|
||||
|
||||
if(_logOutput == syslogClient && syslogClient) {
|
||||
if(syslogClient->beginPacket(debugSyslogHost, debugSyslogPort)) {
|
||||
|
||||
// IETF Doc: https://tools.ietf.org/html/rfc5424 - The Syslog Protocol
|
||||
// BSD Doc: https://tools.ietf.org/html/rfc3164 - The BSD syslog Protocol
|
||||
|
||||
syslogClient->print(F("<"));
|
||||
syslogClient->print((16 + debugSyslogFacility) * 8 + level);
|
||||
syslogClient->print(F(">"));
|
||||
|
||||
if(debugSyslogProtocol == SYSLOG_PROTO_IETF) {
|
||||
syslogClient->print(F("1 - "));
|
||||
}
|
||||
|
||||
debug_get_tag(tag, buffer);
|
||||
syslogClient->print(F("%s %s"), haspDevice.get_hostname(), buffer);
|
||||
|
||||
if(debugSyslogProtocol == SYSLOG_PROTO_IETF) {
|
||||
syslogClient->print(F(" - - - \xEF\xBB\xBF")); // include UTF-8 BOM
|
||||
} else {
|
||||
syslogClient->print(F(": "));
|
||||
}
|
||||
|
||||
debugPrintHaspMemory(level, _logOutput);
|
||||
debugPrintLvglMemory(level, _logOutput);
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif // HASP_USE_SYSLOG
|
||||
|
||||
debugSendAnsiCode(F(TERM_CLEAR_LINE), _logOutput);
|
||||
debugPrintTimestamp(level, _logOutput);
|
||||
debugPrintHaspMemory(level, _logOutput);
|
||||
debugPrintLvglMemory(level, _logOutput);
|
||||
|
||||
if(tag == TAG_MQTT_PUB && level == LOG_LEVEL_NOTICE) {
|
||||
debugSendAnsiCode(F(TERM_COLOR_GREEN), _logOutput);
|
||||
} else if(tag == TAG_MQTT_RCV && level == LOG_LEVEL_NOTICE) {
|
||||
debugSendAnsiCode(F(TERM_COLOR_ORANGE), _logOutput);
|
||||
} else {
|
||||
debugPrintPriority(level, _logOutput);
|
||||
}
|
||||
|
||||
debug_get_tag(tag, buffer);
|
||||
#ifdef ARDUINO
|
||||
_logOutput->printf(PSTR(" %s: "), buffer);
|
||||
#else
|
||||
debug_print(_logOutput, PSTR(" %s: "), buffer);
|
||||
#endif
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user