Compare commits

...

8 Commits

Author SHA1 Message Date
JiXieShi
b8700ac88b 🧹 chore(.gitignore): 移除 SDL3 文件夹的忽略规则 2024-12-19 23:34:00 +08:00
JiXieShi
3c54795451 Revert "🔧 fix(file): 修复文件路径错误导致的加载问题"
This reverts commit 6d8133489b.
2024-12-19 23:01:11 +08:00
JiXieShi
6d8133489b 🔧 fix(file): 修复文件路径错误导致的加载问题
 feat(topic): 添加新功能以支持多语言翻译
🐛 fix(ui): 修复用户界面在移动设备上的显示问题
📚 docs(readme): 更新 README 文件以包含安装说明
2024-12-19 22:58:36 +08:00
JiXieShi
040b9be6b9 feat(sim/oled): 移除未使用的头文件 "graphics.h" 和 "conio.h"
 feat(lib/CMakeLists.txt): 添加 LUI 库支持

 feat(lib/utils/inc/argpase.h): 引入 "stdbool.h" 以支持布尔类型

 feat(sim/display/sim_display.cpp): 重新引入 "graphics.h" 和 "conio.h" 以修复依赖

 feat(sim/lvgl/lv_port_indev.cpp): 移除未使用的头文件 "graphics.h" 和 "easyx.h"

 feat(main.c): 添加 LUI 库支持以增强功能

 feat(lib/lui/lame_ui.c): 新增 LUI 库实现以支持 UI 组件
2024-12-19 22:49:08 +08:00
JiXieShi
fd68396b30 feat(lib): 添加哈希表实现及相关测试功能
🐛 fix(main): 修改OLED显示位置和配置
📝 docs(demo/list/test.c): 更新测试文件,添加哈希表测试用例
2024-12-19 22:46:30 +08:00
JiXieShi
23116b7e3d feat(lib): 添加哈希表实现及相关测试功能
🐛 fix(main): 修改OLED显示位置和配置
📝 docs(demo/list/test.c): 更新测试文件,添加哈希表测试用例
2024-12-16 23:40:13 +08:00
JiXieShi
3709d3d284 feat(.vscode/tasks.json): 添加 CMake 配置任务以支持项目配置和构建。 2024-12-15 23:16:46 +08:00
JiXieShi
58ead967ff 🎨 refactor(.vscode/tasks.json): 移除CMake配置任务,添加并行编译线程数的输入选项
🐛 fix(demo/oled/test.c): 优化代码可读性
2024-12-15 23:09:55 +08:00
22 changed files with 10638 additions and 73 deletions

5
.vscode/launch.json vendored
View File

@@ -1,7 +1,4 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
@@ -10,7 +7,7 @@
"request": "launch",
"program": "${workspaceFolder}/build/HW_Lib",
"args": [],
"stopAtEntry": true,
"stopAtEntry": false,
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "CMake Build",
"environment": [],

12
.vscode/tasks.json vendored
View File

@@ -54,7 +54,9 @@
"--build",
"build",
"--target",
"all"
"all",
"--",
"-j${input:threadCount}"
],
"group": {
"kind": "build",
@@ -63,7 +65,7 @@
"problemMatcher": [
"$gcc"
],
"detail": "Build the project using CMake and Ninja."
"detail": "Build the project using CMake with parallel compilation."
}
],
"inputs": [
@@ -78,6 +80,12 @@
],
"default": "Ninja",
"description": "The CMake generator to use."
},
{
"type": "promptString",
"id": "threadCount",
"description": "Number of parallel compilation threads",
"default": "8"
}
]
}

View File

