526 lines
21 KiB
C
526 lines
21 KiB
C
#include <stdio.h> // 标准输入输出
|
||
#include <unistd.h> // POSIX标准接口
|
||
#include <string.h> // 字符串处理(操作字符数组)
|
||
|
||
#include "ohos_init.h" // 用于初始化服务(services)和功能(features)
|
||
#include "cmsis_os2.h" // CMSIS-RTOS API V2
|
||
|
||
#include "wifi_connecter.h" // easy wifi (station模式)
|
||
#include "oled_ssd1306.h" // OLED驱动接口
|
||
#include "json_parser.h"
|
||
#include "display_helper.h" // 显示辅助函数
|
||
#include "robot_sg90.h" // 舵机控制接口
|
||
#include "iot_gpio.h"
|
||
#include "hi_io.h"
|
||
#include "hi_time.h"
|
||
#include "iot_gpio.h"
|
||
#include "hi_adc.h"
|
||
#include "iot_errno.h"
|
||
#if 1
|
||
// 定义一个宏,用于标识SSID。请根据实际情况修改
|
||
#define PARAM_HOTSPOT_SSID "tarikPura"
|
||
|
||
// 定义一个宏,用于标识密码。请根据实际情况修改
|
||
#define PARAM_HOTSPOT_PSK "66668888"
|
||
#elif
|
||
#define PARAM_HOTSPOT_SSID "DYJY"
|
||
|
||
// 定义一个宏,用于标识密码。请根据实际情况修改
|
||
#define PARAM_HOTSPOT_PSK "12345678"
|
||
#endif
|
||
// 定义一个宏,用于标识加密方式
|
||
#define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK
|
||
|
||
// 定义一个宏,用于标识UDP服务器IP地址。请根据实际情况修改
|
||
#define PARAM_SERVER_ADDR "192.168.43.137"
|
||
|
||
#define GPIO5 5
|
||
#define ADC_TEST_LENGTH (20)
|
||
#define VLT_MIN (100)
|
||
#define KEY_INTERRUPT_PROTECT_TIME (30)
|
||
|
||
unsigned short g_adc_buf[ADC_TEST_LENGTH] = { 0 };
|
||
unsigned short g_gpio5_adc_buf[ADC_TEST_LENGTH] = { 0 };
|
||
unsigned int g_gpio5_tick = 0;
|
||
|
||
int control_flag = 0;
|
||
extern char response[128];
|
||
extern JsonCommand g_current_command; // 外部声明JSON命令变量
|
||
|
||
// 舵机控制函数声明
|
||
extern void servo_rotate_clockwise_90(void);
|
||
extern void servo_rotate_counter_clockwise_90(void);
|
||
extern void regress_middle(void);
|
||
|
||
uint8_t fonts3[] = {
|
||
|
||
/*-- ID:0,字符:"京",ASCII编码:BEA9,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x08,0x08,0x08,0xe8,0x28,0x28,0x29,0x2e,0x28,0x28,0x28,0xf8,0x28,0x0c,0x08,0x00,
|
||
0x00,0x00,0x40,0x23,0x1a,0x42,0x82,0x7e,0x02,0x0a,0x12,0x33,0x60,0x00,0x00,0x00,
|
||
|
||
/*-- ID:1,字符:"沪",ASCII编码:BBA6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x22,0x64,0x0c,0x80,0x00,0xf8,0x88,0x89,0x8a,0x8e,0x88,0x88,0xfc,0x08,0x00,
|
||
0x04,0x04,0xfc,0x03,0x80,0x60,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
|
||
|
||
/*-- ID:2,字符:"津",ASCII编码:BDF2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x20,0x42,0xc4,0x0c,0x10,0x54,0x54,0x54,0xff,0x54,0x54,0x54,0x7e,0x14,0x10,0x00,
|
||
0x04,0x04,0xfc,0x02,0x11,0x12,0x12,0x12,0xff,0x12,0x12,0x13,0x1a,0x10,0x00,0x00,
|
||
|
||
/*-- ID:3,字符:"渝",ASCII编码:D3E5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x22,0x64,0x0c,0xa0,0xd0,0x48,0x54,0xd2,0x13,0x94,0x08,0xd0,0x30,0x10,0x00,
|
||
0x04,0x04,0xfe,0x01,0x00,0xff,0x12,0x92,0xff,0x00,0x5f,0x80,0x7f,0x00,0x00,0x00,
|
||
|
||
/*-- ID:4,字符:"冀",ASCII编码:BCBD,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x08,0x0a,0xea,0xaa,0xaa,0xaa,0xaf,0xe0,0xaf,0xaa,0xaa,0xaa,0xfa,0x28,0x0c,0x00,
|
||
0x20,0xa0,0xab,0x6a,0x2a,0x3e,0x2a,0x2b,0x2a,0x3e,0x2a,0x6a,0xab,0xa0,0x20,0x00,
|
||
|
||
/*-- ID:5,字符:"晋",ASCII编码:BDFA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x42,0x4a,0x52,0x42,0x7e,0x42,0x42,0x42,0x7e,0x42,0xd2,0x4b,0x62,0x40,0x00,
|
||
0x00,0x00,0x00,0xff,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xff,0x01,0x00,0x00,0x00,
|
||
|
||
/*-- ID:6,字符:"蒙",ASCII编码:C3C9,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x20,0x9a,0x8a,0x8a,0xaa,0xaf,0xaa,0xaa,0xaa,0xaf,0xaa,0x8a,0x8b,0xaa,0x18,0x00,
|
||
0x00,0x50,0x52,0x2a,0x2a,0x15,0x4b,0x86,0x7c,0x04,0x0a,0x13,0x20,0x60,0x20,0x00,
|
||
|
||
/*-- ID:7,字符:"辽",ASCII编码:C1C9,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0x21,0x22,0xe6,0x00,0x02,0x02,0x02,0x02,0xf2,0x12,0x0a,0x06,0x02,0x00,0x00,
|
||
0x00,0x40,0x20,0x1f,0x20,0x40,0x40,0x48,0x50,0x4f,0x40,0x40,0x40,0x60,0x20,0x00,
|
||
|
||
/*-- ID:8,字符:"吉",ASCII编码:BCAA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x08,0x08,0x88,0x88,0x88,0x88,0x88,0xff,0x88,0x88,0x88,0xc8,0x88,0x0c,0x08,0x00,
|
||
0x00,0x00,0x00,0xfc,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xfe,0x04,0x00,0x00,0x00,
|
||
|
||
/*-- ID:9,字符:"黑",ASCII编码:BADA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0x00,0xfe,0x8a,0x92,0xb2,0x82,0xfe,0x82,0xa2,0x9a,0x92,0xff,0x02,0x00,0x00,
|
||
0x08,0x8a,0x6a,0x0a,0x2a,0xca,0x0a,0x0f,0x2a,0xca,0x0a,0x2a,0x4a,0xca,0x08,0x00,
|
||
|
||
/*-- ID:10,字符:"苏",ASCII编码:CBD5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x04,0x04,0x44,0x44,0x5f,0x44,0xf4,0x44,0x44,0x44,0x5f,0xe4,0x44,0x06,0x04,0x00,
|
||
0x00,0x88,0x46,0x20,0x10,0x0c,0x03,0x00,0x00,0x40,0x80,0x7f,0x02,0x04,0x0c,0x00,
|
||
|
||
/*-- ID:11,字符:"浙",ASCII编码:D5E3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x22,0x64,0x0c,0x90,0x10,0xff,0x10,0x90,0xfc,0x44,0x44,0xc2,0x62,0x40,0x00,
|
||
0x04,0x04,0xfe,0x01,0x42,0x82,0x7f,0x41,0x20,0x1f,0x00,0x00,0xff,0x00,0x00,0x00,
|
||
|
||
/*-- ID:12,字符:"皖",ASCII编码:CDEE,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0xf8,0x8c,0x8b,0x88,0xf8,0x10,0x0c,0x24,0x25,0x26,0x34,0x24,0x94,0x0c,0x00,
|
||
0x00,0x3f,0x10,0x10,0x10,0xbf,0x41,0x31,0x0f,0x01,0x01,0x3f,0x41,0x41,0x71,0x00,
|
||
|
||
/*-- ID:13,字符:"闽",ASCII编码:C3F6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0xfc,0x01,0x02,0xe6,0x20,0x22,0xfa,0x22,0x22,0xf2,0x22,0x02,0xff,0x02,0x00,
|
||
0x00,0xff,0x00,0x20,0x27,0x22,0x22,0x3f,0x12,0x12,0x1b,0x70,0x80,0x7f,0x00,0x00,
|
||
|
||
/*-- ID:14,字符:"赣",ASCII编码:B8D3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x12,0xd6,0x5a,0x53,0x5a,0xd6,0x12,0x28,0x64,0x57,0xca,0x56,0x52,0x20,0x20,0x00,
|
||
0x10,0x17,0x15,0xfd,0x15,0x17,0x10,0x81,0xbd,0x45,0x35,0x45,0x7d,0x81,0x00,0x00,
|
||
|
||
/*-- ID:15,字符:"鲁",ASCII编码:C2B3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x10,0xf8,0xac,0xaa,0xab,0xaa,0xfa,0xae,0xaa,0xaa,0xa8,0xfc,0x08,0x00,0x00,
|
||
0x02,0x02,0x02,0xfa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xfe,0x0a,0x02,0x02,0x00,
|
||
|
||
/*-- ID:16,字符:"豫",ASCII编码:D4A5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x42,0x52,0xe2,0x5a,0xc6,0x50,0xf8,0x94,0xd3,0xba,0x96,0x92,0xf8,0x10,0x00,
|
||
0x00,0x40,0x80,0x7f,0x00,0x10,0x54,0x4a,0x25,0x92,0xfc,0x0c,0x12,0x61,0x20,0x00,
|
||
|
||
/*-- ID:17,字符:"鄂",ASCII编码:B6F5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0x5e,0x52,0x5e,0x40,0x5e,0x52,0x5e,0x00,0xfe,0x02,0x42,0xb2,0x0e,0x00,0x00,
|
||
0x01,0x01,0x0d,0x4b,0x89,0x89,0x7d,0x09,0x01,0xff,0x08,0x10,0x20,0x11,0x0e,0x00,
|
||
|
||
/*-- ID:18,字符:"湘",ASCII编码:CFE6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x22,0x64,0x0c,0x10,0xd0,0xff,0x90,0x10,0xfc,0x44,0x44,0x44,0xfe,0x04,0x00,
|
||
0x04,0x04,0xfe,0x05,0x03,0x00,0xff,0x00,0x01,0xff,0x44,0x44,0x44,0xff,0x00,0x00,
|
||
|
||
/*-- ID:19,字符:"粤",ASCII编码:D4C1,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0x00,0x00,0xfe,0x92,0xd6,0x93,0xfe,0x92,0xd6,0x92,0xff,0x02,0x00,0x00,0x00,
|
||
0x02,0x02,0x02,0x02,0x0a,0x0e,0x0a,0x0a,0x4a,0x8a,0x4a,0x3a,0x02,0x03,0x02,0x00,
|
||
|
||
/*-- ID:20,字符:"桂",ASCII编码:B9F0,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x10,0xd0,0xff,0x90,0x50,0x48,0x48,0x48,0xff,0x48,0x48,0x4c,0x68,0x40,0x00,
|
||
0x04,0x03,0x00,0xff,0x40,0x41,0x44,0x44,0x44,0x7f,0x44,0x44,0x46,0x64,0x40,0x00,
|
||
|
||
/*-- ID:21,字符:"琼",ASCII编码:C7ED,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x44,0x44,0xfc,0x46,0x44,0x08,0xe8,0x28,0x29,0x2a,0x28,0x28,0xf8,0x2c,0x08,0x00,
|
||
0x10,0x30,0x1f,0x08,0x08,0x20,0x13,0x5a,0x82,0x7e,0x02,0x0a,0x13,0x30,0x00,0x00,
|
||
|
||
/*-- ID:22,字符:"川",ASCII编码:B4A8,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
|
||
0x00,0x40,0x20,0x1f,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
|
||
|
||
/*-- ID:23,字符:"贵",ASCII编码:B9F3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x40,0x5c,0x54,0x54,0x54,0x54,0x7f,0x54,0x54,0x54,0xd4,0x5e,0x44,0x40,0x00,
|
||
0x00,0x00,0x80,0x9f,0x41,0x41,0x21,0x1d,0x21,0x21,0x41,0x5f,0x81,0x00,0x00,0x00,
|
||
|
||
/*-- ID:24,字符:"云",ASCII编码:D4C6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x40,0x40,0x44,0x44,0x44,0xc4,0x44,0x44,0x44,0x46,0x44,0x40,0x60,0x40,0x00,
|
||
0x00,0x00,0x40,0x60,0x58,0x46,0x41,0x40,0x40,0x40,0x50,0x60,0xc0,0x00,0x00,0x00,
|
||
|
||
/*-- ID:25,字符:"藏",ASCII编码:B2D8,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x02,0xf2,0x82,0xf2,0x12,0xdf,0x52,0xd2,0x5f,0x12,0xfe,0x12,0x16,0x9b,0x12,0x00,
|
||
0x90,0x4e,0x22,0x1f,0x00,0x7f,0x25,0x3d,0xa7,0x40,0x2f,0x30,0x4c,0x83,0xe0,0x00,
|
||
|
||
/*-- ID:26,字符:"陕",ASCII编码:C9C2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0xfe,0x22,0x5a,0x86,0x08,0x28,0x48,0x08,0xff,0x08,0x48,0x2c,0x88,0x00,0x00,
|
||
0x00,0xff,0x04,0x08,0x87,0x41,0x21,0x11,0x0d,0x03,0x0d,0x11,0x61,0xc1,0x41,0x00,
|
||
|
||
/*-- ID:27,字符:"甘",ASCII编码:B8CA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x18,0x10,0x00,
|
||
0x00,0x00,0x00,0x00,0xff,0x42,0x42,0x42,0x42,0x42,0xff,0x00,0x00,0x00,0x00,0x00,
|
||
|
||
/*-- ID:28,字符:"青",ASCII编码:C7E0,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x44,0x54,0x54,0x54,0x54,0x54,0x7f,0x54,0x54,0x54,0xd4,0x56,0x44,0x40,0x00,
|
||
0x00,0x00,0x00,0xff,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x7f,0x01,0x00,0x00,0x00,
|
||
|
||
/*-- ID:29,字符:"宁",ASCII编码:C4FE,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x50,0x4c,0x44,0x44,0x44,0x44,0x45,0xc6,0x44,0x44,0x44,0x44,0x44,0x54,0x4c,0x00,
|
||
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||
|
||
/*-- ID:30,字符:"新",ASCII编码:D0C2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x44,0x54,0x65,0xc6,0x64,0xd6,0x44,0x40,0xfc,0x44,0x42,0xc3,0x62,0x40,0x00,
|
||
0x20,0x11,0x49,0x81,0x7f,0x01,0x05,0x29,0x18,0x07,0x00,0x00,0xff,0x00,0x00,0x00,
|
||
|
||
/*-- ID:31,字符:"禁",ASCII编码:BDFB,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x24,0x14,0x0c,0x7f,0x14,0x24,0x20,0x14,0x0c,0x7f,0x0c,0x16,0x24,0x40,0x00,
|
||
0x04,0x04,0x45,0x25,0x15,0x45,0x85,0x7d,0x05,0x05,0x15,0x25,0x65,0x04,0x04,0x00,
|
||
|
||
/*-- ID:32,字符:"通",ASCII编码:CDA8,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x40,0x42,0x44,0xcc,0x00,0x00,0xf1,0x91,0x95,0xf9,0x95,0x93,0xf9,0x10,0x00,0x00,
|
||
0x00,0x40,0x20,0x1f,0x20,0x40,0xbf,0x84,0x84,0xbf,0x94,0xa4,0x9f,0xc0,0x40,0x00,
|
||
|
||
/*-- ID:33,字符:"行",ASCII编码:D0D0,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
|
||
0x00,0x10,0x88,0xc4,0x23,0x40,0x42,0x42,0x42,0x42,0x42,0xc2,0x43,0x62,0x40,0x00,
|
||
0x02,0x01,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7f,0x00,0x00,0x00,0x00};
|
||
|
||
// 定义一个宏,用于标识UDP服务器端口
|
||
#define PARAM_SERVER_PORT 8081
|
||
|
||
void switch_init(void)
|
||
{
|
||
IoTGpioInit(5);
|
||
hi_io_set_func(5, 0);
|
||
IoTGpioSetDir(5, IOT_GPIO_DIR_IN);
|
||
hi_io_set_pull(5, 1);
|
||
}
|
||
|
||
//按键中断响应函数
|
||
void gpio5_isr_func_mode(void)
|
||
{
|
||
printf("gpio5_isr_func_mode start\n");
|
||
unsigned int tick_interval = 0;
|
||
unsigned int current_gpio5_tick = 0;
|
||
|
||
current_gpio5_tick = hi_get_tick();
|
||
tick_interval = current_gpio5_tick - g_gpio5_tick;
|
||
|
||
if (tick_interval < KEY_INTERRUPT_PROTECT_TIME) {
|
||
return NULL;
|
||
}
|
||
g_gpio5_tick = current_gpio5_tick;
|
||
control_flag = !control_flag;
|
||
|
||
}
|
||
|
||
unsigned char get_gpio5_voltage(void *param)
|
||
{
|
||
int i;
|
||
unsigned short data;
|
||
unsigned int ret;
|
||
unsigned short vlt;
|
||
float voltage;
|
||
float vlt_max = 0;
|
||
float vlt_min = VLT_MIN;
|
||
|
||
hi_unref_param(param);
|
||
memset_s(g_gpio5_adc_buf, sizeof(g_gpio5_adc_buf), 0x0, sizeof(g_gpio5_adc_buf));
|
||
for (i = 0; i < ADC_TEST_LENGTH; i++) {
|
||
ret = hi_adc_read(HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_4, HI_ADC_CUR_BAIS_DEFAULT, 0xF0);
|
||
//ADC_Channal_2 自动识别模式 CNcomment:4次平均算法模式 CNend */
|
||
if (ret != IOT_SUCCESS) {
|
||
printf("ADC Read Fail\n");
|
||
return NULL;
|
||
}
|
||
g_gpio5_adc_buf[i] = data;
|
||
}
|
||
|
||
for (i = 0; i < ADC_TEST_LENGTH; i++) {
|
||
vlt = g_gpio5_adc_buf[i];
|
||
voltage = (float)vlt * 1.8 * 4 / 4096.0;
|
||
/* vlt * 1.8* 4 / 4096.0为将码字转换为电压 */
|
||
vlt_max = (voltage > vlt_max) ? voltage : vlt_max;
|
||
vlt_min = (voltage < vlt_min) ? voltage : vlt_min;
|
||
}
|
||
printf("vlt_max is %f\r\n", vlt_max);
|
||
if (vlt_max > 0.6 && vlt_max < 1.0) {
|
||
gpio5_isr_func_mode();
|
||
}
|
||
}
|
||
|
||
//按键中断
|
||
void interrupt_monitor(void)
|
||
{
|
||
unsigned int ret = 0;
|
||
/*gpio5 switch2 mode*/
|
||
g_gpio5_tick = hi_get_tick();
|
||
ret = IoTGpioRegisterIsrFunc(GPIO5, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, get_gpio5_voltage, NULL);
|
||
if (ret == IOT_SUCCESS) {
|
||
printf(" register gpio5\r\n");
|
||
}
|
||
}
|
||
void OledShowChinese3(uint8_t x, uint8_t y, uint8_t idx)
|
||
{
|
||
// 控制循环
|
||
uint8_t t;
|
||
|
||
// 显示汉字的上半部分
|
||
OledSetPosition(x, y);
|
||
for (t = 0; t < 16; t++)
|
||
{
|
||
WriteData(fonts3[32 * idx + t]);
|
||
}
|
||
|
||
// 显示汉字的下半部分
|
||
OledSetPosition(x, y + 1);
|
||
for (t = 16; t < 32; t++)
|
||
{
|
||
WriteData(fonts3[32 * idx + t]);
|
||
}
|
||
}
|
||
static void controlTask(void *arg)
|
||
{
|
||
(void)arg;
|
||
int control_temp = control_flag;
|
||
int count = 0;
|
||
static int display_timer = 0; // 显示计时器
|
||
|
||
while (1)
|
||
{
|
||
if(control_flag != control_temp)
|
||
{
|
||
count = 0;
|
||
display_timer = 0;
|
||
OledClearScreen(); // 使用新的清屏函数
|
||
control_temp = control_flag;
|
||
|
||
// 处理新的JSON命令格式
|
||
if(control_flag == CMD_ROTATE_DISPLAY_CLEAR) // 命令1:顺时针90°+显示字符串+10秒后逆时针90°+清屏
|
||
{
|
||
printf("Command 1: Rotate clockwise, display text, wait 10s, rotate back, clear\r\n");
|
||
|
||
// 顺时针旋转90度
|
||
servo_rotate_clockwise_90();
|
||
|
||
// 显示字符串
|
||
if (strlen(g_current_command.text) > 0) {
|
||
printf("Displaying text: %s\r\n", g_current_command.text);
|
||
DisplayMixedString(0, 0, g_current_command.text);
|
||
}
|
||
|
||
display_timer = 10; // 设置10秒计时器
|
||
}
|
||
else if(control_flag == CMD_ROTATE_CLOCKWISE) // 命令2:顺时针90°
|
||
{
|
||
printf("Command 2: Rotate clockwise 90 degrees\r\n");
|
||
servo_rotate_clockwise_90();
|
||
}
|
||
else if(control_flag == CMD_ROTATE_COUNTER) // 命令3:逆时针90°
|
||
{
|
||
printf("Command 3: Rotate counter-clockwise 90 degrees\r\n");
|
||
servo_rotate_counter_clockwise_90();
|
||
}
|
||
else if(control_flag == CMD_DISPLAY_ONLY) // 命令4:只显示字符串,舵机不动
|
||
{
|
||
printf("Command 4: Display text only, no servo movement\r\n");
|
||
|
||
// 只显示字符串,不控制舵机
|
||
if (strlen(g_current_command.text) > 0) {
|
||
printf("Displaying text: %s\r\n", g_current_command.text);
|
||
DisplayMixedString(0, 0, g_current_command.text);
|
||
}
|
||
|
||
display_timer = 2; // 设置2秒计时器
|
||
}
|
||
// 兼容旧命令的处理逻辑(只有在非JSON命令时才执行)
|
||
else if(control_flag == 0 && g_current_command.cmd == 0) // 兼容旧命令:关闭
|
||
{
|
||
regress_middle();
|
||
printf("barrier off\n");
|
||
}
|
||
else if(control_flag == 1 && g_current_command.cmd == 0) // 兼容旧命令:开启(只有非JSON命令时)
|
||
{
|
||
servo_rotate_counter_clockwise_90();
|
||
printf("barrier on\n");
|
||
}
|
||
|
||
// 兼容旧的复杂字符串解析逻辑 - 只有在非JSON命令时才执行
|
||
if(control_flag == 2 && g_current_command.cmd == 0)
|
||
{
|
||
char prefix[20]; // 存储前部分字符串
|
||
int num; // 存储后部分数字
|
||
int index1 = 0;
|
||
|
||
// 使用 sscanf 解析字符串
|
||
int result = sscanf(response, "%[^i]index:%dflag:%d", prefix, &num,&index1);
|
||
|
||
if (result == 3) {
|
||
memset(response,0,sizeof(response));
|
||
OledShowChinese3(0,0,num);
|
||
OledShowString(18, 0, prefix, FONT8x16);
|
||
OledShowChinese3(0 , 2, index1);
|
||
OledShowChinese3(18 , 2, 33);
|
||
}
|
||
if (index1 == 32)
|
||
{
|
||
servo_rotate_counter_clockwise_90();
|
||
}
|
||
}
|
||
}
|
||
|
||
// 处理命令1的10秒计时器
|
||
if(control_flag == CMD_ROTATE_DISPLAY_CLEAR && display_timer > 0)
|
||
{
|
||
display_timer--;
|
||
if(display_timer == 0)
|
||
{
|
||
printf("10 seconds elapsed, rotating back and clearing screen\r\n");
|
||
// 逆时针旋转90度
|
||
servo_rotate_counter_clockwise_90();
|
||
// 清屏
|
||
OledClearScreen();
|
||
// 重置控制标志
|
||
control_flag = 0;
|
||
}
|
||
}
|
||
|
||
// 处理命令4的2秒计时器
|
||
if(control_flag == CMD_DISPLAY_ONLY && display_timer > 0)
|
||
{
|
||
display_timer--;
|
||
if(display_timer == 0)
|
||
{
|
||
printf("2 seconds elapsed, clearing screen for command 4\r\n");
|
||
// 清屏
|
||
OledClearScreen();
|
||
// 重置控制标志,使其能够响应下一个命令4
|
||
control_flag = 0;
|
||
}
|
||
}
|
||
|
||
// 兼容旧的计时逻辑
|
||
if(control_flag == 2 && g_current_command.cmd == 0)
|
||
{
|
||
count++;
|
||
if(count > 10)
|
||
{
|
||
control_flag = 0;
|
||
count = 0;
|
||
}
|
||
}
|
||
|
||
sleep(1);
|
||
}
|
||
}
|
||
// 主线程函数
|
||
static void NetDemoTask(void *arg)
|
||
{
|
||
(void)arg;
|
||
|
||
int control_temp = 0;
|
||
// 定义热点配置
|
||
WifiDeviceConfig config = {0};
|
||
|
||
// 设置热点配置中的SSID
|
||
strcpy(config.ssid, PARAM_HOTSPOT_SSID);
|
||
|
||
// 设置热点配置中的密码
|
||
strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);
|
||
|
||
// 设置热点配置中的加密方式(Wi-Fi security types)
|
||
config.securityType = PARAM_HOTSPOT_TYPE;
|
||
|
||
// 显示启动信息
|
||
printf("=== Hi3861 智能闸机控制系统启动 ===\r\n");
|
||
printf("正在连接WiFi: %s\r\n", PARAM_HOTSPOT_SSID);
|
||
printf("服务器地址: %s:%d\r\n", PARAM_SERVER_ADDR, PARAM_SERVER_PORT);
|
||
|
||
// 在OLED上显示启动信息
|
||
OledFillScreen(0x00);
|
||
OledShowString(0, 0, "Starting...", FONT8x16);
|
||
OledShowString(0, 2, PARAM_HOTSPOT_SSID, FONT8x16);
|
||
|
||
// 等待100ms
|
||
osDelay(10);
|
||
|
||
// 连接到热点
|
||
printf("开始连接WiFi...\r\n");
|
||
int netId = ConnectToHotspot(&config);
|
||
|
||
// 检查是否成功连接到热点
|
||
if (netId < 0)
|
||
{
|
||
// 连接到热点失败
|
||
printf("WiFi连接失败!错误代码: %d\r\n", netId);
|
||
OledFillScreen(0x00);
|
||
OledShowString(0, 0, "WiFi Failed!", FONT8x16);
|
||
OledShowString(0, 2, "Check Config", FONT8x16);
|
||
return;
|
||
}
|
||
|
||
// 连接到热点成功,显示连接成功信息
|
||
printf("WiFi连接成功!网络ID: %d\r\n", netId);
|
||
OledFillScreen(0x00);
|
||
OledShowString(0, 0, "WiFi Connected", FONT8x16);
|
||
OledShowString(0, 2, "Starting UDP...", FONT8x16);
|
||
|
||
// 等待一段时间确保连接稳定
|
||
printf("等待网络稳定...\r\n");
|
||
sleep(3);
|
||
|
||
// 运行UDP客户端测试,发送IP地址到服务器
|
||
printf("启动UDP客户端,连接服务器 %s:%d\r\n", PARAM_SERVER_ADDR, PARAM_SERVER_PORT);
|
||
UdpClientTest(PARAM_SERVER_ADDR, PARAM_SERVER_PORT);
|
||
|
||
// 断开热点连接
|
||
printf("断开WiFi连接...\r\n");
|
||
DisconnectWithHotspot(netId);
|
||
printf("WiFi连接已断开!\r\n");
|
||
}
|
||
|
||
// 入口函数
|
||
static void NetDemoEntry(void)
|
||
{
|
||
switch_init();
|
||
interrupt_monitor();
|
||
// 初始化OLED
|
||
OledInit();
|
||
|
||
// 全屏填充黑色
|
||
OledFillScreen(0x00);
|
||
|
||
// OLED显示APP标题
|
||
OledShowString(0, 0, "UdpClient Test", FONT8x16);
|
||
|
||
|
||
// 定义线程属性
|
||
osThreadAttr_t attr;
|
||
attr.name = "NetDemoTask";
|
||
attr.attr_bits = 0U;
|
||
attr.cb_mem = NULL;
|
||
attr.cb_size = 0U;
|
||
attr.stack_mem = NULL;
|
||
attr.stack_size = 10240;
|
||
attr.priority = osPriorityNormal;
|
||
// 创建线程
|
||
if (osThreadNew(NetDemoTask, NULL, &attr) == NULL)
|
||
{
|
||
printf("[NetDemoEntry] Falied to create NetDemoTask!\n");
|
||
}
|
||
attr.name = "controlTask";
|
||
attr.stack_size = 2048;
|
||
if (osThreadNew(controlTask, NULL, &attr) == NULL)
|
||
{
|
||
printf("[control] Falied to create NetDemoTask!\n");
|
||
}
|
||
}
|
||
|
||
// 运行入口函数
|
||
SYS_RUN(NetDemoEntry);
|