initial
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
9
.vscode/extensions.json
vendored
Normal file
9
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"pioarduino.pioarduino-ide",
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
||||
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"nimbledevice.h": "c"
|
||||
}
|
||||
}
|
||||
3
CMakeLists.txt
Normal file
3
CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
cmake_minimum_required(VERSION 3.16.0)
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(Blinds_XIAO)
|
||||
1
components/esp-nimble-cpp
Submodule
1
components/esp-nimble-cpp
Submodule
Submodule components/esp-nimble-cpp added at 25af28bcad
8
dependencies.lock
Normal file
8
dependencies.lock
Normal file
@@ -0,0 +1,8 @@
|
||||
dependencies:
|
||||
idf:
|
||||
source:
|
||||
type: idf
|
||||
version: 5.5.1
|
||||
manifest_hash: 24b4d087511378b31aec46ab95615da067c81c6477aaa4515b222e977e29004a
|
||||
target: esp32c6
|
||||
version: 2.0.0
|
||||
102
include/BLE.cpp
Normal file
102
include/BLE.cpp
Normal file
@@ -0,0 +1,102 @@
|
||||
#include "BLE.hpp"
|
||||
#include "NimBLEDevice.h"
|
||||
#include "WiFi.hpp"
|
||||
|
||||
bool flag_scan_requested = false;
|
||||
|
||||
std::string SSID = "";
|
||||
std::string password = "";
|
||||
bool SSIDGiven = false;
|
||||
bool passGiven = false;
|
||||
|
||||
std::string token = "";
|
||||
bool tokenGiven = false;
|
||||
|
||||
// Global pointers to characteristics for notification support
|
||||
NimBLECharacteristic* ssidListChar = nullptr;
|
||||
NimBLECharacteristic* connectConfirmChar = nullptr;
|
||||
|
||||
NimBLEAdvertising* initBLE() {
|
||||
NimBLEDevice::init("BlindMaster-C6");
|
||||
|
||||
// Optional: Boost power for better range (ESP32-C6 supports up to +20dBm)
|
||||
NimBLEDevice::setPower(ESP_PWR_LVL_P9);
|
||||
|
||||
// Set security
|
||||
NimBLEDevice::setSecurityAuth(false, false, true); // bonding=false, mitm=false, sc=true (Secure Connections)
|
||||
NimBLEDevice::setSecurityIOCap(BLE_HS_IO_NO_INPUT_OUTPUT); // No input/output capability
|
||||
|
||||
NimBLEServer *pServer = NimBLEDevice::createServer();
|
||||
pServer->setCallbacks(new MyServerCallbacks());
|
||||
pServer->advertiseOnDisconnect(true); // Automatically restart advertising on disconnect
|
||||
|
||||
NimBLEService *pService = pServer->createService("181C");
|
||||
|
||||
// Create all characteristics with callbacks
|
||||
MyCharCallbacks* charCallbacks = new MyCharCallbacks();
|
||||
|
||||
// 0x0000 - SSID List (READ + NOTIFY)
|
||||
ssidListChar = pService->createCharacteristic(
|
||||
"0000",
|
||||
NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY
|
||||
);
|
||||
ssidListChar->createDescriptor("2902"); // Add BLE2902 descriptor for notifications
|
||||
|
||||
// 0x0001 - SSID (WRITE)
|
||||
NimBLECharacteristic *ssidChar = pService->createCharacteristic(
|
||||
"0001",
|
||||
NIMBLE_PROPERTY::WRITE
|
||||
);
|
||||
ssidChar->setCallbacks(charCallbacks);
|
||||
|
||||
// 0x0002 - Password (WRITE)
|
||||
NimBLECharacteristic *passChar = pService->createCharacteristic(
|
||||
"0002",
|
||||
NIMBLE_PROPERTY::WRITE
|
||||
);
|
||||
passChar->setCallbacks(charCallbacks);
|
||||
|
||||
// 0x0003 - Token (WRITE)
|
||||
NimBLECharacteristic *tokenChar = pService->createCharacteristic(
|
||||
"0003",
|
||||
NIMBLE_PROPERTY::WRITE
|
||||
);
|
||||
tokenChar->setCallbacks(charCallbacks);
|
||||
|
||||
// 0x0004 - SSID Refresh (WRITE)
|
||||
NimBLECharacteristic *ssidRefreshChar = pService->createCharacteristic(
|
||||
"0004",
|
||||
NIMBLE_PROPERTY::WRITE
|
||||
);
|
||||
ssidRefreshChar->setCallbacks(charCallbacks);
|
||||
|
||||
// 0x0005 - Connect Confirmation (READ + NOTIFY)
|
||||
connectConfirmChar = pService->createCharacteristic(
|
||||
"0005",
|
||||
NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY
|
||||
);
|
||||
connectConfirmChar->createDescriptor("2902"); // Add BLE2902 descriptor for notifications
|
||||
|
||||
// Start
|
||||
pService->start();
|
||||
|
||||
NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
|
||||
pAdvertising->addServiceUUID("181C");
|
||||
pAdvertising->setName("BlindMaster-C6");
|
||||
pAdvertising->enableScanResponse(true);
|
||||
pAdvertising->setPreferredParams(0x06, 0x12); // Connection interval preferences
|
||||
pAdvertising->start();
|
||||
|
||||
printf("BLE Started. Waiting...\n");
|
||||
flag_scan_requested = true;
|
||||
|
||||
return pAdvertising;
|
||||
}
|
||||
|
||||
void BLEtick(NimBLEAdvertising* pAdvertising) {
|
||||
if(flag_scan_requested) {
|
||||
flag_scan_requested = false;
|
||||
printf("Scanning WiFi...\n");
|
||||
scanAndUpdateSSIDList();
|
||||
}
|
||||
}
|
||||
77
include/BLE.hpp
Normal file
77
include/BLE.hpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#ifndef BLE_H
|
||||
#define BLE_H
|
||||
|
||||
#include "NimBLEDevice.h"
|
||||
|
||||
extern bool flag_scan_requested;
|
||||
|
||||
extern std::string SSID;
|
||||
extern std::string password;
|
||||
extern bool SSIDGiven;
|
||||
extern bool passGiven;
|
||||
|
||||
extern std::string token;
|
||||
extern bool tokenGiven;
|
||||
|
||||
// Global pointers to characteristics for notification support
|
||||
extern NimBLECharacteristic* ssidListChar;
|
||||
extern NimBLECharacteristic* connectConfirmChar;
|
||||
|
||||
class MyServerCallbacks : public NimBLEServerCallbacks {
|
||||
void onConnect(NimBLEServer* pServer, NimBLEConnInfo& connInfo) {
|
||||
printf("Client connected\n");
|
||||
};
|
||||
|
||||
void onDisconnect(NimBLEServer* pServer, NimBLEConnInfo& connInfo, int reason) {
|
||||
printf("Client disconnected - reason: %d\n", reason);
|
||||
// Advertising will restart automatically
|
||||
}
|
||||
};
|
||||
|
||||
class MyCharCallbacks : public NimBLECharacteristicCallbacks {
|
||||
void onWrite(NimBLECharacteristic* pChar, NimBLEConnInfo& connInfo) {
|
||||
std::string val = pChar->getValue();
|
||||
std::string uuidStr = pChar->getUUID().toString();
|
||||
|
||||
printf("onWrite called! UUID: %s, Value length: %d\n", uuidStr.c_str(), val.length());
|
||||
|
||||
// Check which characteristic was written to
|
||||
if (uuidStr.find("0001") != std::string::npos) {
|
||||
// SSID characteristic
|
||||
if (val.length() > 0) {
|
||||
printf("Received SSID: %s\n", val.c_str());
|
||||
SSID = val;
|
||||
SSIDGiven = true;
|
||||
}
|
||||
}
|
||||
else if (uuidStr.find("0002") != std::string::npos) {
|
||||
// Password characteristic
|
||||
if (val.length() > 0) {
|
||||
printf("Received Password: %s\n", val.c_str());
|
||||
passGiven = true;
|
||||
password = val;
|
||||
}
|
||||
}
|
||||
else if (uuidStr.find("0003") != std::string::npos) {
|
||||
// Token characteristic
|
||||
if (val.length() > 0) {
|
||||
printf("Received Token: %s\n", val.c_str());
|
||||
tokenGiven = true;
|
||||
token = val;
|
||||
}
|
||||
}
|
||||
else if (uuidStr.find("0004") != std::string::npos) {
|
||||
// Refresh characteristic
|
||||
printf("Refresh Requested\n");
|
||||
flag_scan_requested = true;
|
||||
}
|
||||
else {
|
||||
printf("Unknown UUID: %s\n", uuidStr.c_str());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
NimBLEAdvertising* initBLE();
|
||||
void BLEtick(NimBLEAdvertising* pAdvertising);
|
||||
|
||||
#endif
|
||||
37
include/README
Normal file
37
include/README
Normal file
@@ -0,0 +1,37 @@
|
||||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the convention is to give header files names that end with `.h'.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
||||
78
include/WiFi.cpp
Normal file
78
include/WiFi.cpp
Normal file
@@ -0,0 +1,78 @@
|
||||
#include "WiFi.hpp"
|
||||
#include "esp_wifi.h"
|
||||
#include "esp_event.h"
|
||||
#include "cJSON.h" // Native replacement for ArduinoJson
|
||||
#include "BLE.hpp"
|
||||
|
||||
void init_wifi() {
|
||||
// 1. Init Network Interface
|
||||
ESP_ERROR_CHECK(esp_netif_init());
|
||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||
esp_netif_create_default_wifi_sta();
|
||||
|
||||
// 2. Init WiFi Driver
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||
|
||||
// 3. Set Mode to Station (Client)
|
||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
||||
ESP_ERROR_CHECK(esp_wifi_start());
|
||||
}
|
||||
|
||||
void scanAndUpdateSSIDList() {
|
||||
printf("Starting WiFi Scan...\n");
|
||||
|
||||
// 1. Start Scan (Blocking Mode = true)
|
||||
// In blocking mode, this function waits here until scan is done (~2 seconds)
|
||||
wifi_scan_config_t scan_config = {
|
||||
.ssid = NULL,
|
||||
.bssid = NULL,
|
||||
.channel = 0,
|
||||
.show_hidden = false
|
||||
};
|
||||
esp_err_t err = esp_wifi_scan_start(&scan_config, true);
|
||||
|
||||
if (err != ESP_OK) {
|
||||
printf("Scan failed!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. Get the results
|
||||
uint16_t ap_count = 0;
|
||||
esp_wifi_scan_get_ap_num(&ap_count);
|
||||
|
||||
// Limit to 10 networks to save RAM/BLE MTU space
|
||||
if (ap_count > 10) ap_count = 10;
|
||||
|
||||
wifi_ap_record_t *ap_list = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) * ap_count);
|
||||
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_count, ap_list));
|
||||
|
||||
// 3. Build JSON using cJSON
|
||||
cJSON *root = cJSON_CreateArray();
|
||||
|
||||
for (int i = 0; i < ap_count; i++) {
|
||||
cJSON *item = cJSON_CreateObject();
|
||||
// ESP-IDF stores SSID as uint8_t, cast to char*
|
||||
cJSON_AddStringToObject(item, "ssid", (char *)ap_list[i].ssid);
|
||||
cJSON_AddNumberToObject(item, "rssi", ap_list[i].rssi);
|
||||
// Add encryption type if you want (optional)
|
||||
cJSON_AddNumberToObject(item, "auth", ap_list[i].authmode);
|
||||
|
||||
cJSON_AddItemToArray(root, item);
|
||||
}
|
||||
|
||||
// 4. Convert to String
|
||||
char *json_string = cJSON_PrintUnformatted(root); // Compact JSON
|
||||
printf("JSON: %s\n", json_string);
|
||||
|
||||
// 5. Update BLE
|
||||
if (ssidListChar != nullptr) {
|
||||
ssidListChar->setValue(std::string(json_string));
|
||||
ssidListChar->notify();
|
||||
}
|
||||
|
||||
// 6. Cleanup Memory (CRITICAL in C++)
|
||||
free(ap_list);
|
||||
cJSON_Delete(root); // This deletes all children (items) too
|
||||
free(json_string); // cJSON_Print allocates memory, you must free it
|
||||
}
|
||||
7
include/WiFi.hpp
Normal file
7
include/WiFi.hpp
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef WIFI_H
|
||||
#define WIFI_H
|
||||
|
||||
void init_wifi();
|
||||
void scanAndUpdateSSIDList();
|
||||
|
||||
#endif
|
||||
38
include/defines.h
Normal file
38
include/defines.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#ifndef DEFINES_H
|
||||
#define DEFINES_H
|
||||
|
||||
#define ccwSpeed 6500
|
||||
#define cwSpeed 3300
|
||||
#define offSpeed 4900
|
||||
|
||||
#define ccwMax 10
|
||||
#define cwMax 0
|
||||
|
||||
#define getMovingCW(port) ((movingCW & (1 << port)) >> port)
|
||||
#define setMovingCW(port) (movingCW |= (1 << port))
|
||||
#define clearMovingCW(port) (movingCW &= ~(1 << port))
|
||||
#define getMovingCCW(port) ((movingCCW & (1 << port)) >> port)
|
||||
#define setMovingCCW(port) (movingCCW |= (1 << port))
|
||||
#define clearMovingCCW(port) (movingCCW &= ~(1 << port))
|
||||
#define getCalibCW(port) ((calibCW & (1 << port)) >> port)
|
||||
#define setCalibCW(port) (calibCW |= (1 << port))
|
||||
#define clearCalibCW(port) (calibCW &= ~(1 << port))
|
||||
#define getCalibCCW(port) ((calibCCW & (1 << port)) >> port)
|
||||
#define setCalibCCW(port) (calibCCW |= (1 << port))
|
||||
#define clearCalibCCW(port) (calibCCW &= ~(1 << port))
|
||||
#define getCalibDone(port) ((calibDone & (1 << port)) >> port)
|
||||
#define setCalibDone(port) (calibDone |= (1 << port))
|
||||
#define clearCalibDone(port) (calibDone &= ~(1 << port))
|
||||
#define getBlocked(port) ((blocked & (1 << port)) >> port)
|
||||
#define setBlocked(port) (blocked |= (1 << port))
|
||||
#define clearBlocked(port) (blocked &= ~(1 << port))
|
||||
#define getPos10(port) ((movingCCW & (1 << (port + 4))) >> (port + 4))
|
||||
#define setPos10(port) (movingCCW |= (1 << (port + 4)))
|
||||
#define clearPos10(port) (movingCCW &= ~(1 << (port + 4)))
|
||||
#define getPos0(port) ((movingCW & (1 << (port + 4))) >> (port + 4))
|
||||
#define setPos0(port) (movingCW |= (1 << (port + 4)))
|
||||
#define clearPos0(port) (movingCW &= ~(1 << (port + 4)))
|
||||
|
||||
#define prefNameCalibs "periph_info_"
|
||||
|
||||
#endif
|
||||
30
include/pwm.c
Normal file
30
include/pwm.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#include "driver/ledc.h"
|
||||
#include "defines.h"
|
||||
|
||||
void init_servo_PWM(void) {
|
||||
ledc_timer_config_t ledc_timer = {
|
||||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
||||
.timer_num = LEDC_TIMER_0,
|
||||
.duty_resolution = LEDC_TIMER_16_BIT,
|
||||
.freq_hz = 50,
|
||||
.clk_cfg = LEDC_AUTO_CLK
|
||||
};
|
||||
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
|
||||
|
||||
ledc_channel_config_t ledc_channel = {
|
||||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
||||
.channel = LEDC_CHANNEL_0,
|
||||
.timer_sel = LEDC_TIMER_0,
|
||||
.intr_type = LEDC_INTR_DISABLE,
|
||||
.gpio_num = 0, // Using pin D0 for servo.
|
||||
.duty = offSpeed, // Start off
|
||||
.hpoint = 0
|
||||
};
|
||||
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
|
||||
}
|
||||
|
||||
void set_servo_speed(int channel, uint32_t duty) {
|
||||
// duty input should be between 0 and 65535
|
||||
ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)channel, duty);
|
||||
ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)channel);
|
||||
}
|
||||
7
include/pwm.h
Normal file
7
include/pwm.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef PWM_H
|
||||
#define PWM_H
|
||||
|
||||
void init_servo_PWM(void);
|
||||
void set_servo_speed(int channel, int speed);
|
||||
|
||||
#endif
|
||||
46
lib/README
Normal file
46
lib/README
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into the executable file.
|
||||
|
||||
The source code of each library should be placed in a separate directory
|
||||
("lib/your_library_name/[Code]").
|
||||
|
||||
For example, see the structure of the following example libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
Example contents of `src/main.c` using Foo and Bar:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
The PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries by scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
||||
4
partitions.csv
Normal file
4
partitions.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x6000,
|
||||
phy_init, data, phy, 0xf000, 0x1000,
|
||||
factory, app, factory, 0x10000, 0x3F0000,
|
||||
|
15
platformio.ini
Normal file
15
platformio.ini
Normal file
@@ -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_esp32c6]
|
||||
platform = espressif32
|
||||
board = seeed_xiao_esp32c6
|
||||
framework = espidf
|
||||
board_build.partitions = partitions.csv
|
||||
2793
sdkconfig.seeed_xiao_esp32c6
Normal file
2793
sdkconfig.seeed_xiao_esp32c6
Normal file
File diff suppressed because it is too large
Load Diff
8
src/CMakeLists.txt
Normal file
8
src/CMakeLists.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
# This file was automatically generated for projects
|
||||
# without default 'CMakeLists.txt' file.
|
||||
|
||||
FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.* ${CMAKE_SOURCE_DIR}/include/*.cpp)
|
||||
|
||||
idf_component_register(SRCS ${app_sources}
|
||||
INCLUDE_DIRS "."
|
||||
REQUIRES nvs_flash esp-nimble-cpp)
|
||||
25
src/main.cpp
Normal file
25
src/main.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <driver/gptimer.h>
|
||||
#include "pwm.h"
|
||||
#include "defines.h"
|
||||
#include "nvs_flash.h"
|
||||
#include "NimBLEDevice.h"
|
||||
#include "BLE.hpp"
|
||||
#include "WiFi.hpp"
|
||||
|
||||
extern "C" void app_main() {
|
||||
esp_err_t ret = nvs_flash_init();
|
||||
// 2. If NVS is full or corrupt (common after flashing new code), erase and retry
|
||||
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||
ret = nvs_flash_init();
|
||||
}
|
||||
ESP_ERROR_CHECK(ret);
|
||||
|
||||
init_wifi();
|
||||
NimBLEAdvertising* pAdv = initBLE();
|
||||
|
||||
while (1) {
|
||||
BLEtick(pAdv);
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
}
|
||||
}
|
||||
11
test/README
Normal file
11
test/README
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
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:
|
||||
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
|
||||
Reference in New Issue
Block a user