diff --git a/Arduino_ESP32_oscilloscope/Arduino_ESP32_oscilloscope.ino b/Arduino_ESP32_classics/Arduino_ESP32_oscilloscope.ino similarity index 100% rename from Arduino_ESP32_oscilloscope/Arduino_ESP32_oscilloscope.ino rename to Arduino_ESP32_classics/Arduino_ESP32_oscilloscope.ino diff --git a/Arduino_ESP32_oscilloscope/myBlueTooth.cpp b/Arduino_ESP32_classics/myBlueTooth.cpp similarity index 100% rename from Arduino_ESP32_oscilloscope/myBlueTooth.cpp rename to Arduino_ESP32_classics/myBlueTooth.cpp diff --git a/Arduino_ESP32_oscilloscope/myBlueTooth.h b/Arduino_ESP32_classics/myBlueTooth.h similarity index 100% rename from Arduino_ESP32_oscilloscope/myBlueTooth.h rename to Arduino_ESP32_classics/myBlueTooth.h diff --git a/PlatformIO_ESP32_oscilloscope/.gitignore b/PlatformIO_ESP32_classics/.gitignore similarity index 100% rename from PlatformIO_ESP32_oscilloscope/.gitignore rename to PlatformIO_ESP32_classics/.gitignore diff --git a/PlatformIO_ESP32_oscilloscope/.vscode/extensions.json b/PlatformIO_ESP32_classics/.vscode/extensions.json similarity index 100% rename from PlatformIO_ESP32_oscilloscope/.vscode/extensions.json rename to PlatformIO_ESP32_classics/.vscode/extensions.json diff --git a/PlatformIO_ESP32_oscilloscope/.vscode/settings.json b/PlatformIO_ESP32_classics/.vscode/settings.json similarity index 87% rename from PlatformIO_ESP32_oscilloscope/.vscode/settings.json rename to PlatformIO_ESP32_classics/.vscode/settings.json index b2f82c82a29e433407dc5f699a3f878aa299ff9a..1c2337b2d7e6641af0acee293b1d6be0c259d807 100644 --- a/PlatformIO_ESP32_oscilloscope/.vscode/settings.json +++ b/PlatformIO_ESP32_classics/.vscode/settings.json @@ -32,5 +32,7 @@ "cstring": "cpp", "algorithm": "cpp" }, - "C_Cpp.errorSquiggles": "disabled" + "C_Cpp.errorSquiggles": "disabled", + "Codegeex.RepoIndex": true, + "Codegeex.GenerationPreference": "line by line" } \ No newline at end of file diff --git a/PlatformIO_ESP32_classics/include/README b/PlatformIO_ESP32_classics/include/README new file mode 100644 index 0000000000000000000000000000000000000000..e7a7f030157f3c9c8d8166ca8dae8c617da3fe93 --- /dev/null +++ b/PlatformIO_ESP32_classics/include/README @@ -0,0 +1,40 @@ + + \ No newline at end of file diff --git a/PlatformIO_ESP32_classics/lib/README b/PlatformIO_ESP32_classics/lib/README new file mode 100644 index 0000000000000000000000000000000000000000..62e74a8f4a198e1b074f543c6289119d4156d025 --- /dev/null +++ b/PlatformIO_ESP32_classics/lib/README @@ -0,0 +1,49 @@ + +# This directory is intended for project specific (private) libraries + +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: + +```c++ +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder + +- diff --git a/PlatformIO_ESP32_classics/lib/myBlueTooth/myBlueTooth.cpp b/PlatformIO_ESP32_classics/lib/myBlueTooth/myBlueTooth.cpp new file mode 100644 index 0000000000000000000000000000000000000000..104736bfe2a805940ab869bb15445f9e62634a56 --- /dev/null +++ b/PlatformIO_ESP32_classics/lib/myBlueTooth/myBlueTooth.cpp @@ -0,0 +1,146 @@ + +#include "myBlueTooth.h" + +BluetoothController::BluetoothController() : _isConnected(false) +{ + memset(receiveBuffer, 0, sizeof(receiveBuffer)); +} + +void BluetoothController::begin(const char *bluetoothName) +{ + Serial.begin(115200); + // 蓝牙 spp 配对 begin + _serialBT.enableSSP(); + + _serialBT.onConfirmRequest([this](uint32_t numVal) + { this->_confirmRequestCallback(numVal); }); + + _serialBT.onAuthComplete([this](boolean success) + { this->_authCompleteCallback(true); }); + // 蓝牙 spp 配对 end + + // 注册蓝牙事件回调 + _serialBT.register_callback(_bluetoothEventCallback); + + // _serialBT.onData([this](const uint8_t *buffer, size_t size) + // { this->_storeReceivedData(buffer, size); this->_processReceivedData(buffer, size); }); + + _serialBT.onData([this](const uint8_t *buffer, size_t size) + { this->_storeReceivedData(buffer, size); }); + + // 设置蓝牙名称 + _serialBT.begin(bluetoothName); + Serial.printf("Bluetooth name: %s\n", bluetoothName); +} + +void BluetoothController::setDataReceivedCallback(BlueToothDataReceivedCallback callback) +{ + _dataReceivedCallback = callback; +} + +void BluetoothController::_processReceivedData(const uint8_t *buffer, size_t size) +{ + if (_dataReceivedCallback != nullptr) + { + _dataReceivedCallback(buffer, size); + } +} + +void BluetoothController::_storeReceivedData(const uint8_t *buffer, size_t size) +{ + // 将接收到的数据存储到 receiveBuffer 中 + size = (size >= sizeof(receiveBuffer) ? (sizeof(receiveBuffer) - 1) : size); + memcpy(receiveBuffer, buffer, size); + receiveBuffer[size] = '\0'; // 确保字符串以 null 结尾 + + // 调用回调函数 + if (_dataReceivedCallback != nullptr) + { + _dataReceivedCallback(buffer, size); + } +} + +void BluetoothController::write(const uint8_t *buffer, size_t size) +{ + sendData(buffer, size); +} + +void BluetoothController::printf(const char *format, ...) +{ + va_list args; + va_start(args, format); + vsnprintf(printfBuffer, sizeof(printfBuffer), format, args); + va_end(args); + + // 假设这里将数据发送到蓝牙 + sendData((const uint8_t *)printfBuffer, strlen(printfBuffer)); +} + +void BluetoothController::sendArray(const uint8_t *buffer, size_t size) +{ + sendData(buffer, size); +} + +void BluetoothController::sendData(const uint8_t *buffer, size_t size) +{ + _serialBT.write(buffer, size); +} + +BluetoothController *getBluetoothControllerInstance() +{ + static BluetoothController controller; + return &controller; +} + +void BluetoothController::_bluetoothEventCallback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) +{ + BluetoothController *controller = getBluetoothControllerInstance(); + + if (controller) + { + controller->_handleBluetoothEvent(event, param); + } +} + +void BluetoothController::_handleBluetoothEvent(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) +{ + switch (event) + { + case ESP_SPP_SRV_OPEN_EVT: + if (!_isConnected) + { + _isConnected = true; + Serial.println("Client connected!"); + } + else + { + Serial.println("Connection rejected: already connected!"); + // 断开新连接 + _serialBT.disconnect(); + } + break; + + case ESP_SPP_CLOSE_EVT: + _isConnected = false; + Serial.println("Client disconnected!"); + break; + + case ESP_SPP_WRITE_EVT: + // Serial.write("send OK!\r\n"); + break; + } +} + +void BluetoothController::_confirmRequestCallback(uint32_t numVal) +{ + Serial.printf("Received pin: %d \r\n", numVal); + _serialBT.confirmReply(true); +} + +void BluetoothController::_authCompleteCallback(boolean success) +{ + if (success) + Serial.println("Pairing success!!"); + else + Serial.println("Pairing failed, rejected by user!!"); +} diff --git a/PlatformIO_ESP32_oscilloscope/lib/myBlueTooth/myBlueTooth.h b/PlatformIO_ESP32_classics/lib/myBlueTooth/myBlueTooth.h similarity index 100% rename from PlatformIO_ESP32_oscilloscope/lib/myBlueTooth/myBlueTooth.h rename to PlatformIO_ESP32_classics/lib/myBlueTooth/myBlueTooth.h diff --git a/PlatformIO_ESP32_oscilloscope/lib/myWiFi/myWiFi.cpp b/PlatformIO_ESP32_classics/lib/myWiFi/myWiFi.cpp similarity index 100% rename from PlatformIO_ESP32_oscilloscope/lib/myWiFi/myWiFi.cpp rename to PlatformIO_ESP32_classics/lib/myWiFi/myWiFi.cpp diff --git a/PlatformIO_ESP32_oscilloscope/lib/myWiFi/myWiFi.h b/PlatformIO_ESP32_classics/lib/myWiFi/myWiFi.h similarity index 100% rename from PlatformIO_ESP32_oscilloscope/lib/myWiFi/myWiFi.h rename to PlatformIO_ESP32_classics/lib/myWiFi/myWiFi.h diff --git a/PlatformIO_ESP32_oscilloscope/lib/myXHZS/myXHZS.cpp b/PlatformIO_ESP32_classics/lib/myXHZS/myXHZS.cpp similarity index 74% rename from PlatformIO_ESP32_oscilloscope/lib/myXHZS/myXHZS.cpp rename to PlatformIO_ESP32_classics/lib/myXHZS/myXHZS.cpp index 39b5e8786af75cd741368c641e67f7a21b5d6f30..521289057f819df43808d540dbb42ffbb487a6b3 100644 --- a/PlatformIO_ESP32_oscilloscope/lib/myXHZS/myXHZS.cpp +++ b/PlatformIO_ESP32_classics/lib/myXHZS/myXHZS.cpp @@ -47,6 +47,11 @@ char *uart_GetReceiveBuffer() } } +/** + * \brief 格式化输出 + * + * 类似 printf() 功能,实现多个变量输出 + */ void uart_printf(const char *format, ...) { char printfBuffer[100]; @@ -56,6 +61,7 @@ void uart_printf(const char *format, ...) va_end(args); Uart_SendArray((uint8_t *)printfBuffer, strlen(printfBuffer)); + } // 发送一个字节 @@ -91,16 +97,47 @@ void Uart_SendArray(uint8_t *dataArray, size_t dataSize) * 需要提前准备好一个函数,用于回调函数的接收和逻辑处理 */ void uart_EnableSerialCallback() +{ + EnableSerialCallback(SERIAL_PORT); +} + +void EnableSerialCallback(enumSerialFunction serial_function) { switch (wireless_device) { case BLUETOOTH_DEVICE: - espBT.setDataReceivedCallback(uart_bluetoothDataReceivedCallback); - break; + { + if (serial_function == SERIAL_PORT) + { + espBT.setDataReceivedCallback(uart_bluetoothDataReceivedCallback); + } + else if (serial_function == DRAWING_BOARD) + { + espBT.setDataReceivedCallback(DrawingBoard_blueToothCallback); + } + else if (serial_function == CLOCK) + { + espBT.setDataReceivedCallback(Clock_BluetoothCallback); + } + } + break; case WIFI_DEVICE: - espWifi.setDataReceivedCallback(uart_wifiDataReceivedCallback); - break; + { + if (serial_function == SERIAL_PORT) + { + espWifi.setDataReceivedCallback(uart_wifiDataReceivedCallback); + } + else if (serial_function == DRAWING_BOARD) + { + espWifi.setDataReceivedCallback(DrawingBoard_wifiCallback); + } + else if (serial_function == CLOCK) + { + espWifi.setDataReceivedCallback(Clock_WifiCallback); + } + } + break; case EMPTY: default: @@ -121,6 +158,21 @@ void uart_wifiDataReceivedCallback(void *arg, AsyncClient *client, void *data, s Serial.write((char *)data, len); } +/************************************************************** + *函数名称:XHZS_SendImage + *简 介:学会助手APP图像下位机程序 + *输 入:imgaddr:数组起始地址 imgsize:图像对应数组大小 + *输 出:无 + *注意事项:无 + **************************************************************/ +void XHZS_SendImage(uint8_t *imgaddr, uint32_t imgsize) +{ + uint8_t cmdf[4] = {0x01, 0x09, 0x08, 0x07}; // 帧头 + + Uart_SendArray(cmdf, sizeof(cmdf)); // 发送帧头 + Uart_SendArray(imgaddr, imgsize); // 发送数据 +} + /************************************************************** *函数名称:XHZS_SendWave *简 介:学会助手APP虚拟示波器下位机程序(兼容山外) @@ -262,6 +314,7 @@ void Oscilloscope_SendsAndReceivesData() delay(30); } +// 实时功能,启用遥控器回调接收 void RemoteControl_EnableCallbackReceive() { switch (wireless_device) @@ -337,7 +390,13 @@ void RemoteControl_CallbackReceiveAnalysis(const uint8_t *buffer, size_t size) break; } -#if true + /** + * \brief 实时响应处理方式,每次接收一个数据指令 + * + * true 把数据存储在结构体中,你自己调用 + * false 使用 switch 语句处理数据,更直观 + */ +#if false RemoteControl_StructureArrayProcessingData(buttonBuffer); #else RemoteControl_SwitchCaseProcessingData(buttonBuffer, cmd[0], data[0]); @@ -356,7 +415,9 @@ void RemoteControl_getJoystickValueXY(char (&inputButtonData)[4], short &output_ data[2] = inputButtonData[2] & 0x0F; data[3] = inputButtonData[3] & 0x0F; - // 对默认数值修改,中心数值为0, left 100~0~100 right + // 摇杆默认中心数值是:100,经过运算后,中心数值为0 + // left 100 ~ 0 ~ 100 right + // up 100 ~ 0 ~ 100 down x = (data[0] * 16 + data[1]) - 100; output_x_axis = ((x > 0) ? x : -x); @@ -378,6 +439,7 @@ void RemoteControl_SwitchCaseProcessingData(structRemoteControlDataFormat &remot { switch (cmd) { + case LEFT_UP: uart_printf("LEFT_UP: %d\r\n", value); break; @@ -433,12 +495,7 @@ void RemoteControl_SwitchCaseProcessingData(structRemoteControlDataFormat &remot } } -/** - * \brief 定时接收数据 - * - * 模拟摇杆 JOYSTICK, - * 方向按钮 DIRECTIONAL_PAD - */ +// 开启定时功能,接收遥控器数据 void RemoteControl_TimedReceive(enumRemoteControlHandleType leftHandleType, enumRemoteControlHandleType rightHandleType) { structRemoteControlDataFormat buttonBuffer = {}; // 输出的缓冲区 @@ -446,8 +503,10 @@ void RemoteControl_TimedReceive(enumRemoteControlHandleType leftHandleType, enum char tempBuffer[20] = {}; // 临时缓冲区 // 判断手柄的方向按钮和摇杆的组合 - char handle = (leftHandleType == JOYSTICK ? JOYSTICK_AND_D_PAD : DIRECTIONAL_PAD) + - (rightHandleType == JOYSTICK ? D_PAD_AND_JOYSTICK : DIRECTIONAL_PAD); + // char handle = (leftHandleType == JOYSTICK ? JOYSTICK_AND_D_PAD : DIRECTIONAL_PAD) + + // (rightHandleType == JOYSTICK ? D_PAD_AND_JOYSTICK : DIRECTIONAL_PAD); + + char handle = (leftHandleType or rightHandleType); size_t data_length = strlen(uart_GetReceiveBuffer()); // 获取长度用于复制 data_length = (data_length >= sizeof(tempBuffer) ? sizeof(tempBuffer) : data_length); // 限制最大长度 @@ -486,6 +545,9 @@ void RemoteControl_TimedReceive(enumRemoteControlHandleType leftHandleType, enum #if true RemoteControl_StructureArrayProcessingData(buttonBuffer); +#else + // test not used ...(o o) + RemoteControl_SwitchCaseProcessingData(buttonBuffer, buttonBuffer.start, tempBuffer); #endif } @@ -526,3 +588,104 @@ void RemoteControl_getButtonValue(structRemoteControlDataFormat &outputBuffer, c } } } + +void DrawingBoard_EnableCallback() +{ + EnableSerialCallback(DRAWING_BOARD); +} + +void DrawingBoard_blueToothCallback(const uint8_t *buffer, size_t size) +{ + DrawingBoard_ReceivesData(buffer, size); +} + +void DrawingBoard_wifiCallback(void *arg, AsyncClient *client, void *data, size_t len) +{ + DrawingBoard_ReceivesData((uint8_t *)data, len); +} + +/** + * \brief 画板数据回调函数 + * + * APP实时发送数据到下位机,X与Y数据长度均为4 + * 例:X:0568 Y:0627 + * 数据格式为 05680627\r\n + */ +void DrawingBoard_ReceivesData(const uint8_t *buffer, size_t size) +{ + char charBoard_x[6] = {}; + char charBoard_y[6] = {}; + + char buf[10] = {}; + char dataFormatSize = 4; + + // 拷贝数据到 buf,避免直接操作 *buffer + // 获取前四位和后四位,分别: x 和 y 的坐标 + memcpy(charBoard_x, buffer, dataFormatSize); + memcpy(charBoard_y, (buffer + dataFormatSize), dataFormatSize); + + Serial.printf("x: %s / y: %s \r\n", charBoard_x, charBoard_y); + + // // 将字符串转换为整数, 直接使用 board_x 和 board_y + // int intBoard_x = atoi(charBoard_x); + // int intBoard_y = atoi(charBoard_y); + + // Serial.printf("x: %d / y: %d \r\n", intBoard_x, intBoard_y); +} + +void Clock_EnableCallback() +{ + EnableSerialCallback(CLOCK); +} + +void Clock_BluetoothCallback(const uint8_t *buffer, size_t size) +{ + Clock_ReceivesData(buffer, size); +} + +void Clock_WifiCallback(void *arg, AsyncClient *client, void *data, size_t len) +{ + Clock_ReceivesData((uint8_t *)data, len); +} + +/** + * \brief 时钟数据回调函数 + * + * APP实时发送数据到下位机,数据长度为17 + * 数据格式:2022年5月21日周五21点35分24.1秒 + * 周日为00,周一为01,依次类推 + * 数据格式为: 20220521052135241\r\n + * 数据每隔100ms发送一次,精度为100ms + * 2024 0908 00 1959 532 + */ +void Clock_ReceivesData(const uint8_t *buffer, size_t size) +{ + struct structDateTime timeBuffer = {}; + + memcpy(timeBuffer.yearFirst, buffer + 0, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.yearLast, buffer + 2, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.month, buffer + 4, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.day, buffer + 6, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.week, buffer + 8, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.hour, buffer + 10, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.minute, buffer + 12, 2); + timeBuffer.yearFirst[2] = '\0'; + + memcpy(timeBuffer.second, buffer + 14, 2); + timeBuffer.yearFirst[2] = '\0'; + + Serial.printf("year: %s%s-%s-%s week: %s hour: %s:%s:%s \r\n", + timeBuffer.yearFirst, timeBuffer.yearLast, timeBuffer.month, timeBuffer.day, timeBuffer.week, timeBuffer.hour, timeBuffer.minute, timeBuffer.second); +} diff --git a/PlatformIO_ESP32_oscilloscope/lib/myXHZS/myXHZS.h b/PlatformIO_ESP32_classics/lib/myXHZS/myXHZS.h similarity index 59% rename from PlatformIO_ESP32_oscilloscope/lib/myXHZS/myXHZS.h rename to PlatformIO_ESP32_classics/lib/myXHZS/myXHZS.h index 9b43e6c36a2728e5cf9a0a970fc40284aa3dcaec..560a4533293c99c49ad140149fe49636730b0b92 100644 --- a/PlatformIO_ESP32_oscilloscope/lib/myXHZS/myXHZS.h +++ b/PlatformIO_ESP32_classics/lib/myXHZS/myXHZS.h @@ -15,7 +15,7 @@ enum enumWirelessDevice // 遥控器数据格式 struct structRemoteControlDataFormat { - short start; // 起始标志 + short start; // 起始标志 // 0 short LEFT_up; // 向上 // 1 short LEFT_down; // 向下 @@ -27,7 +27,7 @@ struct structRemoteControlDataFormat short RIGHT_left; // short RIGHT_right; // - short middle; + short middle; // 9 short BUTTON_A; // 按钮A short BUTTON_B; // 按钮B @@ -91,7 +91,12 @@ enum enumRemoteControlHandleType DIRECTIONAL_PAD = 0X00, // 左方向键 + 右方向键 D_PAD_AND_JOYSTICK = 0X01, // 左方向键 + 右摇杆 JOYSTICK_AND_D_PAD = 0X10, // 左摇杆 + 右方向键 - JOYSTICK = 0X11 // 左摇杆 + 右摇杆 + JOYSTICK = 0X11, // 左摇杆 + 右摇杆 + // For players to use + LEFT_DIRECTIONAL_PAD = 0x00, + RIGHT_DIRECTIONAL_PAD = 0x00, + LEFT_JOYSTICK = 0X10, + RIGHT_JOYSTICK = 0X01 }; /** @@ -109,9 +114,37 @@ enum enumRemoteControlMagicNumber DIGIT_ONE = 0X31 }; +enum enumSerialFunction +{ + SERIAL_PORT, // 串口 + DRAWING_BOARD, // 绘图板 + CLOCK, // 时钟 + SECONDS // 秒表 +}; + +// 例:2022年5月21日周五21点35分24.1秒 +struct structDateTime +{ + char yearFirst[3]; // 年前两位 + char yearLast[3]; // 年后两位 + char month[3]; // 月 + char day[3]; // 日 + char week[3]; // 星期 + char hour[3]; // 时 + char minute[3]; // 分 + char second[3]; // 秒 + char millisecond[3]; // 毫秒 + char end[3]; // 结束标志位 +}; + // ---------- 基础输入输出函数 start ---------------------------------------- -// 初始化串口 +/** + * \brief 初始化蓝牙或Wi-Fi + * \param device_name 蓝牙或Wi-Fi设备名称 + * \param device_password 蓝牙或Wi-Fi设备密码 + * \param device 蓝牙或Wi-Fi设备类型 + */ void uart_begin(const char *device_name, const char *device_password, enumWirelessDevice device); // 获取接收缓冲区 @@ -133,6 +166,8 @@ void Uart_SendArray(uint8_t *dataArray, size_t dataSize); // 开启串口接收 void uart_EnableSerialCallback(); +void EnableSerialCallback(enumSerialFunction serial_function); + // 蓝牙数据接收回调函数 void uart_bluetoothDataReceivedCallback(const uint8_t *buffer, size_t size); @@ -141,6 +176,13 @@ void uart_wifiDataReceivedCallback(void *arg, AsyncClient *client, void *data, s // ---------- 串口功能 start ---------------------------------------- +// ---------- 图像功能 start ---------------------------------------- + +// 发送图片 +void XHZS_SendImage(uint8_t *imgaddr, uint32_t imgsize); + +// ---------- 图像功能 end ---------------------------------------- + // ---------- 示波器功能 start ---------------------------------------- // 发送波形数据 @@ -152,49 +194,102 @@ char OscGetFloat(const char *p, float *value); // 获取指定名称的浮点数值 char OscGetValue(const char *p, const char *name, float *value); -// 发送波形示例 +// 开启发送波形示例 void SendWave(); -// 示波器发送和接收数据 +// 开启示波器发送和接收数据 void Oscilloscope_SendsAndReceivesData(); // ---------- 示波器功能 end ---------------------------------------- // ---------- 遥控器功能 start ---------------------------------------- -// 启用遥控器回调接收 +// 实时功能,启用遥控器回调接收 void RemoteControl_EnableCallbackReceive(); -// 蓝牙遥控器数据接收回调函数 +// 实时功能,蓝牙遥控器数据接收回调函数 void RemoteControl_BluetoothCallbackReceive(const uint8_t *buffer, size_t size); -// Wi-Fi遥控器数据接收回调函数 +// 实时功能,Wi-Fi遥控器数据接收回调函数 void RemoteControl_WifiCallbackReceive(void *arg, AsyncClient *client, void *data, size_t len); -// 遥控器数据接收分析回调函数 +/** + * \brief 实时功能,遥控器数据接收分析回调函数 + * + * app 每次发送一个指令,每次接受一个指令 + * 按钮指令一个字节数据,按下: 11,抬起: 10 + * 摇杆指令四个字节数据,参考“学会助手使用手册” + */ void RemoteControl_CallbackReceiveAnalysis(const uint8_t *buffer, size_t size); -// 获取摇杆的X和Y轴值 +// 实时功能,获取摇杆的X和Y轴值 void RemoteControl_getJoystickValueXY(char (&inputButtonData)[4], short &output_x_axis, short &output_y_axis); -// 遥控器数据结构体数组处理 +/** + * \brief 实时功能,遥控器数据结构体数组处理 + * + * 经过函数 RemoteControl_CallbackReceiveAnalysis 处理过后, + * 将指定按键数值存放在结构体 structRemoteControlDataFormat 中, + * 需要遍历结构体的数值,判断是否发生变化来确认按键,是否按下和抬起 + */ void RemoteControl_StructureArrayProcessingData(structRemoteControlDataFormat &remoteControlData); -// 遥控器数据开关案例处理 +/** + * \brief 实时功能,遥控器数据开关方法处理 + * + * 经过函数 RemoteControl_CallbackReceiveAnalysis 处理过后,每次获取一个遥控指令 + * 一个指令对应者一个 case 选项,在相应的 case 内实现自己的代码逻辑 + */ void RemoteControl_SwitchCaseProcessingData(structRemoteControlDataFormat &remoteControlData, uint8_t cmd, uint8_t value); -// 定时接收遥控器数据 +/** + * \brief 定时功能,接收遥控器数据 + * + * 模拟摇杆: LEFT_JOYSTICK or RIGHT_JOYSTICK + * + * 方向按钮: LEFT_DIRECTIONAL_PAD or RIGHT_DIRECTIONAL_PAD + */ void RemoteControl_TimedReceive(enumRemoteControlHandleType leftHandleType, enumRemoteControlHandleType rightHandleType); -// 获取方向键值 +// 定时功能,获取方向键值 void RemoteControl_getDirectionalPadValue(structRemoteControlDataFormat &outputBuffer, char outputPosition, char (&inputBuffer)[20], char inputPosition); -// 获取摇杆值 +// 定时功能,获取摇杆值 void RemoteControl_getJoystickValue(structRemoteControlDataFormat &outputBuffer, char outputPosition, char (&inputBuffer)[20], char inputPosition); -// 获取按钮值 +// 定时功能,获取按钮值 void RemoteControl_getButtonValue(structRemoteControlDataFormat &outputBuffer, char outputPosition, char (&inputBuffer)[20], char inputPosition); // ---------- 遥控器功能 end ---------------------------------------- +// ---------- 画板功能 start ---------------------------------------- + +// 启用画板回调功能 +void DrawingBoard_EnableCallback(); + +// 蓝牙画板数据接收回调函数 +void DrawingBoard_blueToothCallback(const uint8_t *buffer, size_t size); + +// Wi-Fi画板数据接收回调函数 +void DrawingBoard_wifiCallback(void *arg, AsyncClient *client, void *data, size_t len); + +// 画板数据接收回调函数 +void DrawingBoard_ReceivesData(const uint8_t *buffer, size_t size); + +// ---------- 时钟功能 start ---------------------------------------- + +// 启用时钟回调功能 +void Clock_EnableCallback(); + +// 蓝牙时钟数据接收回调函数 +void Clock_BluetoothCallback(const uint8_t *buffer, size_t size); + +// Wi-Fi时钟数据接收回调函数 +void Clock_WifiCallback(void *arg, AsyncClient *client, void *data, size_t len); + +// 时钟数据接收回调函数 +void Clock_ReceivesData(const uint8_t *buffer, size_t size); + +// ---------- 时钟功能 end ---------------------------------------- + #endif diff --git a/PlatformIO_ESP32_oscilloscope/partitions.csv b/PlatformIO_ESP32_classics/partitions.csv similarity index 100% rename from PlatformIO_ESP32_oscilloscope/partitions.csv rename to PlatformIO_ESP32_classics/partitions.csv diff --git a/PlatformIO_ESP32_oscilloscope/platformio.ini b/PlatformIO_ESP32_classics/platformio.ini similarity index 100% rename from PlatformIO_ESP32_oscilloscope/platformio.ini rename to PlatformIO_ESP32_classics/platformio.ini diff --git a/PlatformIO_ESP32_classics/src/main.cpp b/PlatformIO_ESP32_classics/src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5cc4c757b4869aa8e872288ba0bee290aa4d283e --- /dev/null +++ b/PlatformIO_ESP32_classics/src/main.cpp @@ -0,0 +1,41 @@ +#include +#include "myXHZS.h" + +/** + * @brief 介绍 + * + * 选择工程环境:esp32 dev + * 如需使用“学会助手”功能,请参阅 `myXHZS.h` 头文件中的相关说明,已支持`蓝牙`和`Wi-Fi`功能。 + * 使用时需先调用 `uart_begin()` 函数进行初始化,然后调用相应的功能函数进行操作。 + * “学会助手”的串口功能、示波器功能和遥控器功能现已可用 ^_^ + * + * @note 提示,tip + * + * 需要什么功能开启什么功能,不支持二个功能同时工作 ... + */ +void setup() +{ + Serial.begin(115200); // 前置初始化 + + // uart_begin("esp32_AP", "esp32esp32", WIFI_DEVICE); // 使用Wi-Fi功能 + uart_begin("esp32_AP", "esp32esp32", BLUETOOTH_DEVICE); // 使用蓝牙功能 + + // uart_EnableSerialCallback(); // 开启串口功能 + + DrawingBoard_EnableCallback(); // 开启画板功能 + + // Clock_EnableCallback(); // 开启时钟功能 + + // RemoteControl_EnableCallbackReceive(); // 开启遥控器功能 +} + +void loop() +{ + // SendWave(); // 开启测试,发送波形功能, + + // Oscilloscope_SendsAndReceivesData(); // 开启测试,示波器功能的发送和接收数据 + + // RemoteControl_TimedReceive(JOYSTICK, DIRECTIONAL_PAD); // 开启测试,遥控器的定时接收功能演示 + + delay(100); // 开启 loop() 内部功能时, 需要注释掉延时函数(这一行),不需要延时 +} diff --git a/PlatformIO_ESP32_classics/test/README b/PlatformIO_ESP32_classics/test/README new file mode 100644 index 0000000000000000000000000000000000000000..e58cb90cd61df16a29072db71760536c9d17e76e --- /dev/null +++ b/PlatformIO_ESP32_classics/test/README @@ -0,0 +1,12 @@ + +# This directory is intended for PlatformIO Test Runner and project tests + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: + +- diff --git a/PlatformIO_ESP32_classics/test/black_cat.jpg b/PlatformIO_ESP32_classics/test/black_cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1e23ab9c88615a5dc41f50ede3b47c21385e856 Binary files /dev/null and b/PlatformIO_ESP32_classics/test/black_cat.jpg differ diff --git a/PlatformIO_ESP32_oscilloscope/.pio/build/project.checksum b/PlatformIO_ESP32_oscilloscope/.pio/build/project.checksum deleted file mode 100644 index e8d4c353f876c33fddf1b50cd483e4bbfc656367..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/.pio/build/project.checksum +++ /dev/null @@ -1 +0,0 @@ -1836c0bbe3fe7a312a36e89c82f361f65fc2937d \ No newline at end of file diff --git a/PlatformIO_ESP32_oscilloscope/.vscode/c_cpp_properties.json b/PlatformIO_ESP32_oscilloscope/.vscode/c_cpp_properties.json deleted file mode 100644 index 27bf04c2989116d63c127c4f9ddf510e92652cf3..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,521 +0,0 @@ -// -// !!! WARNING !!! AUTO-GENERATED FILE! -// PLEASE DO NOT MODIFY IT AND USE "platformio.ini": -// https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags -// -{ - "configurations": [ - { - "name": "PlatformIO", - "includePath": [ - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/include", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/src", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/myXHZS", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/myWiFi", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/myBlueTooth", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/.pio/libdeps/esp32dev/AsyncTCP/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include/esp_additions/freertos", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/port/xtensa/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include/esp_additions", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include/soc", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/port/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/port/esp32/private_include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/heap/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/log/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/include/apps", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/include/apps/sntp", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/lwip/src/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/port/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/port/esp32/include/arch", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/platform_port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/include/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/port/soc", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/port/public_compat", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/xtensa/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/xtensa/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/driver/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/driver/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_pm/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_ringbuf/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/efuse/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/efuse/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/vfs/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_wifi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_event/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_netif/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_eth/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/tcpip_adapter/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_phy/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_phy/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_ipc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/app_trace/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_timer/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/mbedtls/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/esp_crt_bundle/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/app_update/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/spi_flash/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bootloader_support/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nvs_flash/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/pthread/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/xtensa", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espcoredump/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espcoredump/include/port/xtensa", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/esp_supplicant/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ieee802154/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/console", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/asio/asio/asio/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/asio/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/osi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/include/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/api/include/api", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/btc/profile/esp/blufi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/btc/profile/esp/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/host/bluedroid/api/include/api", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/storage", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/btc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/client/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/server/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api/core/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api/models/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/cbor/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/unity/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/unity/unity/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/cmock/CMock/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/coap/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/coap/libcoap/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nghttp/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nghttp/nghttp2/lib/includes", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-tls", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-tls/esp-tls-crypto", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_adc_cal/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hid/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/tcp_transport/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_http_client/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_http_server/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_https_ota/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_https_server/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_lcd/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_lcd/interface", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protobuf-c/protobuf-c", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/common", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/security", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/transports", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mdns/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_local_ctrl/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/sdmmc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_serial_slave_link/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_websocket_client/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/expat/expat/expat/lib", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/expat/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wear_levelling/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/diskio", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/vfs", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freemodbus/freemodbus/common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/idf_test/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/idf_test/include/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/jsmn/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json/cJSON", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/libsodium/libsodium/src/libsodium/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/libsodium/port_include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mqtt/esp-mqtt/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/openssl/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/perfmon/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/spiffs/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ulp/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wifi_provisioning/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/rmaker_common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_diagnostics/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/rtc_store/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_insights/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_parser/upstream/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_parser/upstream", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_generator/upstream", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_schedule/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp_secure_cert_mgr/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rainmaker/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/gpio_button/button/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/qrcode/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ws2812_led", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_littlefs/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/tool", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/typedef", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/image", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/math", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/nn", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/layer", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/detect", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/model_zoo", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32-camera/driver/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32-camera/conversions/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/dotprod/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/support/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/support/mem/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/hann/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman_harris/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/nuttall/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/flat_top/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/iir/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/fir/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/add/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/sub/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/mul/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/addc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/mulc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/sqrt/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/mul/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/add/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/addc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/mulc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/sub/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/fft/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/dct/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/conv/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/mul/test/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/kalman/ekf/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fb_gfx/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/dio_qspi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/cores/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/variants/esp32", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", - "" - ], - "browse": { - "limitSymbolsToIncludedHeaders": true, - "path": [ - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/include", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/src", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/myXHZS", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/myWiFi", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/myBlueTooth", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/.pio/libdeps/esp32dev/AsyncTCP/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include/esp_additions/freertos", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/port/xtensa/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include/esp_additions", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include/soc", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/port/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/port/esp32/private_include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/heap/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/log/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/include/apps", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/include/apps/sntp", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/lwip/src/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/port/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/port/esp32/include/arch", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/platform_port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/include/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/port/soc", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/port/public_compat", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/xtensa/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/xtensa/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/driver/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/driver/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_pm/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_ringbuf/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/efuse/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/efuse/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/vfs/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_wifi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_event/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_netif/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_eth/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/tcpip_adapter/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_phy/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_phy/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_ipc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/app_trace/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_timer/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/mbedtls/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/esp_crt_bundle/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/app_update/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/spi_flash/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bootloader_support/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nvs_flash/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/pthread/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/xtensa", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espcoredump/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espcoredump/include/port/xtensa", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/esp_supplicant/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ieee802154/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/console", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/asio/asio/asio/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/asio/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/osi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/include/esp32/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/api/include/api", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/btc/profile/esp/blufi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/btc/profile/esp/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/host/bluedroid/api/include/api", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/storage", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/btc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/client/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/server/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api/core/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api/models/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/cbor/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/unity/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/unity/unity/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/cmock/CMock/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/coap/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/coap/libcoap/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nghttp/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nghttp/nghttp2/lib/includes", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-tls", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-tls/esp-tls-crypto", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_adc_cal/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hid/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/tcp_transport/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_http_client/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_http_server/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_https_ota/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_https_server/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_lcd/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_lcd/interface", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protobuf-c/protobuf-c", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/common", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/security", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/transports", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mdns/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_local_ctrl/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/sdmmc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_serial_slave_link/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_websocket_client/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/expat/expat/expat/lib", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/expat/port/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wear_levelling/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/diskio", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/vfs", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freemodbus/freemodbus/common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/idf_test/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/idf_test/include/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/jsmn/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json/cJSON", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/libsodium/libsodium/src/libsodium/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/libsodium/port_include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mqtt/esp-mqtt/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/openssl/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/perfmon/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/spiffs/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ulp/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wifi_provisioning/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/rmaker_common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_diagnostics/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/rtc_store/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_insights/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_parser/upstream/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_parser/upstream", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_generator/upstream", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_schedule/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp_secure_cert_mgr/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rainmaker/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/gpio_button/button/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/qrcode/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ws2812_led", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_littlefs/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/tool", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/typedef", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/image", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/math", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/nn", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/layer", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/detect", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/model_zoo", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32-camera/driver/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32-camera/conversions/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/dotprod/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/support/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/support/mem/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/hann/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman_harris/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/nuttall/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/flat_top/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/iir/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/fir/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/add/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/sub/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/mul/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/addc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/mulc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/sqrt/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/mul/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/add/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/addc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/mulc/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/sub/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/fft/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/dct/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/conv/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/common/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/mul/test/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/kalman/ekf/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fb_gfx/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/dio_qspi/include", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/cores/esp32", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/variants/esp32", - "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", - "C:/Users/Sword/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", - "" - ] - }, - "defines": [ - "PLATFORMIO=60115", - "ARDUINO_ESP32_DEV", - "HAVE_CONFIG_H", - "MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"", - "UNITY_INCLUDE_CONFIG_H", - "WITH_POSIX", - "_GNU_SOURCE", - "IDF_VER=\"v4.4.7-dirty\"", - "ESP_PLATFORM", - "_POSIX_READER_WRITER_LOCKS", - "ARDUINO_ARCH_ESP32", - "ESP32", - "F_CPU=240000000L", - "ARDUINO=10812", - "ARDUINO_VARIANT=\"esp32\"", - "ARDUINO_BOARD=\"Espressif ESP32 Dev Module\"", - "ARDUINO_PARTITION_partitions", - "" - ], - "cStandard": "gnu99", - "cppStandard": "gnu++11", - "compilerPath": "C:/Users/Sword/.platformio/packages/toolchain-xtensa-esp32/bin/xtensa-esp32-elf-gcc.exe", - "compilerArgs": [ - "-mlongcalls", - "" - ] - } - ], - "version": 4 -} diff --git a/PlatformIO_ESP32_oscilloscope/.vscode/launch.json b/PlatformIO_ESP32_oscilloscope/.vscode/launch.json deleted file mode 100644 index 73583dbd204ff5a51de7536a1d7eb42300af303b..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/.vscode/launch.json +++ /dev/null @@ -1,44 +0,0 @@ -// AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY -// -// PlatformIO Debugging Solution -// -// Documentation: https://docs.platformio.org/en/latest/plus/debugging.html -// Configuration: https://docs.platformio.org/en/latest/projectconf/sections/env/options/debug/index.html - -{ - "version": "0.2.0", - "configurations": [ - { - "type": "platformio-debug", - "request": "launch", - "name": "PIO Debug", - "executable": "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/.pio/build/esp32dev/firmware.elf", - "projectEnvName": "esp32dev", - "toolchainBinDir": "C:/Users/Sword/.platformio/packages/toolchain-xtensa-esp32/bin", - "internalConsoleOptions": "openOnSessionStart", - "preLaunchTask": { - "type": "PlatformIO", - "task": "Pre-Debug" - } - }, - { - "type": "platformio-debug", - "request": "launch", - "name": "PIO Debug (skip Pre-Debug)", - "executable": "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/.pio/build/esp32dev/firmware.elf", - "projectEnvName": "esp32dev", - "toolchainBinDir": "C:/Users/Sword/.platformio/packages/toolchain-xtensa-esp32/bin", - "internalConsoleOptions": "openOnSessionStart" - }, - { - "type": "platformio-debug", - "request": "launch", - "name": "PIO Debug (without uploading)", - "executable": "E:/PlatformIO_vscode/git_XHZS/esp32_oscilloscope/PlatformIO_ESP32_oscilloscope/.pio/build/esp32dev/firmware.elf", - "projectEnvName": "esp32dev", - "toolchainBinDir": "C:/Users/Sword/.platformio/packages/toolchain-xtensa-esp32/bin", - "internalConsoleOptions": "openOnSessionStart", - "loadMode": "manual" - } - ] -} diff --git a/PlatformIO_ESP32_oscilloscope/include/note.h b/PlatformIO_ESP32_oscilloscope/include/note.h deleted file mode 100644 index 72b60dcadf8cdec548b39937164a622d491fa8ab..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/include/note.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -# learn note -# updata time: 2024-07-20 - # 关于“学会助手”移植想法,学会助手工程代码基于STM32F103 - # 硬件是:STM32F103C8T6 和 蓝牙模块,包括了经典蓝牙和低功耗蓝牙 - # 软件是:keil工程,stm32f1 使用 uart 和 蓝牙通信,实现蓝牙的通信,与学会助手的数据进行交互 - - # 分析,如何将硬件和软件移植 - # 硬件部分:STM32F1 and blueTooth --> ESP32-WROOM-32E 自带蓝牙模块 - # 软件部分:实现 ESP32 蓝牙的通信功能,封装好发送数据和接收数据的接口 api - # 移植部分:找到与学会助手相关的代码,往下找到控制硬件代码,将蓝牙发送和接收 api, - 换成 ESP32 的发送和接收 api, 对其逻辑代码进行测试和修改,满足学会助手规则 - - # 分层思想: - # 用户层:直接调用函数实现功能 - # 软件层:把规则和逻辑封装函数,对外提供接口 - # 控制层:对寄存器的操作,给硬件逻辑信号驱动工作 - # 硬件层:GPIO 输出高低电平,电机旋转,蓝牙发送和接收 - - -# 在 platformIO 中遇到函数问题 - 在其它文件声明的函数 void test_output(); - 在 main() 主函数中重新写一遍不会报错,默认为新的的函数 - 当时处理没有发现前面加了 void 的函数,导致编译器认为这个函数是新的函数,而不是之前的函数 - 导致你的代码逻辑没有被执行 - - - - - - - -// ESP32-WROOM-32E 引脚功能 start -------------------- - -GPIO 34 -GPIO 35 -GPIO 36 -GPIO 39 -上面四个引脚只能输入使用,下面引脚不建议使用 -GPIO 5 (启动时必须为高电平) -GPIO 12 (启动时必须为低电平) -GPIO 15 (启动时必须为高电平) - - -ESP32-WROOM-32E -3.3V GND 1 -EN P23 2 -SVP P22 3 -SVN TX 4 -P34 RX 5 -P35 P21 6 - -P32 GND 7 -P33 P19 8 -P25 P18 9 -P26 P5 10 -P27 P17 11 -P14 P16 12 -P12 P4 13 - -GND P0 14 -P13 P2 15 -SD2 P15 16 -SD3 SD1 17 -CMD SD0 18 -5V CLK 19 - -// ESP32-WROOM-32E 引脚功能 end -------------------- - - -// ADC 电压采集 -void setup() -{ - Serial.begin(115200); - // 9 bits and 12 bits 电压宽度映射值 - analogReadResolution(12); -} - -void loop() -{ - int analogValue = analogRead(35); - int anglogVoles = analogReadMilliVolts(35); - Serial.println("----------"); - Serial.printf("analogValue: %d\n", analogValue); - Serial.printf("anglogVoles: %d\n", anglogVoles); - - delay(300); -} -// ADC 电压采集 - - -*/ - -// #include -// #include - -// // DMA 传输完成的中断服务例程 -// void dma_isr() -// { -// dma.end(); // 结束 DMA 传输 -// // 在这里可以添加处理 DMA 完成后的动作 -// } - -// void setup() -// { -// Serial.begin(115200); - -// uint32_t src_buffer[1024]; -// uint32_t dest_buffer[1024]; - -// // 初始化源和目标缓冲区 -// for (int i = 0; i < 1024; i++) -// { -// src_buffer[i] = i; -// } - -// // 创建 DMA 通道 -// DMAChannel dma; - -// // 配置 DMA 通道 -// dma.transfer(src_buffer, dest_buffer, 1024); - -// // 设置 DMA 中断服务例程 -// dma.setCompleteCallback(dma_isr); - -// // 启动 DMA 传输 -// dma.start(); - -// // 从这里开始,CPU 可以执行其他任务,直到 DMA 完成触发中断 -// } - -// void loop() -// { -// // 在这里执行其他任务 -// } diff --git a/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers/Interrupts_and_timers.cpp b/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers/Interrupts_and_timers.cpp deleted file mode 100644 index 61a9cc818851c17d41a4d1f93e9e3abb048897e2..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers/Interrupts_and_timers.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "Interrupts_and_timers.h" -// 定时中断 start -Ticker timer; -void t_setupInterrupts() -{ - Serial.begin(115200); - timer.attach_ms(1000, timerInterrupt); // 每隔1000ms触发一次中断 -} -void timerInterrupt() -{ - Serial.println("Timer interrupt!"); -} -// 定时中断 end -//--------------------------------- -// 硬件状态中断 start -const int INTERRUPT_PIN = 2; // 假设使用数字引脚2作为中断引脚 -static bool lastState = LOW; // 上次读取的引脚状态 -static int number = 0; - -void h_setupInterrupts() -{ - Serial.begin(115200); - pinMode(INTERRUPT_PIN, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), handleInterrupt, FALLING); -} -void handleInterrupt() -{ - if (LOW == digitalRead(INTERRUPT_PIN)) - { - number++; - lastState = HIGH; - } - else if (HIGH == digitalRead(INTERRUPT_PIN)) - { - lastState = LOW; - } -} -void handleInterruptPrintf() -{ - // 主循环可以在这里进行其他任务 - Serial.printf("count: %d\n", number); - delay(30); -} -// 硬件状态中断 start diff --git a/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers/Interrupts_and_timers.h b/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers/Interrupts_and_timers.h deleted file mode 100644 index 0a02c6c101cbd741fbc94f85be61f92a638d5f4b..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/lib/Interrupts_and_timers/Interrupts_and_timers.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __INTERRUPTS_AND_TIMERS_H__ -#define __INTERRUPTS_AND_TIMERS_H__ - -#include -#include - - -void t_setupInterrupts(); -void timerInterrupt(); - -void h_setupInterrupts(); -void handleInterrupt(); -void handleInterruptPrintf(); - - -#endif diff --git a/PlatformIO_ESP32_oscilloscope/lib/myBlueTooth/myBlueTooth.cpp b/PlatformIO_ESP32_oscilloscope/lib/myBlueTooth/myBlueTooth.cpp deleted file mode 100644 index b7c84f419e7c2cf1d159ba4cc300a6c3820df7be..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/lib/myBlueTooth/myBlueTooth.cpp +++ /dev/null @@ -1,978 +0,0 @@ - -#include "myBlueTooth.h" - -BluetoothController::BluetoothController() : _isConnected(false) -{ - memset(receiveBuffer, 0, sizeof(receiveBuffer)); -} - -void BluetoothController::begin(const char *bluetoothName) -{ - Serial.begin(115200); - // 蓝牙 spp 配对 begin - _serialBT.enableSSP(); - - _serialBT.onConfirmRequest([this](uint32_t numVal) - { this->_confirmRequestCallback(numVal); }); - - _serialBT.onAuthComplete([this](boolean success) - { this->_authCompleteCallback(true); }); - // 蓝牙 spp 配对 end - - // 注册蓝牙事件回调 - _serialBT.register_callback(_bluetoothEventCallback); - - // _serialBT.onData([this](const uint8_t *buffer, size_t size) - // { this->_storeReceivedData(buffer, size); this->_processReceivedData(buffer, size); }); - - _serialBT.onData([this](const uint8_t *buffer, size_t size) - { this->_storeReceivedData(buffer, size); }); - - // 设置蓝牙名称 - _serialBT.begin(bluetoothName); - Serial.printf("Bluetooth name: %s\n", bluetoothName); -} - -void BluetoothController::setDataReceivedCallback(BlueToothDataReceivedCallback callback) -{ - _dataReceivedCallback = callback; -} - -void BluetoothController::_processReceivedData(const uint8_t *buffer, size_t size) -{ - if (_dataReceivedCallback != nullptr) - { - _dataReceivedCallback(buffer, size); - } -} - -void BluetoothController::_storeReceivedData(const uint8_t *buffer, size_t size) -{ - // 将接收到的数据存储到 receiveBuffer 中 - size = (size >= sizeof(receiveBuffer) ? (sizeof(receiveBuffer) - 1) : size); - memcpy(receiveBuffer, buffer, size); - receiveBuffer[size] = '\0'; // 确保字符串以 null 结尾 - - // 调用回调函数 - if (_dataReceivedCallback != nullptr) - { - _dataReceivedCallback(buffer, size); - } -} - -void BluetoothController::write(const uint8_t *buffer, size_t size) -{ - sendData(buffer, size); -} - -void BluetoothController::printf(const char *format, ...) -{ - va_list args; - va_start(args, format); - vsnprintf(printfBuffer, sizeof(printfBuffer), format, args); - va_end(args); - - // 假设这里将数据发送到蓝牙 - sendData((const uint8_t *)printfBuffer, strlen(printfBuffer)); -} - -void BluetoothController::sendArray(const uint8_t *buffer, size_t size) -{ - sendData(buffer, size); -} - -void BluetoothController::sendData(const uint8_t *buffer, size_t size) -{ - _serialBT.write(buffer, size); -} - -BluetoothController *getBluetoothControllerInstance() -{ - static BluetoothController controller; - return &controller; -} - -void BluetoothController::_bluetoothEventCallback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) -{ - BluetoothController *controller = getBluetoothControllerInstance(); - - if (controller) - { - controller->_handleBluetoothEvent(event, param); - } -} - -void BluetoothController::_handleBluetoothEvent(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) -{ - switch (event) - { - case ESP_SPP_SRV_OPEN_EVT: - if (!_isConnected) - { - _isConnected = true; - Serial.println("Client connected!"); - } - else - { - Serial.println("Connection rejected: already connected!"); - // 断开新连接 - _serialBT.disconnect(); - } - break; - - case ESP_SPP_CLOSE_EVT: - _isConnected = false; - Serial.println("Client disconnected!"); - break; - - case ESP_SPP_WRITE_EVT: - // Serial.write("send OK!\r\n"); - break; - } -} - -void BluetoothController::_confirmRequestCallback(uint32_t numVal) -{ - Serial.printf("Received pin: %d \r\n", numVal); - _serialBT.confirmReply(true); -} - -void BluetoothController::_authCompleteCallback(boolean success) -{ - if (success) - Serial.println("Pairing success!!"); - else - Serial.println("Pairing failed, rejected by user!!"); -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#if false -/************************* blueTooth part *************************/ - -static char blueToothBuffer[100]; // 接收缓冲区 - -/************************* XHZS part *************************/ - -bool SERIAL_CALLBACK_FUNCTION_STATUS = true; -bool REMOTE_CONTROL_CALLBACK_FUNCTION_STATUS = true; -// 定义常量替代硬编码 -constexpr char DIGIT_ZERO = 0x30; -constexpr char DIGIT_ONE = 0x31; - -bool SERIAL_EXECUTE_ONCE = false; -bool REMOTE_CONTROL_EXECUTE_ONCE = false; -/************************* blueTooth begin *************************/ - -/* 初始化蓝牙 */ -void BlueTooth_initialization(const String blueTooth_name) -{ - Serial.begin(115200); - // 蓝牙 spp 配对 begin - _serialBT.enableSSP(); - _serialBT.onConfirmRequest(BTConfirmRequestCallback); - _serialBT.onAuthComplete(BTAuthCompleteCallback); - // 蓝牙 spp 配对 end - - // 设置事件回调函数 连接 断开 发送 接收 - _serialBT.register_callback(Bluetooth_Event); - _serialBT.begin(blueTooth_name); - - Serial.printf("Bluetooth name: %s\r\n", blueTooth_name); -} - -/*蓝牙发送浮点数据,转为字符串发送*/ -void BTsendFloatVia(const float *data) -{ - // 非字符串不要使用 _serialBT.write(),转换后会乱码 - _serialBT.printf("%.2f", *data); -} - -/*蓝牙发送字符串*/ -void BTsendStringVia(const char *stringData) -{ - // 在字符串中表现良好 - _serialBT.write((uint8_t *)stringData, strlen(stringData)); -} - -/*获取蓝牙发送内容*/ -char *BTgetReceivedData() -{ - return blueToothBuffer; -} - -/* 蓝牙事件回调函数 */ -void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) // 蓝牙事件回调函数 -{ - uint16_t index = 0; - - switch (event) - { - // 蓝牙连接成功标志 - case ESP_SPP_SRV_OPEN_EVT: - case ESP_SPP_OPEN_EVT: - { - char connection[] = "connection successful!\r\n"; - BTsendStringVia(connection); - break; - } - // 蓝牙断开连接标志 - case ESP_SPP_CLOSE_EVT: - { - char disconnect[] = "disconnect successful!\r\n"; - BTsendStringVia(disconnect); - break; - } - // 数据接收标志 - case ESP_SPP_DATA_IND_EVT: - { - memset(blueToothBuffer, '\0', sizeof(blueToothBuffer)); - while (_serialBT.available()) // 等待接收完成 - { - blueToothBuffer[index++] = _serialBT.read(); // 按字节存储 - } - - break; - } - // 数据发送标志 - case ESP_SPP_WRITE_EVT: - { - Serial.write("send OK!\r\n"); - break; - } - } -} - -// 认证请求回调 -void BTConfirmRequestCallback(uint32_t numVal) -{ - // numVal是主机发来的识别码 - Serial.printf("recv pin: %d \r\n", numVal); - - // 这里要对这个识别码进行判断,是否和主机一样或是是否是我们从机内置的密码 - // 然后再判断是否确定连接,我们这里直接确认了 - - _serialBT.confirmReply(true); - // _serialBT.confirmReply(false); // 如果要拒绝就用这句 -} - -// 认证结果回调函数 -void BTAuthCompleteCallback(boolean success) -{ - if (success) - Serial.println("Pairing success!!"); - else - Serial.println("Pairing failed, rejected by user!!"); -} - -/************************* blueTooth end *************************/ -// -/************************* XHZS begin *************************/ - -/* - * 串口接收到数据开启调用,和stm32的中断函数一样 - * 需要在串口发送和接收实现自己逻辑代码,直接写代码逻辑 - * 回调函数不能有耗时操作,延时操作禁止使用的,会触发看门狗,不断重启 - */ -void Uart_onDataReceive(const uint8_t *dataBuffer, size_t dataSize) -{ - _serialBT.write(dataBuffer, dataSize); // 输出到连接的设备 - Serial.write(dataBuffer, dataSize); // 输出到串行监视器 -} - -// 获取串口接收到的数据 -char *Uart_getReceiveData() -{ - return blueToothBuffer; -} - -// 发送一个字节 -void Uart_SendByte(const uint8_t *byte) -{ - _serialBT.write(*byte); -} - -// 发送数组 -void Uart_SendArray(const uint8_t *array, size_t arraySize) -{ - if (array == nullptr || arraySize == 0) - { - return; - } - else - { - _serialBT.write(array, arraySize); // 数组发生是个耗时操作,建议DMA优化 - } -} - -/************************************************************** - *函数名称:XHZS_SendWave - *简 介:学会助手APP虚拟示波器下位机程序(兼容山外) - *输 入:wareaddr:数据数组起始地址 waresize:数组大小 - *输 出:无 - *注意事项:void *waveaddr 为数组类型,char and string 类型无效 - *注意事项:示波器支持 uin16_t,建立一个 uint16_t fun[4] 数组, - 元素是通道数量 - **************************************************************/ -void XHZS_SendWave(const uint8_t *waveAddr, uint16_t waveSize) -{ - // 参数检查 - if (waveAddr == nullptr || waveSize == 0) - { - return; - } - uint8_t cmd_head[2] = {0x03, 0xFC}; // 帧头 - uint8_t cmd_tail[2] = {0xFC, 0x03}; // 帧尾 - - Uart_SendArray(cmd_head, sizeof(cmd_head)); // 发送帧头 - Uart_SendArray(waveAddr, waveSize); // 发送数据 - Uart_SendArray(cmd_tail, sizeof(cmd_tail)); // 发送帧尾 -} - -// /************************************************************** -// *函数名称:SendWave -// *简 介:发送数据到学会助手APP虚拟示波器 -// *输 入:无 -// *输 出:无 -// *注意事项:将要发送的数据赋值给Wave数组即可,通道依次对应 -// **************************************************************/ -void SendWave() -{ - // // 输出平行线测试 start ----------------------- - // char line[4] = {0}; // 注意数据类型;数组大小即为通道数量,最多四条通道 - // for (size_t i = 0; i < 500; i += 0.1) - // { - // line[0] = (line[0] > 10 ? -10 : (line[0] += 1)); - // line[1] = 10.0; - // line[2] = 5.0; - // line[3] = 0.0; - - // XHZS_SendWave((uint8_t *)line, sizeof(line)); - // vTaskDelay(50 / portTICK_PERIOD_MS); // 延时函数可以注释掉 - // - // } - // // 输出平行线测试 end ----------------------- - - // 正弦波测试 start ----------------------- - float Wave[4] = {0}; // 注意数据类型;数组大小即为通道数量,最多四条通道 - - for (float i = 0; i < 500; i += 0.1) - { - Wave[0] = sin(i); - Wave[1] = cos(i); - Wave[2] = -sin(i); - Wave[3] = -cos(i); - XHZS_SendWave((uint8_t *)Wave, sizeof(Wave)); - - vTaskDelay(50 / portTICK_PERIOD_MS); // 延时函数可以注释掉 - } - // 正弦波测试 end ----------------------- -} - -/************************************************************** - *函数名称:OscGetFloat - *简 介:将字符转为浮点数 - *输 入:p:字符串;value:用于获取输出值 - *输 出:(==0)转成功;(!=0)转失败 - *注意事项:虚拟示波器调参用,以','为数据分隔符 - **************************************************************/ -char OscGetFloat(const char *p, float *value) -{ - // c11:11.04,c12:109,c13:434,c14:32, - int i; - int negative_flag = 1; - int float_flag = 0; - float tmp_value = 0; - for (i = 0; i < 16; i++) - { - if (*p == ',') // 检测到分隔符,返回值 - { - tmp_value *= negative_flag; - *value = tmp_value; - return 0; - } - else if (*p == '-') // 检测到负号 - { - negative_flag = -1; - } - else if (*p == '.') // 检测到小数点 - { - float_flag = -1; - } - else if (*p >= '0' && *p <= '9') - { - if (float_flag == 0) - { - tmp_value = tmp_value * 10 + (*p - 0x30); - } - else - { - tmp_value += (*p - 0x30) * pow(10, float_flag); - float_flag--; - } - } - else - { - return 1; - } - p++; - } - return 2; -} - -/************************************************************** - *函数名称:OscGetValue - *简 介:从字符串中获取指定参数数值 - *输 入:p:字符串,以'\0'结尾,否则将出错 - * name:指定参数名称,如"c12"获取第1组第2个参数; - * value:用于获取输出值; - *输 出:(==0)转成功;(!=0)转失败 - *注意事项:虚拟示波器调参用,字符串中以'\0'为结束符 - **************************************************************/ -char OscGetValue(const char *p, const char *name, float *value) -{ - // c11:114,c12:109,c13:434,c14:32, - float tmp_value; - int feedback; - p = strstr(p, name); - if (p == NULL) - { - return 1; - } - p += 4; - feedback = OscGetFloat(p, &tmp_value); - if (feedback == 0) - { - *value = tmp_value; - return 0; - } - return 2; -} - -// 获取摇杆数据转换为 x and y -void getInterruptJoystickvalue_XY(char *receiveBuffer, short *joystick_X, short *joystick_Y) -{ - // 摇杆接收格式: 1A 23 31 46 - uint8_t cmd[4] = {0}; - uint8_t data[4] = {0}; - short x, y; - // cmd[0] = receiveBuffer[0] & 0xF0; - data[0] = receiveBuffer[0] & 0x0F; - // cmd2 = receiveBuffer[1] & 0xF0; - data[1] = receiveBuffer[1] & 0x0F; - // cmd3 = receiveBuffer[2] & 0xF0; - data[2] = receiveBuffer[2] & 0x0F; - // cmd4 = receiveBuffer[3] & 0xF0; - data[3] = receiveBuffer[3] & 0x0F; - - // 对摇杆数值默认值做了修改,中心数值是0,偏离中心越远数值越大 100~0~100 - x = (data[0] * 16 + data[1]) - 100; - *joystick_X = (x > 0) ? x : -x; - y = (data[2] * 16 + data[3]) - 100; - *joystick_Y = (y > 0) ? y : -y; -} - -/* - * 遥控器的非定时模式 - * RemoteControlOnDataReceive() 前面的函数解析好了,遥控器的每个按键对应着一个 case, - * 在 case INTERRUPT_RIGHT_UP 表示,右边的方向按钮的向上按钮,根据按键的状态,写自己的逻辑代码 - * cmd[0] 遥控器的指令,data[0] 表示遥控器的状态,0 表示松开,1 表示按下,摇杆显示 x and y 数值 - */ -void RemoteControlInterruptMode33(uint8_t *cmd, uint8_t *data, short left_X, short left_Y, short right_X, short right_Y) -{ - // 在指定的按钮 case 中实现逻辑代码,中断不用有延时操作 - switch (cmd[0]) - { - case INTERRUPT_LEFT_UP: - // 指令 cmd[0] 数据 data[0] - // 逻辑代码区 begin - - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - - // 逻辑代码区 end - break; - - case INTERRUPT_LEFT_DOWN: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_LEFT_LEFT: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_LEFT_RIGHT: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_RIGHT_UP: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_RIGHT_DOWN: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_RIGHT_LEFT: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_RIGHT_RIGHT: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_LEFT_X: - // 摇杆数值在 left_X and left_Y - // 逻辑代码区 begin - - _serialBT.printf("x: %d y: %d\n", left_X, left_Y); - - // 逻辑代码区 end - break; - - case INTERRUPT_RIGHT_X: - // 逻辑代码区 begin - - _serialBT.printf("x: %d y: %d\n", right_X, right_Y); - - // 逻辑代码区 end - break; - - case INTERRUPT_BUTTON_A: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_BUTTON_B: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_BUTTON_C: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_BUTTON_D: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_BUTTON_E: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - - case INTERRUPT_BUTTON_F: - _serialBT.printf("%X-%X\r\n", cmd[0], data[0]); - break; - } -} - -/* - * RemoteControlOnDataReceive() 前面的函数解析好了,在这里使用结构体成员的方法,获取数值 - * 遥控器的非定时模式,1 表示按下,0 表示松开,摇杆显示 x and y 数值 - */ -void RemoteControlInterruptMode22(structRemoteControlFormat *structBuffer) -{ - // 遍历结构体成员代码,了解 struct structRemoteControlFormat 格式内容 - // structBuffer->A 和 ptr[10] 这两个表达都是同一个地址,他们位置都是:10 - short *ptr = &structBuffer->begin; // 获取结构体首地址 - for (size_t i = 0; i < structBuffer->end, i < 20; i++) - { - Serial.printf("%d-%d ", i, ptr[i]); - } - Serial.println(); -} - -/* - * 串口接收到数据开启调用,和stm32的中断函数一样,在 RemoteControlOnDataReceive() 函数实现数据解析工作, - * 你的逻辑代码建议在 RemoteControlInterruptMode22() 或者在 RemoteControlInterruptMode33() 实现 - * 回调函数不能有耗时操作,延时操作禁止使用的,会触发看门狗,不断重启 - * 函数功能:把不同的按钮指令,存放在指定的结构体中 - */ -void RemoteControlOnDataReceive(const uint8_t *buffer, size_t size) -{ - structRemoteControlFormat outputBuffer = {}; // 输出的缓冲区 - outputBuffer.end = 20; - uint8_t cmd[4] = {0}; // 指令 - uint8_t data[4] = {0}; // 数据 - - char receiveBuffer[4] = {0}; - memcpy(receiveBuffer, buffer, size); - short *ptr = &outputBuffer.begin; - - // 判断是否摇杆数据,在进行解释 - if (size == 4) - { - if ((receiveBuffer[0] & 0xF0) == 0x10) - { - cmd[0] = 0x9A; - getInterruptJoystickvalue_XY(receiveBuffer, &outputBuffer.LEFT_x, &outputBuffer.LEFT_y); - } - else if ((receiveBuffer[0] & 0xF0) == 0x50) - { - cmd[0] = 0x9C; - getInterruptJoystickvalue_XY(receiveBuffer, &outputBuffer.RIGHT_x, &outputBuffer.RIGHT_y); - } - } - else if (size == 1) - { - cmd[0] = (receiveBuffer[0] & 0xF0) / 16; - data[0] = (receiveBuffer[0] & 0x0F); - // 在这里把结构体当成一个数组来使用 - ptr[cmd[0]] = data[0]; - // switch case 模式 * 16 - cmd[0] = cmd[0] * 16; - } - // 选择一个函数使用 - // 使用结构体的成员方法 - RemoteControlInterruptMode22(&outputBuffer); - // 使用 switch case 模式 - RemoteControlInterruptMode33(cmd, data, outputBuffer.LEFT_x, outputBuffer.LEFT_y, outputBuffer.RIGHT_x, outputBuffer.RIGHT_y); -} - -// 获取摇杆数值 -// (inputButton[inputPosition + 0] - 0x30) 把字符转化为数字 -void getJoystickValue(short *outputButton, char outputPosition, const char *inputButton, char inputPosition) -{ - outputButton[outputPosition] = (inputButton[inputPosition] - DIGIT_ZERO) * 100 + - (inputButton[inputPosition + 1] - DIGIT_ZERO) * 10 + - (inputButton[inputPosition + 2] - DIGIT_ZERO) - 100; - outputButton[outputPosition] = outputButton[outputPosition] > 0 ? outputButton[outputPosition] : -outputButton[outputPosition]; - - outputButton[outputPosition + 1] = (inputButton[inputPosition + 3] - DIGIT_ZERO) * 100 + - (inputButton[inputPosition + 4] - DIGIT_ZERO) * 10 + - (inputButton[inputPosition + 5] - DIGIT_ZERO) - 100; - outputButton[outputPosition + 1] = outputButton[outputPosition + 1] > 0 ? outputButton[outputPosition + 1] : -outputButton[outputPosition + 1]; -} - -// 获取按钮数值 -// (inputButton[inputPosition + i] == 0x31) 识别字符是否等于数字的1 -void getDirectionalPad(short *outputButton, char outputPosition, const char *inputButton, char inputPosition) -{ - for (size_t i = 0; i < DIRECTIONAL_PAD_SIZE; i++) - { - if (inputButton[inputPosition + i] == DIGIT_ONE) - { - outputButton[outputPosition + i] = 1; - } - } -} - -// 获取按钮数值 -// (inputButton[inputPosition + i] == 0x31) 识别字符是否等于数字的1 -void getFunctionButtonValue(short *outputButton, char outputPosition, const char *inputButton, char inputPosition) -{ - for (size_t i = 0; i < FUNCTION_BUTTON_SIZE; i++) - { - if (inputButton[inputPosition + i] == DIGIT_ONE) - { - outputButton[outputPosition + i] = 1; - } - } -} - -// 截取字符串 -void substring(char *dest, const char *src, size_t start, size_t length) -{ - size_t i; - for (i = 0; i < length && src[start + i] != '\0'; ++i) - { - dest[i] = src[start + i]; - } - dest[i] = '\0'; // 确保字符串以空字符结尾 -} - -/* - * 遥控器的定时模式 - * 功能:对一串有规律的字符串解析处理,放在指定结构体成员中 - * 使用了数组的方式,将结构体当成一个数组来使用,结构体的偏移量来确定成员位置 - */ -structRemoteControlFormat RemoteControlTimerMode(MODULE_SIZE RemoteControlLayoutLeft, MODULE_SIZE RemoteControlLayoutRight) -{ - structRemoteControlFormat outputBuffer = {0}; // 输出的缓冲区 - outputBuffer.begin = 0; - outputBuffer.end = 20; - char tempBuffer[20] = {0}; // 临时缓冲区 - - // 判断手柄的方向按钮和摇杆的组合 - char handle = (RemoteControlLayoutLeft == JOYSTICK_SIZE ? JOYSTICK_AND_DIRECTIONAL_PAD : DIRECTIONAL_PAD) + - (RemoteControlLayoutRight == JOYSTICK_SIZE ? DIRECTIONAL_PAD_AND_JOYSTICK : DIRECTIONAL_PAD); - - size_t data_len = strlen(Uart_getReceiveData()); // 获取长度用于复制 - memcpy(tempBuffer, Uart_getReceiveData(), data_len); // 内存复制 - - //// 尝试使用 cmd 串口改变,手柄的组合,失败 - // if (tempBuffer[0] == 's' && tempBuffer[1] == 'e' && tempBuffer[2] == 't') - // { - // char *end; - // char tempBufferCopy[data_len]; - - // substring(tempBufferCopy, tempBuffer, 4, 4); // 截取字符串 - // tempBufferCopy[0] = (char)strtol(tempBufferCopy, &end, 16); // 字符串转换十六进制 - // // _serialBT.printf("%s-%d\n", "pad", tempBufferCopy[0]); - - // if (tempBufferCopy[0] == 0x00 || tempBufferCopy[0] == 0x01 || tempBufferCopy[0] == 0x10 || tempBufferCopy[0] == 0x11) - // { - // // handle = *tempBufferCopy; - // handle = tempBufferCopy[0]; - // tempBufferCopy[0] = 100; - // _serialBT.printf("%s-%d\n", "ok", tempBufferCopy[0]); - // } - // } - - // 确定,方向按钮和摇杆组合方式 - switch (handle) - { - case DIRECTIONAL_PAD: - // 获取结构体的首地址,在基础上移动到指定位置,进行赋值或者读取操作 - getDirectionalPad(&outputBuffer.begin, 1, tempBuffer, 0); - getDirectionalPad(&outputBuffer.begin, 5, tempBuffer, 4); - getFunctionButtonValue(&outputBuffer.begin, 10, tempBuffer, 8); - break; - - case DIRECTIONAL_PAD_AND_JOYSTICK: - getDirectionalPad(&outputBuffer.begin, 1, tempBuffer, 0); - getJoystickValue(&outputBuffer.begin, 18, tempBuffer, 4); - getFunctionButtonValue(&outputBuffer.begin, 10, tempBuffer, 10); - break; - - case JOYSTICK_AND_DIRECTIONAL_PAD: - getJoystickValue(&outputBuffer.begin, 16, tempBuffer, 0); - getDirectionalPad(&outputBuffer.begin, 5, tempBuffer, 6); - getFunctionButtonValue(&outputBuffer.begin, 10, tempBuffer, 10); - break; - - case JOYSTICKS: - getJoystickValue(&outputBuffer.begin, 16, tempBuffer, 0); - getJoystickValue(&outputBuffer.begin, 18, tempBuffer, 6); - getFunctionButtonValue(&outputBuffer.begin, 10, tempBuffer, 12); - break; - } - return outputBuffer; -} - -/************************* XHZS end *************************/ -// -/************************* example begin *************************/ - -/** - * 此函数应在蓝牙初始化前调用,当 isEnable 数值为 true 时开启,false 则禁用。 - * 在底层蓝牙库中,onData() 函数将绑定 Uart_onDataReceive() 作为其回调,从而在接收到数据时触发相应的处理逻辑。 - * 串口回调时实现自己的代码逻辑,找到 Uart_onDataReceive() 修改里面代码 - */ -void test_serial_port_callback_enable(bool isEnable) -{ - if (SERIAL_CALLBACK_FUNCTION_STATUS == isEnable) - { - _serialBT.onData(Uart_onDataReceive); - SERIAL_CALLBACK_FUNCTION_STATUS = false; - } -} - -// 发送波形数据的函数例子 -void test_oscilloscope_send_wave() -{ - SendWave(); -} - -/** - * 示波器发送和接收函数示例 - * 数据类型:字符串,通道数量:4,开始接收 - * 参数调试:开启定时发送,选择参数调整 - */ -void test_oscilloscope_send_and_Receive() -{ - float floatValue1, floatValue2, floatValue3, floatValue4; // 准备数据类型 - char *charData = Uart_getReceiveData(); // 获取蓝牙串口的数据 - - // 给通道四输出波形数据 - floatValue4 = (floatValue4 > 33 ? -22 : (floatValue4 += 0.1)); - // 将字符串中的字段的数值提取出来,字符串格式为:下方 - // c11:14.12,c12:22,c13:33,c14: 55.66, - // c13字段,数值为33 - OscGetValue(charData, "c11", &floatValue1); - OscGetValue(charData, "c12", &floatValue2); - OscGetValue(charData, "c13", &floatValue3); - OscGetValue(charData, "c14", &floatValue4); - - _serialBT.printf("w:%0.2f,%0.2f,%0.2f,%0.2f\r\n", floatValue1, floatValue2, floatValue3, floatValue4); - delay(50); // 延时函数,可以注释掉 -} - -/* - * 此函数应在蓝牙初始化前调用,当 isEnable 数值为 true 时开启,false 则禁用。 - * 在底层蓝牙库中,onData() 函数将绑定 RemoteControlOnDataReceive() 作为其回调,从而在接收到数据时触发相应的处理逻辑。 - * 串口回调时实现自己的代码逻辑,找到 RemoteControlOnDataReceive() 修改里面代码 - */ -void test_remote_control_callback_enable(bool isEnable) -{ - if (REMOTE_CONTROL_CALLBACK_FUNCTION_STATUS == isEnable) - { - _serialBT.onData(RemoteControlOnDataReceive); - REMOTE_CONTROL_CALLBACK_FUNCTION_STATUS = false; - } -} - -/** - * 遥控器的定时发送模式,函数的参数决定摇杆和方向按钮组合 - * 摇杆:JOYSTICK_SIZE and 方向按钮:DIRECTIONAL_PAD_SIZE - * 手柄组合有4种,配合学会助手的遥控器功能一起使用 - */ -void test_remote_control_Timer_function() -{ - structRemoteControlFormat buffer = RemoteControlTimerMode(DIRECTIONAL_PAD_SIZE, DIRECTIONAL_PAD_SIZE); - - short *ptr = &buffer.begin; - for (size_t i = 0; i < 20, i < buffer.end; i++) - { - Serial.printf("%d-%d ", i, ptr[i]); - } - Serial.println(); - - // delay(50); // 延时函数可以删除 -} - -/************************* example end *************************/ -// -/************************* test begin *************************/ -#if false -/* -在处理十六进制的时候发现一个问题,如何把 0x10 and 0x20 转化成数字的 1 and 2, -第一想到的字节的移位操作,但是这样最少操作四次,一个字节八位, -在计算十六进制大小发现一个规律,高位每加一位相差15 -0x50 升一位需要加15,降一位需要15 -*/ - -struct myStruct -{ - char a; - char b; - char c; - char d; - char e; -}; - -void struct_number_size() -{ - student stu = {}; // 修正拼写错误 - int mySize = sizeof(stu); // 使用已声明的变量 stu - int numberSize = sizeof(stu.begin); // 使用已声明的变量 stu - int size = mySize / numberSize; // 计算剩余字节数 - Serial.printf("%d / %d = %d\r\n", mySize, numberSize, size); -} - - - -/* -如何把结构体像数组一样使用?可以做到,前提条件时是结构体成员是单一类型时,结构体内部就像一个数组, -获取结构体的首地址,在基础上进行偏移,可以像数组一样访问了 -问题来了,结构体的大小,或者说时长度问题,需要手动计算,使用for循环遍历警惕循环次数 -*/ -void test_struct_array() -{ - myStruct box = {}; - box.c = 0xAA; - char *ptr = &box.a; - for (size_t i = 0; i < 5; i++) - { - *(ptr + i) = i; - } - for (size_t i = 0; i < 5; i++) - { - Serial.printf("%d-%d- ", i, *(ptr + i)); - } - Serial.printf("a: %d b: %d c: %d d: %d e: %d\n", box.a, box.b, box.c, box.d, box.e); - delay(10); -} - - - -/** - * \brief 说明。 - * - * \note namespace_name - */ -void new_function() -{ - Serial.println("new function"); -} - - -struct myColor -{ - int blue; - int green; - int yellow; // 假设a, b, c是连续存储的 -}; -/** - * @brief 函数的功能简介。 - * - * 详细描述函数的作用、输入参数、返回值以及可能抛出的异常等。 - * - * @param[in] paramName 参数名 - 描述该参数的意义、类型及取值范围。 - * @param[out] paramName 输出参数 - 同上。 - * @return 返回值说明 - 描述函数返回值的含义及其类型。 - * - * @note 特别注意的地方,比如某些限制条件或行为说明。 - * @warning 警告信息,使用该函数需要注意的事项。 - * @pre 调用前的条件或准备工作。 - * @post 调用后的状态或效果。 - * - * @ingroup groupname 可选,函数所属的分组名。 - */ -void test_struct_move() -{ - myColor s; - int *ptr = &s.a; // 获取a的地址 - for (int i = 0; i < 3; ++i) - { - *(ptr + i) = i; // 通过指针偏移访问,尽管能工作但不推荐 - } -} - -#endif -#endif diff --git a/PlatformIO_ESP32_oscilloscope/src/main.cpp b/PlatformIO_ESP32_oscilloscope/src/main.cpp deleted file mode 100644 index 0f6e89e2945fad87b6303c90ad52e458a34eaf2f..0000000000000000000000000000000000000000 --- a/PlatformIO_ESP32_oscilloscope/src/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include "myXHZS.h" - -/** - * @brief 介绍 - * -* 选择工程环境:esp32dev -* 如需使用“学会助手”功能,请参阅 `myXHZS.h` 头文件中的相关说明,已支持`蓝牙`和`Wi-Fi`功能。 -* 使用时需先调用 `uart_begin()` 函数进行初始化,然后调用相应的功能函数进行操作。 -* “学会助手”的串口功能、示波器功能和遥控器功能现已可用 ^_^ - */ -void setup() -{ - Serial.begin(115200); - - // uart_begin("esp32_BT", "12345678", WIFI_DEVICE); // 使用Wi-Fi功能 - uart_begin("esp32_AP", "esp32esp32", BLUETOOTH_DEVICE); // 使用蓝牙功能 - - // uart_EnableSerialCallback(); // 开启串口功能 - - // RemoteControl_EnableCallbackReceive(); // 开启遥控器功能 -} - -void loop() -{ - SendWave(); // 发送波形功能 - - // Oscilloscope_SendsAndReceivesData(); // 示波器功能的发送和接收数据 - - // RemoteControl_TimedReceive(JOYSTICK, DIRECTIONAL_PAD); // 遥控器的定时接收功能演示 - - delay(10); -} diff --git a/PlatfromIO_ESP32C3_ble/.gitignore b/PlatfromIO_ESP32C3_ble/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..89cc49cbd652508924b868ea609fa8f6b758ec56 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/PlatfromIO_ESP32C3_ble/.vscode/extensions.json b/PlatfromIO_ESP32C3_ble/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..080e70d08b9811fa743afe5094658dba0ed6b7c2 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/PlatfromIO_ESP32C3_ble/.vscode/settings.json b/PlatfromIO_ESP32C3_ble/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..df6bd2125e95475230f02594fc540f588c7f7be0 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/.vscode/settings.json @@ -0,0 +1,53 @@ +{ + "files.associations": { + "string_view": "cpp", + "array": "cpp", + "initializer_list": "cpp", + "utility": "cpp", + "functional": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "string": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "fstream": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/PlatformIO_ESP32_oscilloscope/include/README b/PlatfromIO_ESP32C3_ble/include/README similarity index 100% rename from PlatformIO_ESP32_oscilloscope/include/README rename to PlatfromIO_ESP32C3_ble/include/README diff --git a/PlatformIO_ESP32_oscilloscope/lib/README b/PlatfromIO_ESP32C3_ble/lib/README similarity index 100% rename from PlatformIO_ESP32_oscilloscope/lib/README rename to PlatfromIO_ESP32C3_ble/lib/README diff --git a/PlatfromIO_ESP32C3_ble/platformio.ini b/PlatfromIO_ESP32C3_ble/platformio.ini new file mode 100644 index 0000000000000000000000000000000000000000..52986b914cec43132a333464d10d571b52fbd545 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/platformio.ini @@ -0,0 +1,15 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_xiao_esp32c3] +platform = espressif32 +board = seeed_xiao_esp32c3 +framework = arduino +lib_deps = h2zero/NimBLE-Arduino@^1.4.2 diff --git a/PlatfromIO_ESP32C3_ble/src/ble.cpp b/PlatfromIO_ESP32C3_ble/src/ble.cpp new file mode 100644 index 0000000000000000000000000000000000000000..162e2f8c454227b92abb5ac8c8ab2a15694c9873 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/src/ble.cpp @@ -0,0 +1,164 @@ + +#include "ble.h" + +const char SERVICE_UUID[] = "71362945-1f69-4939-a7dd-5be9488a6639"; +const char TS_UUID[] = "c943c206-fb92-4f39-aae0-cc939f33b704"; +const char RS_UUID[] = "c9c953f1-121c-418b-9f69-36580eecdf9f"; + + +void BLEManager::init(const char* deviceName, uint32_t devicePassword, NimBLEServerCallbacks* pServerCallbacks, NimBLECharacteristicCallbacks* pCharacteristicCallbacks) +{ + NimBLEDevice::init(deviceName); + NimBLEDevice::setSecurityAuth(true, true, true); + NimBLEDevice::setSecurityPasskey(devicePassword); // 项目需要固定密码 + NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_ONLY); + +#ifdef ESP_PLATFORM + NimBLEDevice::setPower(ESP_PWR_LVL_P9); /** +9db */ +#else + NimBLEDevice::setPower(9); /** +9db */ +#endif + + pServer = NimBLEDevice::createServer(); + pServer->setCallbacks(pServerCallbacks); + pService = pServer->createService(SERVICE_UUID); + + pRsCharacteristic = pService->createCharacteristic( + RS_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::READ_AUTHEN); + pTsCharacteristic = pService->createCharacteristic( + TS_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::NOTIFY); + + pTsCharacteristic->setCallbacks(pCharacteristicCallbacks); + pTsCharacteristic->setValue("TS"); + pRsCharacteristic->setValue("RS"); + pService->start(); + + NimBLEDevice::setMTU(27); // 协商更大的 MTU + + NimBLEAdvertising* pAdvertising = NimBLEDevice::getAdvertising(); + pAdvertising->addServiceUUID(SERVICE_UUID); + pAdvertising->start(); + + receiveBuffer = ""; +} + + +void BLEManager::sendData(const uint8_t* data, size_t size) +{ + pTsCharacteristic->setValue(data, size); + pTsCharacteristic->notify(); +} + +void BLEManager::sendString(const String& data) +{ + pTsCharacteristic->setValue(data); + pTsCharacteristic->notify(); +} + +char* BLEManager::getDataChar() +{ + String data = pTsCharacteristic->getValue(); + size_t length = data.length(); + + if (length > 0) + { + length = ((length - 1) > sizeof(receiveBuffer2) ? sizeof(receiveBuffer2) : length); + data.toCharArray(receiveBuffer2, length + 1); // +1 是为了包括终止符 + } + else + { + receiveBuffer2[0] = '\0'; // 如果没有数据,确保缓冲区为空 + } + return receiveBuffer2; +} + +String BLEManager::getData() +{ + return receiveBuffer; +} + +void BLEManager::setData(String& data) +{ + receiveBuffer = data; +} + + +/** +* \brief 格式化输出 +* +* 类似 printf() 功能,实现多个变量输出 +*/ +void BLEManager::printf(const char* format, ...) +{ + char printfBuffer[64]; + va_list args; + va_start(args, format); + vsnprintf(printfBuffer, sizeof(printfBuffer), format, args); + va_end(args); + + sendString(printfBuffer); +} + + +void BLEManager::setWrite(BLECharacteristic& pCharacteristic) +{ + String rxValue = pCharacteristic.getValue(); + this->setData(rxValue); + + // pCharacteristic.setValue(rxValue); + // // pCharacteristic.indicate(); + // pCharacteristic.notify(); + // Serial.println(rxValue); + + if (this->onBleCallbackFunction != nullptr) + { + onBleCallbackFunction(pCharacteristic); + } +} + +// BLECharacteristic* BLEManager::getWrite() +// { +// // return this->pBleCharacteristic; +// } + +void BLEManager::setBindCallbackFunction(BindBleCallbackFunction callback) +{ + this->onBleCallbackFunction = callback; +} + +// void BLEManager::handleDataReceived(BLECharacteristic& pBleCharacteristic) +// { +// if(this->onBleCallbackFunction != nullptr) +// { +// onBleCallbackFunction(pBleCharacteristic); +// } +// } + + +void ServerCallbacks::onConnect(BLEServer* pServer) +{ + Serial.println("onConnect"); +} + +void ServerCallbacks::onDisconnect(BLEServer* pServer) +{ + Serial.println("onDisconnect"); +} + +void CharacteristicCallbacks::onWrite(BLECharacteristic* pCharacteristic) +{ + if (bleInstance != nullptr) + { + bleInstance->setWrite(*pCharacteristic); + } + else + { + Serial.println("bleInstance is nullptr"); + } +} + +void CharacteristicCallbacks::onRead(BLECharacteristic* pCharacteristic) +{ + Serial.println("onRead"); +} + diff --git a/PlatfromIO_ESP32C3_ble/src/ble.h b/PlatfromIO_ESP32C3_ble/src/ble.h new file mode 100644 index 0000000000000000000000000000000000000000..40d146a69fcdc252936cc56ff948bc124216296d --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/src/ble.h @@ -0,0 +1,227 @@ + +#ifndef _ble_h_ +#define _ble_h_ + +#include +#include +#include + +class BLEManager { +public: + typedef std::function BindBleCallbackFunction; // 定义回调函数类型 + + void init(const char* deviceName, + uint32_t devicePassword, + NimBLEServerCallbacks* pServerCallbacks, + NimBLECharacteristicCallbacks* pCharacteristicCallbacks); + + + void sendData(const uint8_t* data, size_t size); + void sendString(const String& data); + + char* getDataChar(); // 从 pTsCharacteristic 获取数据效果一样,回调测试 + String getData(); // 从 onWrite() 回调重新函数中获取数据 + void setData(String& data); + void printf(const char* format, ...); + + void setWrite(BLECharacteristic& pCharacteristic); + + void setBindCallbackFunction(BindBleCallbackFunction callback); // 设置回调函数 + +private: + char receiveBuffer2[32]; + String receiveBuffer; + NimBLEServer* pServer; + NimBLEService* pService; + + NimBLECharacteristic* pRsCharacteristic; + NimBLECharacteristic* pTsCharacteristic; + + BindBleCallbackFunction onBleCallbackFunction; // 存储回调函数 + + // void handleDataReceived( BLECharacteristic& pBleCharacteristic); // 处理数据接收 + +}; + + +class ServerCallbacks : public BLEServerCallbacks { +public: + void onConnect(BLEServer* pServer) override; + void onDisconnect(BLEServer* pServer) override; + +}; + + +class CharacteristicCallbacks : public BLECharacteristicCallbacks { +public: + CharacteristicCallbacks(BLEManager* instance) : bleInstance(instance) {} + + void onWrite(BLECharacteristic* pCharacteristic) override; + void onRead(BLECharacteristic* pCharacteristic) override; + +private: + BLEManager* bleInstance; + +}; + + + +#endif // !_ble_h_ + + + +#if false + +#include +#include + +const char SERVICE_UUID[] = "71362945-1f69-4939-a7dd-5be9488a6639"; +const char TS_UUID[] = "c943c206-fb92-4f39-aae0-cc939f33b704"; +const char RS_UUID[] = "c9c953f1-121c-418b-9f69-36580eecdf9f"; + +class mySend +{ +public: + void init(const char* deviceName, + uint32_t devicePassword, + NimBLEServerCallbacks* pServerCallbacks, + NimBLECharacteristicCallbacks* pCharacteristicCallbacks) + { + NimBLEDevice::init(deviceName); + NimBLEDevice::setSecurityAuth(true, true, true); + NimBLEDevice::setSecurityPasskey(devicePassword); // 项目需要固定密码 + NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_ONLY); + + pServer = NimBLEDevice::createServer(); + pServer->setCallbacks(pServerCallbacks); + + pService = pServer->createService(SERVICE_UUID); + + pRsCharacteristic = pService->createCharacteristic( + RS_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::READ_AUTHEN); + pTsCharacteristic = pService->createCharacteristic( + TS_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::NOTIFY); + + pTsCharacteristic->setCallbacks(pCharacteristicCallbacks); + + pTsCharacteristic->setValue("TS"); + pRsCharacteristic->setValue("RS"); + pService->start(); + + NimBLEAdvertising* pAdvertising = NimBLEDevice::getAdvertising(); + pAdvertising->addServiceUUID(SERVICE_UUID); + pAdvertising->start(); + } + + void send(const uint8_t* data, size_t size) + { + Serial.print("Sending data: "); + pTsCharacteristic->setValue(data, size); + pTsCharacteristic->notify(); + } + + +private: + NimBLEServer* pServer; + NimBLEService* pService; + NimBLECharacteristic* pRsCharacteristic; + NimBLECharacteristic* pTsCharacteristic; +}; + +class MyServerCallbacks : public BLEServerCallbacks +{ + void onConnect(BLEServer* pServer) + { + Serial.println("onConnect"); + } + + void onDisconnect(BLEServer* pServer) + { + Serial.println("onDisconnect"); + } +}; + +class MyEventCallbacks : public BLECharacteristicCallbacks +{ +private: + mySend* sendInstance; + +public: + MyEventCallbacks(mySend* instance) : sendInstance(instance) {} + + void onWrite(BLECharacteristic* pCharacteristic) + { + String rxValue = pCharacteristic->getValue(); // 接收信息 + + if (rxValue.length() > 0) + { + // 发送给连接端 + // pCharacteristic->setValue(rxValue); + // pCharacteristic->notify(); + + // 打印串口信息 + Serial.println(rxValue); + + // 调用额外的 send 函数 + if (sendInstance) { + // sendInstance->send(rxValue.c_str()); + sendInstance->send22(); + } + } + } + + void onRead(BLECharacteristic* pCharacteristic) + { + Serial.println("onRead"); + } +}; + + + +class BleManager +{ +private: + mySend* myClass; + MyServerCallbacks* serverCallbacks; + MyEventCallbacks* eventCallbacks; + +public: + BleManager() + { + myClass = new mySend(); + serverCallbacks = new MyServerCallbacks(); + eventCallbacks = new MyEventCallbacks(myClass); + } + + ~BleManager() + { + delete myClass; + delete serverCallbacks; + delete eventCallbacks; + } + + void init() + { + myClass->init("NimBLE-ap", 115200, serverCallbacks, eventCallbacks); + } + + void send(const char* data) + { + myClass->send(data); + } +}; + +BleManager bleManager; + +void setup() { + Serial.begin(115200); + bleManager.init(); +} + +void loop() +{ + String str = "Hello world!"; + // bleManager.send(str.c_str()); + delay(2000); +} +#endif diff --git a/PlatfromIO_ESP32C3_ble/src/main.cpp b/PlatfromIO_ESP32C3_ble/src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eebb414781ad815f567e54be00cf295986ec3cc5 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/src/main.cpp @@ -0,0 +1,54 @@ +#include +#include "myXHZS.h" + +// 学会助手在ble低功耗蓝牙模块连接,出现连接断开问题,往群里提问 ^_^ +XHZS assistant; + +void setup() +{ + Serial.begin(115200); + + assistant.ble_init("NimBLE-ap", 115200); // ble 蓝牙的名称和密码 + + assistant.serialPort_CallbackFunction(); // 开启串口 + assistant.remoteControl_CallbackFunction(); // 开启遥控,实时模块 OFF + +} + +void loop() +{ + // assistant.SendWave(); // 把延时注释掉 ok + + delay(1000); + +} + + + + +// 测试案例 +void test() +{ + // String str = "Hello"; +// assistant->uart_SendArray((uint8_t*)str.c_str(), str.length()); +// delay(1000); + +// Serial.println(assistant->uart_GetData()); + +// // uint8_t ch[] = "can"; +// // assistant->uart_SendByte(&ch[2]); +// delay(1000); + +// Serial.println(assistant->uart_GetData()); + +// String str = assistant.uart_GetDataString(); +// Serial.println(str); +// delay(1000); + +// char* str = assistant.uart_GetDataChar(); +// Serial.println(str); +// delay(1000); + +// assistant.SendWave(); +// assistant.Oscilloscope_SendsAndReceives(); +} diff --git a/PlatfromIO_ESP32C3_ble/src/myXHZS.cpp b/PlatfromIO_ESP32C3_ble/src/myXHZS.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8dfae0eb659a41105951fc3f04cc9193656efc2e --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/src/myXHZS.cpp @@ -0,0 +1,440 @@ +#include "myXHZS.h" + + +void XHZS::ble_init(const char* deviceName, uint32_t devicePassword) +{ + bleManager->init(deviceName, devicePassword, serverCallbacks, characteristicCallbacks); + memset(receiveBuffer, 0, sizeof(receiveBuffer)); + functionRegister = 0; +} + +void XHZS::onAppCallbackFunction(BLECharacteristic& pBleCharacteristic) +{ + // String receiveData = pBleCharacteristic.getValue(); + printf("onAppCallbackFunction"); +} + +void XHZS::setOnAppCallbackFunction(std::function callback) +{ + bleManager->setBindCallbackFunction(callback); +} + +void XHZS::Enable_CallbackFunction(enumAppFunction appFunction) +{ + functionRegister = 0; + switch (appFunction) + { + case APP_SERIAL_PORT: + bleManager->setBindCallbackFunction(std::bind(&XHZS::serialPort, this, std::placeholders::_1)); + functionRegister = APP_SERIAL_PORT; + break; + + case APP_CLOCK: + /* code */ + break; + + case APP_REMOTE_CONTROL: + bleManager->setBindCallbackFunction(std::bind(&XHZS::remoteControl, this, std::placeholders::_1)); + functionRegister = APP_REMOTE_CONTROL; + break; + + default: + Serial.println("No such function"); + break; + } +} + + +void XHZS::serialPort_CallbackFunction() +{ + Enable_CallbackFunction(APP_SERIAL_PORT); +} + +void XHZS::serialPort(BLECharacteristic& pBleCharacteristic) +{ + if (functionRegister != APP_SERIAL_PORT) + { + return; + } + char* data = this->bleManager->getDataChar(); + this->bleManager->sendString(data); + Serial.printf("test:%s\n", data); +} + + +// 发送一个字节 +void XHZS::uart_SendByte(const uint8_t* byte) +{ + bleManager->sendData(byte, 1); +} + +// 发送数组,可以转换类型 +void XHZS::uart_SendArray(const uint8_t* array, uint32_t size) +{ + bleManager->sendData(array, size); +} + +// 发送字符串 +void XHZS::uart_SendString(const String& str) +{ + bleManager->sendString(str); +} + +String XHZS::uart_GetDataString() +{ + return bleManager->getData(); +} + +char* XHZS::uart_GetDataChar() +{ + String data = bleManager->getData(); + size_t length = data.length(); + + if (length > 0) + { + length = ((length - 1) > sizeof(receiveBuffer) ? sizeof(receiveBuffer) : length); + data.toCharArray(receiveBuffer, length + 1); // +1 是为了包括终止符 + } + else + { + receiveBuffer[0] = '\0'; // 如果没有数据,确保缓冲区为空 + } + return receiveBuffer; +} + +void XHZS::printf(const char* format, ...) +{ + char printfBuffer[64]; + va_list args; + va_start(args, format); + vsnprintf(printfBuffer, sizeof(printfBuffer), format, args); + va_end(args); + + bleManager->sendString(printfBuffer); + // bleManager->sendData((uint8_t*)printfBuffer, strlen(printfBuffer)); +} + + + +void XHZS::remoteControl_CallbackFunction() +{ + Enable_CallbackFunction(APP_REMOTE_CONTROL); +} + +void XHZS::remoteControl(BLECharacteristic& pBleCharacteristic) +{ + if (functionRegister != APP_REMOTE_CONTROL) + { + return; + } + char* buffer = this->bleManager->getDataChar(); + size_t size = strlen(buffer); + + structRemoteControlDataFormat buttonBuffer = {}; // 输出的缓冲区 + buttonBuffer.end = sizeof(buttonBuffer) / sizeof(buttonBuffer.start); + short* ptr = &buttonBuffer.start; + + uint8_t cmd[4] = {}; // 指令 + uint8_t data[4] = {}; // 数据 + + char orderBuffer[4] = {}; + size = (size > sizeof(orderBuffer) ? sizeof(orderBuffer) : size); + memcpy(orderBuffer, buffer, size); + + // Serial.printf("size: %d\r\n", size); + + // 判断是否摇杆数据,在进行解释 + switch (size) + { + case REAL_TIME_JOYSTICK_SIZE: + if ((orderBuffer[0] & 0xF0) == 0x10) + { + cmd[0] = 0x9A; + RemoteControl_getJoystickValueXY(orderBuffer, buttonBuffer.LEFT_x_axis, buttonBuffer.LEFT_y_axis); + // Serial.printf("x: %d y: %d\r\n", buttonBuffer.LEFT_x_axis, buttonBuffer.LEFT_y_axis); + } + else if ((orderBuffer[0] & 0xF0) == 0x50) + { + cmd[0] = 0x9C; + RemoteControl_getJoystickValueXY(orderBuffer, buttonBuffer.RIGHT_x_axis, buttonBuffer.RIGHT_y_axis); + // Serial.printf("x: %d y: %d\r\n", buttonBuffer.RIGHT_x_axis, buttonBuffer.RIGHT_y_axis); + } + break; + + case REAL_TIME_BUTTON_SIZE: + + // 保持 cmd[0] 的指令不变 + // 处理 cmd[1] 的指令转换为数组下标 + cmd[0] = orderBuffer[0] & 0xF0; + cmd[1] = (orderBuffer[0] & 0xF0) / 16; + data[0] = (orderBuffer[0] & 0x0F); + + // 把结构体当成数组 + ptr[cmd[1]] = data[0]; + + break; + } + /** + * \brief 实时响应处理方式,每次接收一个数据指令 + * + * true 把数据存储在结构体中,你自己调用 + * false 使用 switch 语句处理数据,更直观 + */ +#if false + RemoteControl_StructureArrayProcessingData(buttonBuffer); +#else + RemoteControl_SwitchCaseProcessingData(buttonBuffer, cmd[0], data[0]); +#endif + +} + +void XHZS::RemoteControl_getJoystickValueXY(char(&inputButtonData)[4], short& output_x_axis, short& output_y_axis) +{ + // 摇杆接收格式: 1A 23 31 46 + uint8_t data[4] = { 0 }; + short x, y; + + data[0] = inputButtonData[0] & 0x0F; + data[1] = inputButtonData[1] & 0x0F; + + data[2] = inputButtonData[2] & 0x0F; + data[3] = inputButtonData[3] & 0x0F; + + // 摇杆默认中心数值是:100,经过运算后,中心数值为0 + // left 100 ~ 0 ~ 100 right + // up 100 ~ 0 ~ 100 down + x = (data[0] * 16 + data[1]) - 100; + output_x_axis = ((x > 0) ? x : -x); + + y = (data[2] * 16 + data[3]) - 100; + output_y_axis = ((y > 0) ? y : -y); +} + +void XHZS::RemoteControl_SwitchCaseProcessingData(structRemoteControlDataFormat& remoteControlData, uint8_t cmd, uint8_t value) +{ + switch (cmd) + { + case LEFT_UP: + this->printf("\r\n"); + printf("LEFT_UP: %d\r\n", value); + break; + case LEFT_DOWN: + printf("LEFT_DOWN: %d\r\n", value); + break; + case LEFT_LEFT: + printf("LEFT_LEFT: %d\r\n", value); + break; + case LEFT_RIGHT: + printf("LEFT_RIGHT: %d\r\n", value); + break; + + case RIGHT_UP: + printf("RIGHT_UP: %d\r\n", value); + break; + case RIGHT_DOWN: + printf("RIGHT_DOWN: %d\r\n", value); + break; + case RIGHT_LEFT: + printf("RIGHT_LEFT: %d\r\n", value); + break; + case RIGHT_RIGHT: + printf("RIGHT_RIGHT: %d\r\n", value); + break; + + case LEFT_X_AXIS: + printf("x: %d y: %d\r\n", remoteControlData.LEFT_x_axis, remoteControlData.LEFT_y_axis); + break; + + case RIGHT_X_AXIS: + printf("x: %d y: %d\r\n", remoteControlData.RIGHT_x_axis, remoteControlData.RIGHT_y_axis); + break; + + case BUTTON_A: + printf("A_BUTTON: %d\r\n", value); + break; + case BUTTON_B: + printf("B_BUTTON: %d\r\n", value); + break; + case BUTTON_C: + printf("C_BUTTON: %d\r\n", value); + break; + case BUTTON_D: + printf("D_BUTTON: %d\r\n", value); + break; + case BUTTON_E: + printf("E_BUTTON: %d\r\n", value); + break; + case BUTTON_F: + printf("F_BUTTON: %d\r\n", value); + break; + } +} + +void XHZS::RemoteControl_StructureArrayProcessingData(structRemoteControlDataFormat& remoteControlData) +{ + short* ptr = &remoteControlData.start; // 获取结构体首地址 + for (size_t i = 0; i <= (remoteControlData.end - 1); i++) + { + Serial.printf("%d-%d ", i, ptr[i]); + } + Serial.println(); +} + +void XHZS::oscilloscope_CallbackFunction() +{ + Enable_CallbackFunction(APP_OSCILLOSCOPE); +} + + + +/************************************************************** + *函数名称:XHZS_SendWave + *简 介:学会助手APP虚拟示波器下位机程序(兼容山外) + *输 入:wareaddr:数据数组起始地址 waresize:数组大小 + *输 出:无 + *注意事项:无 + **************************************************************/ +void XHZS::Osc_SendWave(uint8_t* waveaddr, uint16_t wavesize) +{ + uint8_t cmdf[2] = { 0x03, 0xFC }; // 帧头 + uint8_t cmdr[2] = { 0xFC, 0x03 }; // 帧尾 + + uart_SendArray(cmdf, sizeof(cmdf)); // 发送帧头 + uart_SendArray(waveaddr, wavesize); // 发送数据 + uart_SendArray(cmdr, sizeof(cmdr)); // 发送帧尾 +} + + +/************************************************************** + *函数名称:SendWave + *简 介:发送数据到学会助手APP虚拟示波器 + *输 入:无 + *输 出:无 + *注意事项:将要发送的数据赋值给Wave数组即可,通道依次对应 + **************************************************************/ +void XHZS::SendWave() +{ + float i; + float Wave[4] = { 0 }; // 注意数据类型;数组大小即为通道数量,最多四条通道 + + // 正弦波测试 + for (i = 0; i < 500; i += 0.1) + { + Wave[0] = sin(i); + Wave[1] = cos(i); + Wave[2] = -sin(i); + Wave[3] = -cos(i); + Osc_SendWave((uint8_t*)Wave, sizeof(Wave)); + + delay(30); + } +} + +/************************************************************** + *函数名称:OscGetFloat + *简 介:将字符转为浮点数 + *输 入:p:字符串;value:用于获取输出值 + *输 出:(==0)转成功;(!=0)转失败 + *注意事项:虚拟示波器调参用,以','为数据分隔符 + **************************************************************/ +char XHZS::Osc_GetFloat(const char* p, float* value) +{ + int i; + int negative_flag = 1; + int float_flag = 0; + float tmp_value = 0; + for (i = 0; i < 16; i++) + { + if (*p == ',') // 检测到分隔符,返回值 + { + tmp_value *= negative_flag; + *value = tmp_value; + return 0; + } + else if (*p == '-') // 检测到负号 + { + negative_flag = -1; + } + else if (*p == '.') // 检测到小数点 + { + float_flag = -1; + } + else if (*p >= '0' && *p <= '9') + { + if (float_flag == 0) + { + tmp_value = tmp_value * 10 + (*p - 0x30); + } + else + { + tmp_value += (*p - 0x30) * pow(10, float_flag); + float_flag--; + } + } + else + { + return 1; + } + p++; + } + return 2; +} +/************************************************************** + *函数名称:OscGetValue + *简 介:从字符串中获取指定参数数值 + *输 入:p:字符串,以'\0'结尾,否则将出错 + * name:指定参数名称,如"c12"获取第1组第2个参数; + * value:用于获取输出值; + *输 出:(==0)转成功;(!=0)转失败 + *注意事项:虚拟示波器调参用,字符串中以'\0'为结束符 + **************************************************************/ +char XHZS::Osc_GetValue(const char* p, const char* name, float* value) +{ + float tmp_value; + int feedback; + p = strstr(p, name); + if (p == NULL) + { + return 1; + } + p += 4; + feedback = Osc_GetFloat(p, &tmp_value); + if (feedback == 0) + { + *value = tmp_value; + return 0; + } + return 2; +} + + +/** + * @brief 示波器的发送数据和接收数据 + * + * 定义 float 类型, + * 从 uart_receiveBuffer() 接收为 char* 类型 , + * 经过 OscGetValue 处理后,将数据赋值给 float 类型, + * float 类型,经过 uart_printf() 发送出去,变成 string 字符串类型 + */ +void XHZS::Oscilloscope_SendsAndReceives() +{ + float value[4]; + char* USART_RX_BUF = uart_GetDataChar(); + + // value[1] = 10.0; + // value[2] = 20.0; + // value[3] = 30.0; + // value[4] = 40.0; + + Osc_GetValue(USART_RX_BUF, "c11", &value[1]); + Osc_GetValue(USART_RX_BUF, "c12", &value[2]); + Osc_GetValue(USART_RX_BUF, "c13", &value[3]); + Osc_GetValue(USART_RX_BUF, "c14", &value[4]); + + // 处理数据 // 低功耗蓝牙最大传输限制在20字节 + printf("w:%.2f,%.2f\r\n", value[1], value[2]); + + // printf("w:%.2f,%.2f,%.2f,%.2f\r\n", value[1], value[2], value[3], value[4]); + + delay(30); +} \ No newline at end of file diff --git a/PlatfromIO_ESP32C3_ble/src/myXHZS.h b/PlatfromIO_ESP32C3_ble/src/myXHZS.h new file mode 100644 index 0000000000000000000000000000000000000000..0e2240d9577bf866afc9f16647914ab1a2f11da6 --- /dev/null +++ b/PlatfromIO_ESP32C3_ble/src/myXHZS.h @@ -0,0 +1,211 @@ +#ifndef _MYXHZS_H_ +#define _MYXHZS_H_ +#include +#include "ble.h" + +// 无线设备类型 +enum enumWirelessDevice +{ + EMPTY, // 空设备 + BLUETOOTH_DEVICE, // 蓝牙设备 + WIFI_DEVICE // Wi-Fi设备 +}; + +// 遥控器数据格式 +struct structRemoteControlDataFormat +{ + short start; // 起始标志 // 0 + + short LEFT_up; // 向上 // 1 + short LEFT_down; // 向下 + short LEFT_left; // 向左 + short LEFT_right; // 向右 + + short RIGHT_up; // 5 + short RIGHT_down; // + short RIGHT_left; // + short RIGHT_right; // + + short middle; // 9 + + short BUTTON_A; // 按钮A + short BUTTON_B; // 按钮B + short BUTTON_C; // 按钮C + short BUTTON_D; // 按钮D + short BUTTON_E; // 按钮E + short BUTTON_F; // 按钮F + + short LEFT_x_axis; // 左摇杆X轴 // 16 + short LEFT_y_axis; // + short RIGHT_x_axis; // 右摇杆X轴 // 18 + short RIGHT_y_axis; // + + short end; // 结束标志位 // 20 +}; + +// 遥控器指令格式 +enum enumRemoteControlOrderFormat +{ + LEFT_UP = 0X10, // 左侧方向键上 + LEFT_DOWN = 0X20, // + LEFT_LEFT = 0X30, // 左侧方向键左 + LEFT_RIGHT = 0X40, // + + RIGHT_UP = 0X50, // 右侧方向键上 + RIGHT_DOWN = 0X60, // + RIGHT_LEFT = 0X70, // 右侧方向键左 + RIGHT_RIGHT = 0X80, // + + LEFT_X_AXIS = 0X9A, // 左侧摇杆的指令 + LEFT_Y_AXIS = 0X9B, + RIGHT_X_AXIS = 0X9C, // 右侧摇杆的指令 + RIGHT_Y_AXIS = 0X9D, + + BUTTON_A = 0XA0, // 按钮A + BUTTON_B = 0XB0, // 按钮B + BUTTON_C = 0XC0, // 按钮C + BUTTON_D = 0XD0, // 按钮D + BUTTON_E = 0XE0, // 按钮E + BUTTON_F = 0XF0 // 按钮F +}; + +// 遥控器实时数据大小 +enum enumRemoteControlRealTimeDataSize +{ + REAL_TIME_BUTTON_SIZE = 1, // 按钮数据大小 + REAL_TIME_JOYSTICK_SIZE = 4 // 摇杆数据大小 +}; + +// 遥控器定时数据大小 +enum enumRemoteControlTimingDataSize +{ + TIMING_DIRECTIONAL_PAD_SIZE = 4, // 方向键数据大小 + TIMING_JOYSTICK_SIZE = 6, // 摇杆数据大小 + TIMING_BUTTON_SIZE = 6 // 按钮数据大小 +}; + +// 遥控器手柄组合类型 +enum enumRemoteControlHandleType +{ + DIRECTIONAL_PAD = 0X00, // 左方向键 + 右方向键 + D_PAD_AND_JOYSTICK = 0X01, // 左方向键 + 右摇杆 + JOYSTICK_AND_D_PAD = 0X10, // 左摇杆 + 右方向键 + JOYSTICK = 0X11, // 左摇杆 + 右摇杆 + // For players to use + LEFT_DIRECTIONAL_PAD = 0x00, + RIGHT_DIRECTIONAL_PAD = 0x00, + LEFT_JOYSTICK = 0X10, + RIGHT_JOYSTICK = 0X01 +}; + +/** + * \brief 遥控器魔法数字 + * + * \note + * char ch = '1'; // 字符 '1' + * int dec = 49; // 十进制 49 + * int hex = 0x31; // 十六进制 0x31 + * 三种不同方式表示的数字都是 1,但它们的类型和值不同。 + */ +enum enumRemoteControlMagicNumber +{ + DIGIT_ZERO = 0X30, + DIGIT_ONE = 0X31 +}; + +// 例:2022年5月21日周五21点35分24.1秒 +struct structDateTime +{ + char yearFirst[3]; // 年前两位 + char yearLast[3]; // 年后两位 + char month[3]; // 月 + char day[3]; // 日 + char week[3]; // 星期 + char hour[3]; // 时 + char minute[3]; // 分 + char second[3]; // 秒 + char millisecond[3]; // 毫秒 + char end[3]; // 结束标志位 +}; + +enum enumAppFunction +{ + APP_SERIAL_PORT, // 串口 + APP_DRAWING_BOARD, // 绘图板 + APP_CLOCK, // 时钟 + APP_SECONDS, // 秒表 + APP_REMOTE_CONTROL, // 遥控器 + APP_OSCILLOSCOPE +}; + + + + +class XHZS +{ +private: + BLEManager* bleManager; + ServerCallbacks* serverCallbacks; + CharacteristicCallbacks* characteristicCallbacks; + + char receiveBuffer[64]; + // 功能寄存器 + char functionRegister; + +public: + XHZS() + { + bleManager = new BLEManager(); + serverCallbacks = new ServerCallbacks(); + characteristicCallbacks = new CharacteristicCallbacks(bleManager); + // setOnAppCallbackFunction(std::bind(&XHZS::onAppCallbackFunction, this, std::placeholders::_1)); // 设置默认回调函数 + } + + ~XHZS() + { + delete bleManager; + delete serverCallbacks; + delete characteristicCallbacks; + } + + void ble_init(const char* deviceName, uint32_t devicePassword); + + void onAppCallbackFunction(BLECharacteristic& pBleCharacteristic); // 默认回调函数 + void setOnAppCallbackFunction(std::function callback); // 设置回调函数 + void Enable_CallbackFunction(enumAppFunction appFunction); + + // serial port // 串口 uart + void serialPort_CallbackFunction(); + void serialPort(BLECharacteristic& pBleCharacteristic); + + void uart_SendByte(const uint8_t* byte); + void uart_SendArray(const uint8_t* array, uint32_t num); + void uart_SendString(const String& str); + + String uart_GetDataString(); + char* uart_GetDataChar(); + + void printf(const char* format, ...); + + // remote control // 遥控器 + void remoteControl_CallbackFunction(); + void remoteControl(BLECharacteristic& pBleCharacteristic); + void RemoteControl_getJoystickValueXY(char(&inputButtonData)[4], short& output_x_axis, short& output_y_axis); + void RemoteControl_SwitchCaseProcessingData(structRemoteControlDataFormat& remoteControlData, uint8_t cmd, uint8_t value); + void RemoteControl_StructureArrayProcessingData(structRemoteControlDataFormat& remoteControlData); + + // oscilloscope // 示波器 + void oscilloscope_CallbackFunction(); + + void Osc_SendWave(uint8_t* waveaddr, uint16_t wavesize); + + char Osc_GetFloat(const char* p, float* value); + char Osc_GetValue(const char* p, const char* name, float* value); + + // 波形测试函数 + void SendWave(); + void Oscilloscope_SendsAndReceives(); + +}; + +#endif diff --git a/PlatformIO_ESP32_oscilloscope/test/README b/PlatfromIO_ESP32C3_ble/test/README similarity index 100% rename from PlatformIO_ESP32_oscilloscope/test/README rename to PlatfromIO_ESP32C3_ble/test/README diff --git a/README.md b/README.md index 6acb6017b4baaac01b680bb03ee28e9c73becf64..1981942250462054cf5774fc44550d95ff3d5920 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ESP32_oscilloscope -## 项目介绍 +## 项目介绍 此项目宗旨在将原本“学会助手”基于硬件STM32F1在Keil环境中开发的工程成功移植至ESP32芯片的arduino平台,保持原有功能与逻辑的实现。通过蓝牙通信功能,项目已初步适配“学会助手”应用的若干功能模块,正处于工程迭代阶段。我们鼓励用户在遇到任何疑问时,积极在项目社群提问 @@ -16,10 +16,22 @@ ### 适配功能 -- 示波器功能,可以发送和接收数据 -- 遥控器功能,可以定时接收遥控器数据 -- 串口功能,可以接收和发送数据 -- 待添加... +| 功能 \ 单片机 | STM32F103C8T6 |  ESP32  | ESP32C3 | +| :------: | :------: | :------: | :------:| +| 串口 | 🔴 | 🟢 | 🟢 | +| 图像 | 🔴 | 🔴 | 🔴 | +| 示波器 | 🟢 | 🟢 | 🟢 | +| UI | 🟡 | 🔴 | 🔴 | +| 遥控器 | 🟡 | 🟢 | 🟢 | +| 秒表 | 🔴 | 🔴 | 🔴 | +| 时钟 | 🔴 | 🟢 | 🔴 | +| 语音播报 | 🔴 | 🔴 | 🔴 | +| GPS | 🔴 | 🔴 | 🔴 | +| 画板 | 🔴 | 🟢 | 🔴 | + +> 🟢 表示功能已经实现,可以直接调用 +> 🟡 表示功能有视频介绍和文档说明,需要自己实现 +> 🔴 表示功能有文档说明,需要自己实现 -#### 使用说明 +### 使用说明 1. 硬件需求:ESP32-WROOM-32E作为基础硬件平台,安卓手机作为测试设备。 @@ -42,7 +54,7 @@ - 现有PlatformIO工程在此基础上增加了Wi-Fi功能,已经支持蓝牙通信和Wi-Fi通信两者二选择一即可。同时,将蓝牙、Wi-Fi与学会助手的逻辑部分进行了模块化分离,便于按需调用。(推荐使用) -#### 代码工程说明 +### 代码工程说明 1. 蓝牙封装: - 加入了蓝牙配对制作,当前的手机蓝牙连接上后,后续蓝牙配对连接会拒绝连接,想更换无线设备来控制小车,需要先断开当前手机蓝牙连接,再重新配对。 @@ -85,39 +97,33 @@ ``` ```ini - # platformio.ini + ; platformio.ini [env:esp32dev] platform = espressif32 board = esp32dev framework = arduino - # 我的 esp32-wroom-32e 硬件是 4MB flash,对分区表有所修改 + ; 我的 esp32-wroom-32e 硬件是 4MB flash,对分区表有所修改 board_build.partitions = partitions.csv - # 注意:需要在 arduino 的库管理器中安装 AsyncTCP.h + ; 注意:需要在 arduino 的库管理器中安装 AsyncTCP.h lib_deps = me-no-dev/AsyncTCP@^1.1.1 ``` -5. 注意事项: +### 注意事项 - - 学会助手的适配 esp32 蓝牙和 wifi 都已经支持 - - 功能模块之间有冲突的,不满足现有功能的小伙伴可以自行修改代码[^Don't_click] - - [^Don't_click]: 欢迎在交流群里提问 +- ***功能模块之间有冲突的,目前支持开启一个功能,不满足现状的小伙伴,提出可行的方法,或者自行修改代码*** + [Back to top](#target-anchor) +- 在对蓝牙和Wi-Fi的测试中,发现第三方的Wi-Fi库实现回调函数接收数据功能,但是在通信的速度比蓝牙慢(Wi-Fi功能大概百分50%左右,个人感觉) + +- 新增 esp32c3 的低功耗ble蓝牙功能,在测试中发现稳定性一般(使用的 esp32c3 mini 核心板) -#### 参与贡献 +### 参与贡献 ->- 感谢分享:BiliBili用户 “ ***一品芝麻糕*** ” 的分享与启发 +>- 感谢:BiliBili用户 “ ***一品芝麻糕*** ” 的分享 >- xxxx >- xxxx --- -| Column 1 | Column 2 | Column 3 | -| :------: | :------: | :------: | -| a | b | c | -| d | e | f | - ---- - ## Changelog ### update 2024.08.27 diff --git "a/\345\255\246\344\274\232\345\212\251\346\211\213\344\275\277\347\224\250\346\211\213\345\206\214\343\200\2201.4.1\343\200\221.pdf" "b/\345\255\246\344\274\232\345\212\251\346\211\213\344\275\277\347\224\250\346\211\213\345\206\214\343\200\2201.4.1\343\200\221.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..866cafd84c1723c548699e5db3834cb2d20d0bb0 Binary files /dev/null and "b/\345\255\246\344\274\232\345\212\251\346\211\213\344\275\277\347\224\250\346\211\213\345\206\214\343\200\2201.4.1\343\200\221.pdf" differ