@@ -39,7 +39,7 @@ add_executable(HW_Lib main.c ${SOURCES})
add_subdirectory(lib)
target_link_libraries(HW_Lib HW_LIB_List HW_LIB_Task HW_LIB_Printf HW_LIB_Utils HW_LIB_Iic
HW_LIB_Spi HW_LIB_Key HW_LIB_Oled HW_LIB_Font HW_LIB_Tft lvgl::lvgl lvgl::examples lvgl::demos
HW_LIB_Spi HW_LIB_Key HW_LIB_Oled HW_LIB_Font HW_LIB_Tft lvgl::lvgl HW_LIB_Lui
)
add_custom_command(TARGET HW_Lib POST_BUILD

2
SDL3

Submodule SDL3 updated: 10734d9422...89c6bc5f50

View File

@@ -8,4 +8,6 @@
extern int Test_List(void *pVoid);
extern int Test_Queue(void *pVoid1);
extern int Test_Hash(void* pVoid);
#endif //HW_LIB_T_LIST_H

View File

@@ -3,6 +3,7 @@
#include "list.h"
#include "queue.h"
#include "hash_table.h"
typedef struct test {
int val1;
@@ -100,6 +101,7 @@ int Test_List(void *pVoid) {
// 测试销毁操作
printf("-----destroy----\n");
list_destroy(&list, NULL); // 销毁链表
return 0;
}
int Test_Queue(void *pVoid) {
@@ -141,4 +143,16 @@ int Test_Queue(void *pVoid) {
printf("Pop value from front: %d\n", *popVal);
}
delQueue_List(deque);
return 0;
}
int Test_Hash(void* pVoid) {
Hash_Table_t* ht = ht_new();
ht_insert(ht, "name", "lydxh");
ht_insert(ht, "age", "18");
printf("Name:%s\nAge:%s", ht_search(ht, "name"), ht_search(ht, "age"));
ht_delete(ht, "name");
ht_delete(ht, "age");
ht_del_hash_table(ht);
return 0;
}

View File

@@ -41,7 +41,7 @@ int Test_lvgl(void *pVoid) {
// lv_port_indev_init();
// lv_example_get_started_1();
lv_demo_widgets();
// lv_demo_widgets();
// printf("\nTEST Widgets\n");
while (1) {

View File

@@ -9,33 +9,33 @@
#include "sim_key.h"
#include "page.h"
uint8_t Cmd(uint8_t *data, size_t l) {
// Buf_Print("Cmd", data, l, 16);
uint8_t Cmd(uint8_t* data, size_t l) {
// Buf_Print("Cmd", data, l, 16);
}
uint8_t Data(uint8_t *data, size_t l) {
// Buf_Print("Data", data, l, 16);
uint8_t Data(uint8_t* data, size_t l) {
// Buf_Print("Data", data, l, 16);
}
void Refresh_Call(OLED_T *dev) {
// LOGT("OLED", "CALL");
// Buf_Print("Buf", dev->buf, dev->width * (dev->height / 8), 128);
void Refresh_Call(OLED_T* dev) {
// LOGT("OLED", "CALL");
// Buf_Print("Buf", dev->buf, dev->width * (dev->height / 8), 128);
SIM_OLED_DrawFromBuffer(dev->buf, dev->width, dev->height / 8);
}
uint8_t oledbuf[8][128] = {0};
void Key_Call_E(Key_t *key) {
void Key_Call_E(Key_t* key) {
switch (key->event) {
case KEY_PRESS_DOWN:
// LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "PressTheEvent");
break;// 按下事件
// LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "PressTheEvent");
break; // 按下事件
case KEY_PRESS_UP:
// LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "BounceIncident");
break;// 弹起事件
// LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "BounceIncident");
break; // 弹起事件
case KEY_PRESS_REPEAT:
LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "RepeatThePressEvent");
break;// 重复按下事件
break; // 重复按下事件
case KEY_SINGLE_CLICK:
LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "ClickEvent");
if (key->key_id == SIM_KEY_UP)cur--;
@@ -57,25 +57,25 @@ void Key_Call_E(Key_t *key) {
if (cur == pagesearch(pageid).curmax)pageid = 0;
break;
case 4:
if(cnt_f==1)cnt_f=0;
else cnt_f=1;
if (cnt_f == 1)cnt_f = 0;
else cnt_f = 1;
break;
}
}
break;// 单击事件
break; // 单击事件
case KEY_DOUBLE_CLICK:
LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "DoubleClickTheEvent");
break;// 双击事件
break; // 双击事件
case KEY_LONG_PRESS_START:
// LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "LongPressToStartTheEvent");
break;// 长按开始事件
// LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "LongPressToStartTheEvent");
break; // 长按开始事件
case KEY_LONG_PRESS_HOLD:
LOGT("KEY", "ID:%d EVENT:%s", key->key_id, "LongPressToHoldTheEvent");
break;// 长按保持事件
break; // 长按保持事件
}
}
void Get_Key(void *pVoid) {
void Get_Key(void* pVoid) {
Key_t k1, k2, k3, k4, k5, k6, k7;
key_init(&k1, SIM_KEY_UP, 1, SIM_Key_UP);
key_init(&k2, SIM_KEY_DOWN, 1, SIM_Key_DOWN);
@@ -102,22 +102,22 @@ void Get_Key(void *pVoid) {
}
OLED_T oled = {
.height=64,
.width=128,
.state=IDLE,
.buf=oledbuf,
.cmd=Cmd,
.data=Data,
.call=Refresh_Call,
.height = 64,
.width = 128,
.state = IDLE,
.buf = oledbuf[0],
.cmd = Cmd,
.data = Data,
.call = Refresh_Call,
};
int Test_OLED(void *pVoid) {
int Test_OLED(void* pVoid) {
SIM_OLED_INIT(128, 64, CYAN, 0x0, 5, 0);
OLED_Init(&oled);
OLED_CLS(&oled);
OLED_ShowCHString(&oled, 1, 24, "星海科技机械师");
OLED_ShowCHString(&oled, 1, 1, "星海科技机械师");
OLED_DrawRect(&oled, 0, 0, 127, 63);
@@ -125,22 +125,22 @@ int Test_OLED(void *pVoid) {
Sleep(3000);
// extern lv_font_t myFont;
// OLED_DisplayString(&oled, &myFont, "班级", 2, 1);
// extern lv_font_t myFont;
// OLED_DisplayString(&oled, &myFont, "班级", 2, 1);
// OLED_ShowPic(&oled, 0, 0, 64, 64, BMP1);
// OLED_ShowPic(&oled, 0, 0, 64, 64, BMP1);
OLED_Refresh(&oled);
_beginthread(Get_Key, 0, NULL);
// pageinit();
// pageinit();
while (1) {
// if (pageid > 4)pageid = 0;
// item_h = pagesearch(pageid).item_h;
// item_w = pagesearch(pageid).item_w;
//// pagesearch(pageid).page(&oled);
//// sprintf(buf, "DATA:%d", s);
//// OLED_ShowString(&oled, 2, 51, buf, 12);
// OLED_Refresh(&oled);
Sleep(200);
// if (pageid > 4)pageid = 0;
// item_h = pagesearch(pageid).item_h;
// item_w = pagesearch(pageid).item_w;
//// pagesearch(pageid).page(&oled);
//// sprintf(buf, "DATA:%d", s);
//// OLED_ShowString(&oled, 2, 51, buf, 12);
// OLED_Refresh(&oled);
Sleep(200);
}
SIM_OLED_STOP();
}

View File

@@ -11,6 +11,7 @@ set(LIBRARIES
HW_LIB_Oled oled oled/inc
HW_LIB_Tft tft tft/inc
HW_LIB_Flash flash flash/inc
HW_LIB_Lui lui lui/inc
)
# 循环浏览库列表以创建它们

View File

@@ -6,7 +6,7 @@ extern "C" {
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#define KEY_TICKS_INTERVAL 5 // 定时器间隔时间,单位为毫秒
#define DEBOUNCE_TICKS 0 // 按键去抖动计数阈值最大为70 ~ 7
#define SHORT_TICKS (300 / KEY_TICKS_INTERVAL) // 短按阈值,单位为定时器间隔的倍数

183
lib/list/hash_table.cpp Normal file
View File

@@ -0,0 +1,183 @@
#include "hash_table.h"
#include <stdlib.h>
#include <string.h>
#include <math.h>
static Hash_Item_t HT_DELETED_ITEM = {NULL, NULL};
static Hash_Item_t* ht_new_item(const char* k, const char* v) {
Hash_Item_t* i = (Hash_Item_t*)malloc(sizeof(Hash_Item_t));
i->key = strdup(k);
i->value = strdup(v);
return i;
}
static int ht_hash(const char* s, const int a, const int m) {
long hash = 0;
const int len_s = strlen(s);
for (int i = 0; i < len_s; i++) {
hash += (long)pow(a, len_s - (i+1)) * s[i];
hash = hash % m;
}
return (int)hash;
}
static int ht_get_hash(
const char* s, const int num_buckets, const int attempt
) {
const int hash_a = ht_hash(s, HT_PRIME_1, num_buckets);
const int hash_b = ht_hash(s, HT_PRIME_2, num_buckets);
return (hash_a + (attempt * (hash_b + 1))) % num_buckets;
}
static void ht_del_item(Hash_Item_t* i) {
free(i->key);
free(i->value);
free(i);
}
void ht_del_hash_table(Hash_Table_t* ht) {
for (int i = 0; i < ht->size; i++) {
Hash_Item_t* item = ht->items[i];
if (item != NULL) {
ht_del_item(item);
}
}
free(ht->items);
free(ht);
}
int is_prime(const int x) {
if (x < 2) { return -1; }
if (x < 4) { return 1; }
if ((x % 2) == 0) { return 0; }
for (int i = 3; i <= floor(sqrt((double) x)); i += 2) {
if ((x % i) == 0) {
return 0;
}
}
return 1;
}
int next_prime(int x) {
while (is_prime(x) != 1) {
x++;
}
return x;
}
static Hash_Table_t* ht_new_sized(const int base_size) {
Hash_Table_t* ht = (Hash_Table_t*)malloc(sizeof(Hash_Table_t));
ht->base_size = base_size;
ht->size = next_prime(ht->base_size);
ht->count = 0;
ht->items = (Hash_Item_t**) calloc((size_t)ht->size, sizeof(Hash_Item_t*));
return ht;
}
Hash_Table_t* ht_new() {
return ht_new_sized(HT_INITIAL_BASE_SIZE);
}
static void ht_resize(Hash_Table_t* ht, const int base_size) {
if (base_size < HT_INITIAL_BASE_SIZE) {
return;
}
Hash_Table_t* new_ht = ht_new_sized(base_size);
for (int i = 0; i < ht->size; i++) {
Hash_Item_t* item = ht->items[i];
if (item != NULL && item != &HT_DELETED_ITEM) {
ht_insert(new_ht, item->key, item->value);
}
}
ht->base_size = new_ht->base_size;
ht->count = new_ht->count;
// To delete new_ht, we give it ht's size and items
const int tmp_size = ht->size;
ht->size = new_ht->size;
new_ht->size = tmp_size;
Hash_Item_t** tmp_items = ht->items;
ht->items = new_ht->items;
new_ht->items = tmp_items;
ht_del_hash_table(new_ht);
}
static void ht_resize_up(Hash_Table_t* ht) {
const int new_size = ht->base_size * 2;
ht_resize(ht, new_size);
}
static void ht_resize_down(Hash_Table_t* ht) {
const int new_size = ht->base_size / 2;
ht_resize(ht, new_size);
}
void ht_insert(Hash_Table_t* ht, const char* key, const char* value) {
const int load = ht->count * 100 / ht->size;
if (load > 70) {
ht_resize_up(ht);
}
Hash_Item_t* item = ht_new_item(key, value);
int index = ht_get_hash(item->key, ht->size, 0);
Hash_Item_t* cur_item = ht->items[index];
int i = 1;
while (cur_item != NULL) {
if (cur_item != &HT_DELETED_ITEM) {
if (strcmp(cur_item->key, key) == 0) {
ht_del_item(cur_item);
ht->items[index] = item;
return;
}
}
index = ht_get_hash(item->key, ht->size, i);
cur_item = ht->items[index];
i++;
}
ht->items[index] = item;
ht->count++;
}
char* ht_search(Hash_Table_t* ht, const char* key) {
int index = ht_get_hash(key, ht->size, 0);
Hash_Item_t* item = ht->items[index];
int i = 1;
while (item != NULL) {
if (item != &HT_DELETED_ITEM) {
if (strcmp(item->key, key) == 0) {
return item->value;
}
}
index = ht_get_hash(key, ht->size, i);
item = ht->items[index];
i++;
}
return NULL;
}
void ht_delete(Hash_Table_t* ht, const char* key) {
const int load = ht->count * 100 / ht->size;
if (load < 10) {
ht_resize_down(ht);
}
int index = ht_get_hash(key, ht->size, 0);
Hash_Item_t* item = ht->items[index];
int i = 1;
while (item != NULL) {
if (item != &HT_DELETED_ITEM) {
if (strcmp(item->key, key) == 0) {
ht_del_item(item);
ht->items[index] = &HT_DELETED_ITEM;
}
}
index = ht_get_hash(key, ht->size, i);
item = ht->items[index];
i++;
}
ht->count--;
}

36
lib/list/inc/hash_table.h Normal file
View File

@@ -0,0 +1,36 @@
#pragma once
#ifndef HW_LIB_HASH_TABLE_H
#define HW_LIB_HASH_TABLE_H
#ifdef __cplusplus
extern "C" {
#endif
#define HT_PRIME_1 151
#define HT_PRIME_2 163
#define HT_INITIAL_BASE_SIZE 53
typedef struct Hash_Item
{
char* key;
char* value;
} Hash_Item_t;
typedef struct Hash_Table
{
int base_size;
int size;
int count;
Hash_Item_t** items;
} Hash_Table_t;
Hash_Table_t* ht_new();
void ht_del_hash_table(Hash_Table_t* ht);
void ht_insert(Hash_Table_t* ht, const char* key, const char* value);
char* ht_search(Hash_Table_t* ht, const char* key);
void ht_delete(Hash_Table_t* h, const char* key);
#ifdef __cplusplus
}
#endif
#endif //HW_LIB_HASH_TABLE_H

3948
lib/lui/inc/lame_ui.h Normal file

File diff suppressed because it is too large Load Diff

6376
lib/lui/lame_ui.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#include "stdbool.h"
#include "stdint.h"

View File

@@ -3,6 +3,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#include "stdbool.h"
typedef char OptId;
typedef struct Option {

View File

@@ -5,7 +5,6 @@
#include <ctime>
#include <stdint.h>
#include <cstdlib>
#include <syncstream>
#include "tool.h"
float Mapping(float val, float I_Min, float I_Max, float O_Min, float O_Max) {

8
main.c
View File

@@ -12,7 +12,7 @@
#include "t_tft.h"
#include "tool.h"
#include "sim_test.h"
#include "t_lui.h"
#include <windows.h>
#include <stdint.h>
#include <SDL3/SDL.h>
@@ -34,7 +34,7 @@ int main(int argc, char *argv[]) {
srand((unsigned) time(NULL));
// SDL_Log("Hello, SDL3!");
// SDL_Log("Hello, SDL3!");
// int count = SDL_GetNumRenderDrivers();
// for (int i = 0; i < count; ++i) {
// const char* name = SDL_GetRenderDriver(i);
@@ -160,9 +160,11 @@ int main(int argc, char *argv[]) {
// Test_Run("List", Test_List,NULL);
// Test_RunTime("Key", Test_Key);
// Test_RunTime("Queue", Test_Queue);
// Test_RunTime("Hash", Test_Hash);
// Test_RunTime("Task", Test_task);
Test_RunTime("OLED", Test_OLED);
// Test_RunTime("OLED", Test_OLED);
// Test_RunTime("LVGL", Test_lvgl);
// Test_RunTime("TFT", Test_tft);
Test_RunTime("LUI", Test_lui);
return 0;
}

View File

@@ -4,7 +4,6 @@
#include <ctime>
#include <cstdio>
#include <syncstream>
#include "sim_test.h"
void Test_RunTime(char *name, int (*pFunction)(void *)) {

View File

@@ -1,6 +1,5 @@
#include "sim_display.h"
#include "graphics.h"
#include <conio.h>
#define GET_BIT(x, bit) ((x & (1 << bit)) >> bit)
@@ -20,6 +19,10 @@ uint32_t RGB565_to_ARGB8888(uint16_t rgb565, bool isBGR) {
}
}
#ifndef USER_SDL3
#include "graphics.h"
#include <conio.h>
static uint32_t pixelColor, backgroundColor;
static int scaleFactor, w, h;
uint8_t border;

View File

@@ -12,8 +12,6 @@
*********************/
#include "lv_port_indev.h"
#include "lvgl.h"
#include "graphics.h"
#include <easyx.h>
/*********************
* DEFINES
*********************/
@@ -253,8 +251,8 @@ static void mouse_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
static bool mouse_is_pressed(void)
{
/*Your code comes here*/
ExMessage msg;peekmessage(&msg, EM_MOUSE);
if(msg.message==WM_LBUTTONDOWN) return true;
// ExMessage msg;peekmessage(&msg, EM_MOUSE);
// if(msg.message==WM_LBUTTONDOWN) return true;
return false;
}
@@ -262,13 +260,13 @@ static bool mouse_is_pressed(void)
static void mouse_get_xy(lv_coord_t * x, lv_coord_t * y)
{
/*Your code comes here*/
ExMessage msg;
if(peekmessage(&msg, EM_MOUSE))
{
(*x) = msg.x;
(*y) = msg.y;
printf("\nX:%d,Y:%d",*x,*y);
}
// ExMessage msg;
// if(peekmessage(&msg, EM_MOUSE))
// {
// (*x) = msg.x;
// (*y) = msg.y;
// printf("\nX:%d,Y:%d",*x,*y);
// }
}
/*------------------

View File

@@ -1,6 +1,4 @@
#include "sim_oled.h"
#include "graphics.h"
#include <conio.h>
static SIM_Display_t oled_display;
void SIM_OLED_INIT(int width, int height, uint32_t pixcolor, uint32_t backcolor, int scale, uint8_t b) {