diff --git a/.gitignore b/.gitignore index e257658..c926297 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ # Prerequisites *.d +.pio + +.DS_Store + # Compiled Object files *.slo *.lo diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..6f2b89c --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,519 @@ +// +// !!! 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": [ + "/Users/lklich/Programowanie/robotic_hand/include", + "/Users/lklich/Programowanie/robotic_hand/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ESP32Servo/src", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit PWM Servo Driver Library", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit BusIO", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ServoEasing/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/newlib/platform_include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions/freertos", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3/private_include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/heap/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/log/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps/sntp", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/lwip/src/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include/arch", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/platform_port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/soc", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/include/riscv", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/public_compat", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/riscv/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_pm/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ringbuf/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/vfs/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_wifi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_event/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_netif/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_eth/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcpip_adapter/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ipc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_trace/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_timer/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/mbedtls/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/esp_crt_bundle/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_update/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spi_flash/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bootloader_support/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nvs_flash/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/pthread/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/riscv", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include/port/riscv", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/esp_supplicant/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ieee802154/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/console", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/asio/asio/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/osi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/include/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/api/include/api", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/blufi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/storage", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/btc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/client/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/server/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/core/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/models/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cbor/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/unity/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cmock/CMock/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/libcoap/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/nghttp2/lib/includes", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls/esp-tls-crypto", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_adc_cal/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hid/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcp_transport/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_client/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_server/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_ota/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_server/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/interface", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protobuf-c/protobuf-c", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/common", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/security", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/transports", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mdns/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_local_ctrl/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/sdmmc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_serial_slave_link/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_websocket_client/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/expat/expat/lib", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wear_levelling/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/diskio", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/vfs", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freemodbus/freemodbus/common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/jsmn/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json/cJSON", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/libsodium/src/libsodium/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/port_include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mqtt/esp-mqtt/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/openssl/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spiffs/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wifi_provisioning/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rmaker_common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_diagnostics/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rtc_store/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_insights/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_generator/upstream", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_schedule/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp_secure_cert_mgr/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rainmaker/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/gpio_button/button/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/qrcode/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ws2812_led", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_littlefs/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/tool", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/typedef", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/image", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/math", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/nn", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/layer", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/detect", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/model_zoo", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/driver/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/conversions/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dotprod/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/mem/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/hann/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_harris/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/nuttall/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/flat_top/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/iir/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fir/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/add/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sub/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mul/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/addc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mulc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sqrt/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/add/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/addc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mulc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/sub/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fft/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dct/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/conv/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/test/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fb_gfx/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/qio_qspi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/cores/esp32", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/variants/esp32c3", + "/Users/lklich/Programowanie/robotic_hand/lib/ArduinoThread", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", + "" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "path": [ + "/Users/lklich/Programowanie/robotic_hand/include", + "/Users/lklich/Programowanie/robotic_hand/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ESP32Servo/src", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit PWM Servo Driver Library", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit BusIO", + "/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ServoEasing/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/newlib/platform_include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions/freertos", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3/private_include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/heap/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/log/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps/sntp", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/lwip/src/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include/arch", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/platform_port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/soc", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/include/riscv", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/public_compat", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/riscv/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_pm/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ringbuf/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/vfs/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_wifi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_event/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_netif/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_eth/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcpip_adapter/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ipc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_trace/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_timer/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/mbedtls/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/esp_crt_bundle/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_update/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spi_flash/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bootloader_support/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nvs_flash/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/pthread/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/riscv", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include/port/riscv", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/esp_supplicant/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ieee802154/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/console", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/asio/asio/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/osi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/include/esp32c3/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/api/include/api", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/blufi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/storage", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/btc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/client/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/server/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/core/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/models/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cbor/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/unity/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cmock/CMock/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/libcoap/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/nghttp2/lib/includes", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls/esp-tls-crypto", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_adc_cal/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hid/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcp_transport/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_client/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_server/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_ota/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_server/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/interface", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protobuf-c/protobuf-c", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/common", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/security", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/transports", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mdns/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_local_ctrl/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/sdmmc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_serial_slave_link/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_websocket_client/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/expat/expat/lib", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/port/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wear_levelling/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/diskio", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/vfs", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freemodbus/freemodbus/common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include/esp32c3", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/jsmn/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json/cJSON", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/libsodium/src/libsodium/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/port_include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mqtt/esp-mqtt/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/openssl/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spiffs/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wifi_provisioning/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rmaker_common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_diagnostics/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rtc_store/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_insights/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_generator/upstream", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_schedule/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp_secure_cert_mgr/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rainmaker/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/gpio_button/button/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/qrcode/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ws2812_led", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_littlefs/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/tool", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/typedef", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/image", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/math", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/nn", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/layer", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/detect", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/model_zoo", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/driver/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/conversions/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dotprod/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/mem/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/hann/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_harris/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/nuttall/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/flat_top/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/iir/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fir/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/add/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sub/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mul/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/addc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mulc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sqrt/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/add/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/addc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mulc/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/sub/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fft/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dct/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/conv/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/common/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/test/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fb_gfx/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/qio_qspi/include", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/cores/esp32", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/variants/esp32c3", + "/Users/lklich/Programowanie/robotic_hand/lib/ArduinoThread", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", + "/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", + "" + ] + }, + "defines": [ + "PLATFORMIO=60119", + "ARDUINO_ESP32C3_DEV", + "ARDUINO_USB_MODE=1", + "ARDUINO_USB_CDC_ON_BOOT=1", + "CORE_DEBUG_LEVEL=3", + "LOG_LOCAL_LEVEL=ESP_LOG_INFO", + "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=160000000L", + "ARDUINO=10812", + "ARDUINO_VARIANT=\"esp32c3\"", + "ARDUINO_BOARD=\"Espressif ESP32-C3-DevKitM-1\"", + "ARDUINO_PARTITION_default", + "" + ], + "cStandard": "gnu99", + "cppStandard": "gnu++11", + "compilerPath": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin/riscv32-esp-elf-gcc", + "compilerArgs": [ + "-march=rv32imc", + "" + ] + } + ], + "version": 4 +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.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/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..20bde60 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,44 @@ +// 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": "/Users/lklich/Programowanie/robotic_hand/.pio/build/esp32-c3-devkitm-1/firmware.elf", + "projectEnvName": "esp32-c3-devkitm-1", + "toolchainBinDir": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin", + "internalConsoleOptions": "openOnSessionStart", + "preLaunchTask": { + "type": "PlatformIO", + "task": "Pre-Debug" + } + }, + { + "type": "platformio-debug", + "request": "launch", + "name": "PIO Debug (skip Pre-Debug)", + "executable": "/Users/lklich/Programowanie/robotic_hand/.pio/build/esp32-c3-devkitm-1/firmware.elf", + "projectEnvName": "esp32-c3-devkitm-1", + "toolchainBinDir": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin", + "internalConsoleOptions": "openOnSessionStart" + }, + { + "type": "platformio-debug", + "request": "launch", + "name": "PIO Debug (without uploading)", + "executable": "/Users/lklich/Programowanie/robotic_hand/.pio/build/esp32-c3-devkitm-1/firmware.elf", + "projectEnvName": "esp32-c3-devkitm-1", + "toolchainBinDir": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin", + "internalConsoleOptions": "openOnSessionStart", + "loadMode": "manual" + } + ] +} diff --git a/README.md b/README.md index 37b4245..6baecf8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,28 @@ -# robotic_hand +# Robotyczna dłoń + +Ręka robotyczna - oprogramowanie mikrokontrolera + +## Podłączenie sterownika PCA9685 do ESP32-S3 + + +| ![Opis](docs/PCA9685.jpg) | +|:--:| +| **Rysunek 1.** Moduł sterowania serwomechanizmami | + + +* PCA9685 Supermini Uwagi +* VCC 3.3V Zasilanie logiki układu PCA +* GND, GND, Wspólna masa +* SDA, GPIO 8, Linia danych I2C +* SCL, GPIO 9, Linia zegarowa I2C +* V+, Zewnętrzne 5V-6V, Zasilanie serwomechanizmów z zewnętrznej przetwornicy 5V + + +## Podłączenie kolejności palców +* Kanał (PCA9685),Palec +* 0, Kciuk +* 1, Wskazujący +* 2, Środkowy +* 3, Serdeczny +* 4, Mały -Ręka robotyczna - oprogramowanie mikrokontrolera \ No newline at end of file diff --git a/docs/PCA9685.jpg b/docs/PCA9685.jpg new file mode 100644 index 0000000..f04b353 Binary files /dev/null and b/docs/PCA9685.jpg differ diff --git a/docs/test.md b/docs/test.md new file mode 100644 index 0000000..afbff85 --- /dev/null +++ b/docs/test.md @@ -0,0 +1,46 @@ +``` +#include +#include +#include +#include +#include +#include + +Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); + +uint licznik=1; + +void setup() { + Serial.begin(115200); + delay(2000); + Serial.println("--- TEST KANAŁÓW PCA9685 ---"); + + Wire.begin(PIN_SDA, PIN_SCL); + pwm.begin(); + pwm.setPWMFreq(50); + + Serial.println("Rozpoczynam sekwencję testową..."); +} + +void loop() { + // Sprawdzamy pierwsze 8 kanałów (większość rąk ma 5 lub 6) + for (int channel = 0; channel < 5; channel++) { + Serial.print("Testuję kanał nr: "); + Serial.println(channel); + + // Ruch w jedną stronę + pwm.setPWM(channel, 0, 150); + delay(800); + + // Ruch w drugą stronę + pwm.setPWM(channel, 0, 500); + delay(800); + + // Krótka pauza przed następnym palcem + delay(500); + } + + Serial.println("Koniec cyklu. Powtarzam..."); + delay(2000); +} +``` diff --git a/include/Logger.h b/include/Logger.h new file mode 100644 index 0000000..3b57368 --- /dev/null +++ b/include/Logger.h @@ -0,0 +1,15 @@ +#ifndef LOGGER_H +#define LOGGER_H + +#include "esp_log.h" + +// Wszystkie tagi logowania w jednym miejscu +extern const char *TAG_MAIN; +extern const char *TAG_DISP; +extern const char *TAG_ADXL; +extern const char *TAG_CONF; + +// Funkcja inicjalizacji poziomów logowania +void init_log_levels(); + +#endif diff --git a/include/Pinout.h b/include/Pinout.h new file mode 100644 index 0000000..cf61899 --- /dev/null +++ b/include/Pinout.h @@ -0,0 +1,31 @@ +#pragma once + +#if defined(ESP32) +// SPI3 (HSPI) - SD Card nie kolidują z PSRAM +// #define SD_SCK 16 // 36 //18 +// #define SD_MOSI 17 // 35 //17 +// #define SD_MISO 18 // 37 //16 +// #define SD_CS 15 // 34 //15 ?? 34 + +// SPI2 (VSPI) - ADXL345 +// #define MOSI_ADSX 11 // SDA +// #define CLK_ADSX 12 // SCL +// #define MISO_ADSX 13 // SDO + +//I2C C3 +#define PIN_SDA 8 +#define PIN_SCL 9 + + +// Przycisk +// #define BTN_UP 5 +// #define BTN_OK 6 +// #define BTN_DOWN 7 + +// Przekaźnik +// #define RELAY_OUT 4 + + +#endif + + diff --git a/include/Tool.h b/include/Tool.h new file mode 100644 index 0000000..97d39ee --- /dev/null +++ b/include/Tool.h @@ -0,0 +1,14 @@ +#ifndef TOOL_H +#define TOOL_H + +#include +#include +#include "esp_log.h" +#include "Watchdog.h" + +void scanI2C(); + +/* Funkcja przyjmuje adres jako argument i zwraca true gdy urządzenie odpowiada, w przeciwnym wypadku false */ +bool isI2CDevPresent(uint8_t address); + +#endif diff --git a/include/Version.h b/include/Version.h new file mode 100644 index 0000000..6b5da75 --- /dev/null +++ b/include/Version.h @@ -0,0 +1,7 @@ +#ifndef VERSION_H +#define VERSION_H + +#define VERSION "0.1" + + +#endif \ No newline at end of file diff --git a/include/Watchdog.h b/include/Watchdog.h new file mode 100644 index 0000000..992bdb4 --- /dev/null +++ b/include/Watchdog.h @@ -0,0 +1,38 @@ +#pragma once +/** + * Watchdog — prosty interfejs do inicjalizacji i karmienia WDT z dowolnego modułu. + * + * Obsługiwane środowiska: + * - ESP32 Arduino Core / ESP-IDF (esp_task_wdt) + * - Fallback: no-op na innych platformach + * + * Użycie: + * Watchdog::init(5, true); + * Watchdog::addThisTask(); + * ... + * Watchdog::feed(); + */ + +#include + +namespace Watchdog { + +/** Inicjalizacja Task Watchdog (idempotentna). */ +bool init(int timeout_seconds = 5, bool panic_on_trigger = true); + +/** Dodaje bieżący task (wątki FreeRTOS: wołaj w ciele tego taska). */ +bool addThisTask(); + +/** Usuwa bieżący task z nadzoru WDT. */ +bool removeThisTask(); + +/** Karmi watchdog (reset licznika). */ +void feed(); + +/** Zmienia timeout (wykonuje re-init wewnętrznie, jeśli trzeba). */ +bool setTimeout(int timeout_seconds); + +/** Czy watchdog jest aktywny (zainicjalizowany)? */ +bool isActive(); + +} // namespace Watchdog diff --git a/lib/ArduinoThread/.gitignore b/lib/ArduinoThread/.gitignore new file mode 100644 index 0000000..620d3dc --- /dev/null +++ b/lib/ArduinoThread/.gitignore @@ -0,0 +1,13 @@ +# Compiled Object files +*.slo +*.lo +*.o + +# Compiled Dynamic libraries +*.so +*.dylib + +# Compiled Static libraries +*.lai +*.la +*.a diff --git a/lib/ArduinoThread/.piopm b/lib/ArduinoThread/.piopm new file mode 100644 index 0000000..31954f3 --- /dev/null +++ b/lib/ArduinoThread/.piopm @@ -0,0 +1 @@ +{"type": "library", "name": "ArduinoThread", "version": "2.1.1", "spec": {"owner": "ivanseidel", "id": 7097, "name": "ArduinoThread", "requirements": null, "uri": null}} \ No newline at end of file diff --git a/lib/ArduinoThread/LICENSE.txt b/lib/ArduinoThread/LICENSE.txt new file mode 100644 index 0000000..5c02604 --- /dev/null +++ b/lib/ArduinoThread/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Ivan Seidel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/ArduinoThread/README.md b/lib/ArduinoThread/README.md new file mode 100644 index 0000000..bca7ee5 --- /dev/null +++ b/lib/ArduinoThread/README.md @@ -0,0 +1,205 @@ +![ArduinoThread Logo](https://raw.githubusercontent.com/ivanseidel/ArduinoThread/master/extras/ArduinoThread.png) + +Arduino does not support "REAL" parallel tasks (aka Threads), but we can make use of this Library to +improve our code, and easily schedule tasks with fixed (or variable) time between runs. + +This Library helps to maintain organized and to facilitate the use of multiple tasks. We can +use Timers Interrupts, and make it really powerfull, running "pseudo-background" tasks under the rug. + +For example, I personaly use it for all my projects, and put all sensor aquisition and +filtering inside it, leaving the main loop, just for logic and "cool" part. + +#### ArduinoThreads is a library for managing the periodic execution of multiple tasks. + +Blinking an LED is often the very first thing an Arduino user learns. And this demonstrates that periodically performing one single task, like toggling the LED state, is really easy. However, one may quickly discover that managing multiple periodic tasks is not so simple if the tasks have different execution periods. + +ArduinoThreads is designed to simplify programs that need to perform multiple periodic tasks. The user defines a Thread object for each of those tasks, then lets the library manage their scheduled execution. + +It should be noted that these are not “threads” in the real computer-science meaning of the term: tasks are implemented as functions that are periodically run to completion. On the one hand, this means that the only way a task can “yield” the CPU is by returning to the caller, and it is thus inadvisable to delay() or do long waits inside a task. On the other hand, this makes ArduinoThreads memory friendly, as no stack needs to be allocated per task. + +## Installation + +1. "Download":https://github.com/ivanseidel/ArduinoThread/archive/master.zip the Master branch from gitHub. +2. Unzip and modify the Folder name to "ArduinoThread" (Remove the '-master') +3. Paste the modified folder on your Library folder (On your `Libraries` folder inside Sketchbooks or Arduino software). +4. Restart Arduino IDE + +**If you are here, because another Library requires this class, just don't waste time reading bellow. Install and ready.** + + +## Getting Started + +There are many examples showing many ways to use it. Here, we will explain Class itself, +what it does and "how" it does. + +There are basicaly, three Classes included in this Library: +`Thread`, `ThreadController` and `StaticThreadController` (both controllers inherit from Thread). + +- `Thread class`: This is the basic class, witch contains methods to set and run callbacks, + check if the Thread should be runned, and also creates a unique ThreadID on the instantiation. + +- `ThreadController class`: Responsable for "holding" multiple Threads. Can also be called + as "a group of Threads", and is used to perform run in every Thread ONLY when needed. + +- `StaticThreadController class`: Slighly faster and smaller version of `ThreadController`. + It works similar to `ThreadController`, but once constructed it can't add or remove threads to run. + +* The instantiation of a Thread class is very simple: + +```c++ +Thread myThread = Thread(); +// or, if initializing a pointer +Thread* myThread = new Thread(); +``` + + +* Setting up a thread is essential. You can configure many things: + +```c++ +myThread.enabled = true; // Default enabled value is true +myThread.setInterval(10); // Setts the wanted interval to be 10ms +/* + This is useful for debugging + (Thread Name is disabled by default, to use less memory) + (Enable it by definint USE_THREAD_NAMES on 'Thread.h') +*/ +myThread.ThreadName = "myThread tag"; +// This will set the callback of the Thread: "What should I run"? +myThread.onRun(callback_function); // callback_function is the name of the function +``` + +Ok, creating Threads are not so hard. But what do we do with them now? + +* First, let's see how Threads should work, to understand what a `ThreadController` is and does + +```c++ +// First check if our Thread "should" be runned +if(myThread.shouldRun()){ + // Yes, the Thread should be runned, let's run it + myThread.run(); +} +``` + +Now that you got the idea, let's think a little bit: What if i have 3, 5, 100 Threads. Do I need to check EACH one?!? + +* The answer is: NO. Create a `ThreadController` or `StaticThreadController`, +and put all your boring-complex Threads inside it! + +```c++ +// Instantiate a new ThreadController +ThreadController controller = ThreadController(); +// Now, put a bunch of Threads inside it, FEED it! +controller.add(&myThread); // Notice the & before the thread, IF it's not instantied as a pointer. +controller.add(&hisThread); +controller.add(&sensorReadings); +... +``` +or +```c++ +// Instantiate a new StaticThreadController with the number of threads to be supplied as template parameter +StaticThreadController<3> controller (&myThread, &hisThread, &sensorReadings); +// You don't need to do anything else, controller now contains all the threads. +... +``` + +* You have created, configured, grouped it. What is missing? Yes, whe should RUN it! + +```c++ +// call run on a Thread, a ThreadController or a StaticThreadController to run it +controller.run(); +``` + +This will run all the Threads that NEED to be runned. + +Congratulations, you have learned the basics of `ArduinoThread`. If you want some TIPS, see bellow. + + +### TIPs and Warnings + +* ThreadController is not a `LinkedList`. It's "MAXIMUM" size (the maximum Threads that it can + store) is defined on ThreadController.h (default is 15) + +* !!!! VERY IMPORTANT !!!! When extending `Thread` class and implementing the function + `run()`, always remember to put `runned();` after all, otherwhise the `Thread` will ALWAYS run. + +* It's a good idea, to create a Timer interrupt and call a ThreadController.run() there. +That way, you don't need to worry about reading sensors and doing time-sensitive stuff +on your main code (loop). Check `ControllerWithTimer` example. + +* Inheriting from `Thread` or even `ThreadController` is always a good idea. +For example, I always create base classes of sensors that extends `Thread`, +so that I can "register" the sensors inside a ThreadController, and forget +about really reading sensors, just getting theirs values within my main code. +Checkout `SensorThread` example. + +* Remember that `ThreadController` is in fact, a Thread. If you want to enable +or disable a GROUP of Threads, think about putting all of them inside a ThreadController, +and adding this ThreadController to another ThreadController (YES! One ThreadController +inside another). Check `ControllerInController` example. + +* There is a `StaticThreadController` which is better to use when you know exact number of +threads to run. You cannot add or remove threads in runtime, but `StaticThreadController` +doesn't have additional memory overhead to keep all the treads together, doesn't have any +limitations how many threads to store (except of available memory) and also the code may be slighly +more optimized because all the threads always exist and no need to do any runtime checks. + +* Check the full example `CustomTimedThread` for a cool application of Threads that runs +for a period, after a button is pressed. + +* Running tasks on the Timer interrupts must be tought REALLY carefully + + You cannot use "sleep()" inside a interrupt, because it will get into a infinite loop. + + Things must do stuff quickly. Waiting too loooong on a interrupt, means waiting too + loooong on the main code (loop) + + Things might get "scrambled". Since Timers interrupts actualy "BREAK" your code in half + and start running the interrupt, you might want to call `noInterrupts` and `interrupts` + on places where cannot be interrupted: + +```c++ +noInterrupts(); +// Put the code that CANNOT be interrupted... +interrupts(); // This will enable the interrupts egain. DO NOT FORGET! +``` + + +## Library Reference + +### You should know: + +- `bool Thread::enabled` - Enables or disables the Thread. (do not stop it from running, but will + return false when shouldRun() is called) +- `void Thread::setInterval()` - Setts the desired interval for the Thread (in Ms). +- `bool Thread::shouldRun()` - Returns true, if the Thread should be runned. + (Basicaly,the logic is: (reached time AND is enabled?). +- `void Thread::onRun()` - The target callback function to be called. +- `void Thread::run()` - This will run the Thread (call the callback function). +- `int Thread::ThreadID` - Theoretically, it's the address of memory. It's unique, and can + be used to compare if two threads are identical. +- `int Thread::ThreadName` - A human-redable thread name. Default is "Thread ThreadID" + eg.: "Thread 141515"; Note that to enable this attribute, you must uncomment the line that disables it on 'Thread.h'; +- protected: `void Thread::runned()` - Used to reset internal timer of the Thread. + This is automaticaly called AFTER a call to `run()`. + + +- `void ThreadController::run()` - This will run the all `Threads` within the `ThreadController`, + only if needed (if shouldRun returns true); +- `bool ThreadController::add(Thread* _thread)` - This will add a the thread to the ThreadController, + and return `true` if suceeded (it the array is full, returns false). +- `void ThreadController::remove(Thread* _thread)` - This will remove the Thread from the ThreadController. +- `void ThreadController::remove(int index)` - This will remove the thread on the position `index`. +- `void ThreadController::clear()` - This will remove ALL threads from the ThreadController array. +- `int ThreadController::size(bool cached = true)` - Returns how many Threads are allocated + inside the ThreadController. If cached is `false`, will force the calculation of threads. +- `Thread* ThreadController::get(int index)` - Returns the Thread on the position `index`. + + +- `void StaticThreadController::run()` - This will run the all `Threads` within the `StaicThreadController`, + only if needed (if shouldRun returns true); +- `int StaticThreadController::size()` - Returns how many Threads are allocated inside the StaticThreadController. +- `Thread* ThreadController::get(int index)` - Returns the Thread on the position `index` and `nullptr` if `index` + is out of bounds. + +### You don't need to know: +- Nothing, yet ;) diff --git a/lib/ArduinoThread/StaticThreadController.h b/lib/ArduinoThread/StaticThreadController.h new file mode 100644 index 0000000..6e316ea --- /dev/null +++ b/lib/ArduinoThread/StaticThreadController.h @@ -0,0 +1,75 @@ +/* + StaticThreadController.h - Controlls a list of Threads with different timings + + Basicaly, what it does is to keep track of current Threads and run when + necessary. + + StaticThreadController is an extended class of Thread, because of that, + it allows you to add a StaticThreadController inside another kind of ThreadController... + + It works exact as ThreadController except you can't add or remove treads dynamically. + + Created by Alex Eremin, September, 2016. + Released into the public domain. +*/ + +#ifndef StaticThreadController_h +#define StaticThreadController_h + +#include "Thread.h" + +template +class StaticThreadController: public Thread{ +protected: + //since this is a static controller, the pointers themselves can be const + //it should be distinguished from 'const Thread* thread[N]' + Thread * const thread[N]; +public: + template + StaticThreadController(T... params) : + Thread(), + thread{params...} + { + #ifdef USE_THREAD_NAMES + // Overrides name + ThreadName = "StaticThreadController "; + ThreadName = ThreadName + ThreadID; + #endif + }; + + // run() Method is overrided + void run() override + { + // Run this thread before + if(_onRun != nullptr && shouldRun()) + _onRun(); + + for(int i = 0; i < N; i++){ + // Is enabled? Timeout exceeded? + if(thread[i]->shouldRun()){ + thread[i]->run(); + } + } + + // StaticThreadController extends Thread, so we should flag as runned thread + runned(); + } + + // Return the quantity of Threads + static constexpr int size() { return N; }; + + // Return the I Thread on the array + // Returns nullptr if index is out of bounds + Thread* get(int index) { + return (index >= 0 && index < N) ? thread[index] : nullptr; + }; + + // Return the I Thread on the array + // Doesn't perform any bounds checks and behaviour is + // unpredictable in case of index > N + Thread& operator[](int index) { + return *thread[index]; + }; +}; + +#endif diff --git a/lib/ArduinoThread/Thread.cpp b/lib/ArduinoThread/Thread.cpp new file mode 100644 index 0000000..cd29d98 --- /dev/null +++ b/lib/ArduinoThread/Thread.cpp @@ -0,0 +1,52 @@ +#include "Thread.h" + +Thread::Thread(void (*callback)(void), unsigned long _interval){ + enabled = true; + onRun(callback); + _cached_next_run = 0; + last_run = millis(); + + ThreadID = (int)this; + #ifdef USE_THREAD_NAMES + ThreadName = "Thread "; + ThreadName = ThreadName + ThreadID; + #endif + + setInterval(_interval); +}; + +void Thread::runned(unsigned long time){ + // Saves last_run + last_run = time; + + // Cache next run + _cached_next_run = last_run + interval; +} + +void Thread::setInterval(unsigned long _interval){ + // Save interval + interval = _interval; + + // Cache the next run based on the last_run + _cached_next_run = last_run + interval; +} + +bool Thread::shouldRun(unsigned long time){ + // If the "sign" bit is set the signed difference would be negative + bool time_remaining = (time - _cached_next_run) & 0x80000000; + + // Exceeded the time limit, AND is enabled? Then should run... + return !time_remaining && enabled; +} + +void Thread::onRun(void (*callback)(void)){ + _onRun = callback; +} + +void Thread::run(){ + if(_onRun != NULL) + _onRun(); + + // Update last_run and _cached_next_run + runned(); +} diff --git a/lib/ArduinoThread/Thread.h b/lib/ArduinoThread/Thread.h new file mode 100644 index 0000000..0e580a9 --- /dev/null +++ b/lib/ArduinoThread/Thread.h @@ -0,0 +1,89 @@ +/* + Thread.h - An runnable object + + Thread is responsable for holding the "action" for something, + also, it responds if it "should" or "should not" run, based on + the current time; + + For instructions, go to https://github.com/ivanseidel/ArduinoThread + + Created by Ivan Seidel Gomes, March, 2013. + Released into the public domain. +*/ + +#ifndef Thread_h +#define Thread_h + +#if defined(ARDUINO) && ARDUINO >= 100 + #include +#else + #include +#endif + +#include + +/* + Uncomment this line to enable ThreadName Strings. + + It might be usefull if you are loging thread with Serial, + or displaying a list of threads... +*/ +// #define USE_THREAD_NAMES 1 + +class Thread{ +protected: + // Desired interval between runs + unsigned long interval; + + // Last runned time in Ms + unsigned long last_run; + + // Scheduled run in Ms (MUST BE CACHED) + unsigned long _cached_next_run; + + /* + IMPORTANT! Run after all calls to run() + Updates last_run and cache next run. + NOTE: This MUST be called if extending + this class and implementing run() method + */ + void runned(unsigned long time); + + // Default is to mark it runned "now" + void runned() { runned(millis()); } + + // Callback for run() if not implemented + void (*_onRun)(void); + +public: + + // If the current Thread is enabled or not + bool enabled; + + // ID of the Thread (initialized from memory adr.) + int ThreadID; + + #ifdef USE_THREAD_NAMES + // Thread Name (used for better UI). + String ThreadName; + #endif + + Thread(void (*callback)(void) = NULL, unsigned long _interval = 0); + + // Set the desired interval for calls, and update _cached_next_run + virtual void setInterval(unsigned long _interval); + + // Return if the Thread should be runned or not + virtual bool shouldRun(unsigned long time); + + // Default is to check whether it should run "now" + bool shouldRun() { return shouldRun(millis()); } + + // Callback set + void onRun(void (*callback)(void)); + + // Runs Thread + virtual void run(); +}; + +#endif diff --git a/lib/ArduinoThread/ThreadController.cpp b/lib/ArduinoThread/ThreadController.cpp new file mode 100644 index 0000000..af5f1d9 --- /dev/null +++ b/lib/ArduinoThread/ThreadController.cpp @@ -0,0 +1,115 @@ +#include "Thread.h" +#include "ThreadController.h" + +ThreadController::ThreadController(unsigned long _interval): Thread(){ + cached_size = 0; + + clear(); + setInterval(_interval); + + #ifdef USE_THREAD_NAMES + // Overrides name + ThreadName = "ThreadController "; + ThreadName = ThreadName + ThreadID; + #endif +} + +/* + ThreadController run() (cool stuf) +*/ +void ThreadController::run(){ + // Run this thread before + if(_onRun != NULL) + _onRun(); + + unsigned long time = millis(); + int checks = 0; + for(int i = 0; i < MAX_THREADS && checks <= cached_size; i++){ + // Object exists? Is enabled? Timeout exceeded? + if(thread[i]){ + checks++; + if(thread[i]->shouldRun(time)){ + thread[i]->run(); + } + } + } + + // ThreadController extends Thread, so we should flag as runned thread + runned(); +} + + +/* + List controller (boring part) +*/ +bool ThreadController::add(Thread* _thread){ + // Check if the Thread already exists on the array + for(int i = 0; i < MAX_THREADS; i++){ + if(thread[i] != NULL && thread[i]->ThreadID == _thread->ThreadID) + return true; + } + + // Find an empty slot + for(int i = 0; i < MAX_THREADS; i++){ + if(!thread[i]){ + // Found a empty slot, now add Thread + thread[i] = _thread; + cached_size++; + return true; + } + } + + // Array is full + return false; +} + +void ThreadController::remove(int id){ + // Find Threads with the id, and removes + bool found = false; + for(int i = 0; i < MAX_THREADS; i++){ + if(thread[i]->ThreadID == id){ + thread[i] = NULL; + cached_size--; + return; + } + } +} + +void ThreadController::remove(Thread* _thread){ + remove(_thread->ThreadID); +} + +void ThreadController::clear(){ + for(int i = 0; i < MAX_THREADS; i++){ + thread[i] = NULL; + } + cached_size = 0; +} + +int ThreadController::size(bool cached){ + if(cached) + return cached_size; + + int size = 0; + for(int i = 0; i < MAX_THREADS; i++){ + if(thread[i]) + size++; + } + cached_size = size; + + return cached_size; +} + +Thread* ThreadController::get(int index){ + int pos = -1; + for(int i = 0; i < MAX_THREADS; i++){ + if(thread[i] != NULL){ + pos++; + + if(pos == index) + return thread[i]; + } + } + + return NULL; +} diff --git a/lib/ArduinoThread/ThreadController.h b/lib/ArduinoThread/ThreadController.h new file mode 100644 index 0000000..8e2888c --- /dev/null +++ b/lib/ArduinoThread/ThreadController.h @@ -0,0 +1,53 @@ +/* + ThreadController.h - Controlls a list of Threads with different timings + + Basicaly, what it does is to keep track of current Threads and run when + necessary. + + ThreadController is an extended class of Thread, because of that, + it allows you to add a ThreadController inside another ThreadController... + + For instructions, go to https://github.com/ivanseidel/ArduinoThread + + Created by Ivan Seidel Gomes, March, 2013. + Released into the public domain. +*/ + +#ifndef ThreadController_h +#define ThreadController_h + +#include "Thread.h" +#include "inttypes.h" + +#define MAX_THREADS 15 + +class ThreadController: public Thread{ +protected: + Thread* thread[MAX_THREADS]; + int cached_size; +public: + ThreadController(unsigned long _interval = 0); + + // run() Method is overrided + void run(); + + // Adds a thread in the first available slot (remove first) + // Returns if the Thread could be added or not + bool add(Thread* _thread); + + // remove the thread (given the Thread* or ThreadID) + void remove(int _id); + void remove(Thread* _thread); + + // Removes all threads + void clear(); + + // Return the quantity of Threads + int size(bool cached = true); + + // Return the I Thread on the array + // Returns NULL if none found + Thread* get(int index); +}; + +#endif diff --git a/lib/ArduinoThread/examples/ControllerInController/ControllerInController.ino b/lib/ArduinoThread/examples/ControllerInController/ControllerInController.ino new file mode 100644 index 0000000..feb8a0a --- /dev/null +++ b/lib/ArduinoThread/examples/ControllerInController/ControllerInController.ino @@ -0,0 +1,78 @@ +#include +#include + +int ledPin = 13; + +// ThreadController that will controll all threads +ThreadController controll = ThreadController(); + +//My Thread +Thread myThread = Thread(); +//His Thread +Thread hisThread = Thread(); +//Blink Led Thread +Thread blinkLedThread = Thread(); +//ThreadController, that will be added to controll +ThreadController groupOfThreads = ThreadController(); + +// callback for myThread +void niceCallback(){ + Serial.print("COOL! I'm running on: "); + Serial.println(millis()); +} + +// callback for hisThread +void boringCallback(){ + Serial.println("BORING..."); +} + +// callback for blinkLedThread +void blinkLed(){ + static bool ledStatus = false; + ledStatus = !ledStatus; + + digitalWrite(ledPin, ledStatus); + + Serial.print("blinking: "); + Serial.println(ledStatus); +} + +void setup(){ + Serial.begin(9600); + + pinMode(ledPin, OUTPUT); + + // Configure myThread + myThread.onRun(niceCallback); + myThread.setInterval(500); + + // Configure hisThread + hisThread.onRun(boringCallback); + hisThread.setInterval(250); + + // Configure blinkLedThread + blinkLedThread.onRun(blinkLed); + blinkLedThread.setInterval(100); + + // Adds myThread to the controll + controll.add(&myThread); + + // Adds hisThread and blinkLedThread to groupOfThreads + groupOfThreads.add(&hisThread); + groupOfThreads.add(&blinkLedThread); + + // Add groupOfThreads to controll + controll.add(&groupOfThreads); + +} + +void loop(){ + // run ThreadController + // this will check every thread inside ThreadController, + // if it should run. If yes, he will run it; + controll.run(); + + // Rest of code + float h = 3.1415; + h/=2; +} \ No newline at end of file diff --git a/lib/ArduinoThread/examples/ControllerWithTimer/ControllerWithTimer.ino b/lib/ArduinoThread/examples/ControllerWithTimer/ControllerWithTimer.ino new file mode 100644 index 0000000..029507f --- /dev/null +++ b/lib/ArduinoThread/examples/ControllerWithTimer/ControllerWithTimer.ino @@ -0,0 +1,100 @@ +#include +#include + +/* + This example, requires a Timer Interrupt Library. + If you are using Arduino NANO, UNO... (with ATmega168/328) + Please go to: http://playground.arduino.cc/code/timer1 + If you are using Arduino DUE, + Please go to: https://github.com/ivanseidel/DueTimer + + Include the library corresponding to your Arduino. +*/ +// #include +// #include + +// ThreadController that will controll all threads +ThreadController controll = ThreadController(); + +//My Thread +Thread myThread = Thread(); +//His Thread +Thread hisThread = Thread(); + +// callback for myThread +void myThreadCallback(){ + Serial.println("myThread\t\tcallback"); +} + +// callback for hisThread +void hisThreadCallback(){ + Serial.println("\thisThread\tcallback"); +} + +// This is the callback for the Timer +void timerCallback(){ + controll.run(); +} + +void setup(){ + Serial.begin(9600); + + // Configure myThread + myThread.onRun(myThreadCallback); + myThread.setInterval(500); + + // Configure myThread + hisThread.onRun(hisThreadCallback); + hisThread.setInterval(200); + + // Adds both threads to the controller + controll.add(&myThread); // & to pass the pointer to it + controll.add(&hisThread); + + /* + If using DueTimer... + */ + // Timer1.attachInterrupt(timerCallback).start(20000); + + /* + If using TimerOne... + */ + // Timer1.initialize(20000); + // Timer1.attachInterrupt(timerCallback); + // Timer1.start(); +} + +void waitSerial(){ + while (!Serial.available()); + delay(10); + while (Serial.available() && Serial.read()); +} + +void loop(){ + while(1){ + noInterrupts(); // Call to disable interrupts + Serial.println("Type anyting to stop myThread!"); + interrupts(); // Call to enable interrupts + waitSerial(); + myThread.enabled = false; + + noInterrupts(); + Serial.println("Type anyting to stop hisThread!"); + interrupts(); + waitSerial(); + hisThread.enabled = false; + + noInterrupts(); + Serial.println("Type anyting to enable myThread!"); + interrupts(); + waitSerial(); + myThread.enabled = true; + + noInterrupts(); + Serial.println("Type anyting to enable hisThread!"); + interrupts(); + waitSerial(); + hisThread.enabled = true; + + } +} \ No newline at end of file diff --git a/lib/ArduinoThread/examples/CustomTimedThread/CustomTimedThread.ino b/lib/ArduinoThread/examples/CustomTimedThread/CustomTimedThread.ino new file mode 100644 index 0000000..9d2d7d8 --- /dev/null +++ b/lib/ArduinoThread/examples/CustomTimedThread/CustomTimedThread.ino @@ -0,0 +1,257 @@ +/* + This is an example from ArduinoThread. You can find more information + in https://github.com/ivanseidel/ArduinoThread. + + Coded by Ivan Seidel, Jun/2014 - ivanseidel@gmail.com + + Dont be afraid. 90% is commented lines. READ them, they will teach you. +*/ + +#include +#include + +/* + This example provides an object-oriented approach to + develop a custom Thread that overrides the 'shouldRun' + method, to only run the thread after a button was pushed. + + After the push, it should 'keep' running for a desired time. + + It should also provide us, a way to easily implement this + controll multiple times, without trouble. + + We are giving this Custom Thread the name 'ButtonThread'. + + Exemplifying what it does: + + ButtonThread added to our mainController ThreadList + => Instantiated with a custom Pin #, + => and a time duration (in miliseconds) + + + ButtonThread is not running. + + + When the button is pressed: + + Thread will start and keep running. + + If the thread runned for our defined period, + we stop it. + + ================ HOW TO SETUP HARDWARE ================== + In order to make this example work with any arduino, hook up + the pins on the board to 3 buttons. You can change the inputs + if you need below here. + + The Buttons are being SOFTWARE pulled UP (to VCC), and when + pushed, should go LOW. Connect like this: + (Arduino Input) <----> (Btn) <----> GND (-) + + We are using digital pins 9, 10 and 11 as input. + It also uses a LED, but we are using the default one in the board. + + =============== WHAT YO LEARN WITH THIS ================= + 1) Threads are actually running in 'parallel'. + + Synce each thread process time is very tiny, they appear + as being runned in parallel. + + Because of that, clicking multiple buttons at any time, + will looks like there is a program for each one of them. + + 2) If you keep the button 'pressed', it will continue to run. + + Since we are 'enabling' the thread, and reseting the timer + flag (_lastButtonPushed) every time the button is pressed, + we should notice that in btn1Callback, where we print this + flag, it will never go beyond 0 if we keep pressing it. + + 3) The LED turns off, only because the Thread runs a last time + with the flag 'enabled' as false. This way, we can turn the + LED off and remain OFF until we press it egain. + + I hope you enjoy, and learn some advanced-cool stuf with this tutorial. + Any feedback is apreciated! +*/ +#define BTN1 9 +#define BTN2 10 +#define BTN3 11 + +#define LED 13 + +// ThreadController that will controll all button threads +ThreadController controll = ThreadController(); + +// Here we implement our custom ButtonThread, that Inherits from Thread +class ButtonThread: public Thread{ +public: + // Our custom thread attributes + int pin; + long duration; + long _lastButtonPushed; + + /* + Our Constructor. This will initialize the thread + with it's corresponding pin and duration after clicked. + */ + ButtonThread(int _pin, long _duration): Thread(){ + // Set our attributes on construct + pin = _pin; + duration = _duration; + _lastButtonPushed = 0; + + // Thread will start disabled + enabled = false; + + // Configure the pin as INPUT and enable pull-up + pinMode(pin, INPUT); + digitalWrite(pin, HIGH); + } + + /* + Override the method responsible for + checking if the thread should run. + + It will first check if the button is pressed. + If so, we enable the thread, and then let the + "Old" default Thread method 'shouldRun' return if + it should run. + */ + bool shouldRun(long time){ + // Override enabled on thread when pin goes LOW. + if(digitalRead(pin) == LOW){ + enabled = true; + /* + Here, we save the current time in this object, + to compare it later. + + the 'time' parameter in this method, is an override for the + 'millis()' method. It allows who is checking the thread, to + pass a custom time. + + This is sintax for writing an 'inline' if is very usefull, + it's the same as: + if(time > 0){ + _lastButtonPushed = time; + }else{ + _lastButtonPushed = millis(); + } + */ + _lastButtonPushed = (time ? time : millis()); + } + + // Let default method check for it. + return Thread::shouldRun(time); + } + + /* + We 'disable' the thread after the duration on the + 'run' method. + + What we should do here, is check if the time saved + in the _lastButtonPushed variable plus the duration, + is greater than our current time. If that's true, it + means we exceeded the thread time, and that we must + disable it and prevent from running. + */ + void run(){ + // Check if time elapsed since last button push + if(millis() > _lastButtonPushed + duration){ + // It exceeded time. We should disable it. + enabled = false; + } + + /* + Run the thread. + + Note that this method will only get called + from the ThreadList, IF the 'shouldRun' returns true. + + If the thread is not enabled anymore, it will run a 'last' + time with the flag 'enabled' as false, meaning it's the last + run in the period. You can use it for doing something only + before it stops running. + */ + Thread::run(); + } +}; + +/* + ButtonThreads objects instantiation + (we are instantiating 2 as a member, and one + as pointer in the setup, just to show you + different ways of doing it) +*/ + +// Thread 1 will be reading BTN1 pin, and will run for 3 secs +ButtonThread btn1Thread(BTN1, 3000); + +// Thread 2 will be reading BTN1 pin, and will run for 5 secs +ButtonThread btn2Thread = ButtonThread(BTN2, 5000); + +// Thread 3 will be instantiated in the setup() +ButtonThread *btn3Thread; + + +/* + Callback for ButtonThreads +*/ +void btn1Callback(){ + // When it's running, this thread will write to the serial. + /* + This math will print 'how long' the thread has been running, + since the button was/is pressed. + + After pressing it, it should print as 0, and goes up untill + the thread duration (in this case, +-5000ms). + */ + Serial.print("BTN 1 Thread: "); + Serial.println(millis() - btn1Thread._lastButtonPushed); +} + +void btn2Callback(){ + /* + This thread will remain with the LED on pin 13 turned on + while it is running. + + We detect that this method is called for the LAST time, if + the flag 'enabled' is FALSE on the btn2Thread object. + + So, basically: If it's TRUE, we should turn ON the led, if not + we should turn OFF. We can simplify that into one line. + (Same 'inline' sintax as above) + */ + digitalWrite(LED, btn2Thread.enabled ? HIGH : LOW); +} + +void btn3Callback(){ + // When it's running, this thread will also write to the serial + Serial.println("BTN 3 Thread"); +} + +void setup(){ + // Configure serial and output pins + Serial.begin(9600); + pinMode(LED, OUTPUT); + + // Configure btn1Thread callback + // (During the 'enabled' time, it will run every 100ms, aka Interval) + btn1Thread.onRun(btn1Callback); + btn1Thread.setInterval(100); + + // Configure btn2Thread callback and interval + btn2Thread.onRun(btn2Callback); + btn2Thread.setInterval(200); + + // Instantiate btn3Thread + btn3Thread = new ButtonThread(BTN3, 4000); + // Configure btn3Thread callback and interval + btn3Thread->onRun(btn3Callback); + btn3Thread->setInterval(100); + + // Adds all threads to the controller + controll.add(&btn1Thread); // & to pass the pointer to it + controll.add(&btn2Thread); + controll.add(btn3Thread); // Its already a pointer, no need for & +} + +void loop(){ + // Here we just run the main thread controller + controll.run(); +} \ No newline at end of file diff --git a/lib/ArduinoThread/examples/SensorThread/SensorThread.ino b/lib/ArduinoThread/examples/SensorThread/SensorThread.ino new file mode 100644 index 0000000..9c5c91f --- /dev/null +++ b/lib/ArduinoThread/examples/SensorThread/SensorThread.ino @@ -0,0 +1,105 @@ +#include "Thread.h" +#include "ThreadController.h" +/* + This is a more "complex" for of using Threads. + You can also inherit from Thread, and do your entire code on the class. + + This allows you, to create for example: + Sensor Readings (aquire, filter, and save localy values) + Custom Blinks, Beeps... + Anything you can imagine. + + Threads are more "usefull" when used within Timer interrupts + + This way of coding is more "reusable", and "correct" (Object Oriented) +*/ + + +/* + This example, requires a Timer Interrupt Library. + If you are using Arduino NANO, UNO... (with ATmega168/328) + Please go to: http://playground.arduino.cc/code/timer1 + If you are using Arduino DUE, + Please go to: https://github.com/ivanseidel/DueTimer + + Include the library corresponding to your Arduino. +*/ +#include +// #include + +// Create a new Class, called SensorThread, that inherits from Thread +class SensorThread: public Thread +{ +public: + int value; + int pin; + + // No, "run" cannot be anything... + // Because Thread uses the method "run" to run threads, + // we MUST overload this method here. using anything other + // than "run" will not work properly... + void run(){ + // Reads the analog pin, and saves it localy + value = map(analogRead(pin), 0,1023,0,255); + runned(); + } +}; + +// Now, let's use our new class of Thread +SensorThread analog1 = SensorThread(); +SensorThread analog2 = SensorThread(); + +// Instantiate a new ThreadController +ThreadController controller = ThreadController(); + +// This is the callback for the Timer +void timerCallback(){ + controller.run(); +} + +void setup(){ + + Serial.begin(9600); + + // Configures Thread analog1 + analog1.pin = A1; + analog1.setInterval(100); + + // Configures Thread analog2 + analog2.pin = A2; + analog2.setInterval(100); + + // Add the Threads to our ThreadController + controller.add(&analog1); + controller.add(&analog2); + + /* + If using DueTimer... + */ + Timer1.attachInterrupt(timerCallback).start(10000); + + /* + If using TimerOne... + */ + // Timer1.initialize(20000); + // Timer1.attachInterrupt(timerCallback); + // Timer1.start(); + +} + +void loop(){ + // Do complex-crazy-timeconsuming-tasks here + delay(1000); + + // Get the fresh readings + Serial.print("Analog1 Thread: "); + Serial.println(analog1.value); + + Serial.print("Analog2 Thread: "); + Serial.println(analog2.value); + + // Do more complex-crazy-timeconsuming-tasks here + delay(1000); + +} + diff --git a/lib/ArduinoThread/examples/SimpleThread/SimpleThread.ino b/lib/ArduinoThread/examples/SimpleThread/SimpleThread.ino new file mode 100644 index 0000000..e45362a --- /dev/null +++ b/lib/ArduinoThread/examples/SimpleThread/SimpleThread.ino @@ -0,0 +1,35 @@ +#include +int ledPin = 13; + +//My simple Thread +Thread myThread = Thread(); + +// callback for myThread +void niceCallback(){ + static bool ledStatus = false; + ledStatus = !ledStatus; + + digitalWrite(ledPin, ledStatus); + + Serial.print("COOL! I'm running on: "); + Serial.println(millis()); +} + +void setup(){ + Serial.begin(9600); + + pinMode(ledPin, OUTPUT); + + myThread.onRun(niceCallback); + myThread.setInterval(500); +} + +void loop(){ + // checks if thread should run + if(myThread.shouldRun()) + myThread.run(); + + // Other code... + int x = 0; + x = 1 + 2; +} \ No newline at end of file diff --git a/lib/ArduinoThread/examples/SimpleThreadController/SimpleThreadController.ino b/lib/ArduinoThread/examples/SimpleThreadController/SimpleThreadController.ino new file mode 100644 index 0000000..949290b --- /dev/null +++ b/lib/ArduinoThread/examples/SimpleThreadController/SimpleThreadController.ino @@ -0,0 +1,48 @@ +#include +#include + +// ThreadController that will controll all threads +ThreadController controll = ThreadController(); + +//My Thread (as a pointer) +Thread* myThread = new Thread(); +//His Thread (not pointer) +Thread hisThread = Thread(); + +// callback for myThread +void niceCallback(){ + Serial.print("COOL! I'm running on: "); + Serial.println(millis()); +} + +// callback for hisThread +void boringCallback(){ + Serial.println("BORING..."); +} + +void setup(){ + Serial.begin(9600); + + // Configure myThread + myThread->onRun(niceCallback); + myThread->setInterval(500); + + // Configure myThread + hisThread.onRun(boringCallback); + hisThread.setInterval(250); + + // Adds both threads to the controller + controll.add(myThread); + controll.add(&hisThread); // & to pass the pointer to it +} + +void loop(){ + // run ThreadController + // this will check every thread inside ThreadController, + // if it should run. If yes, he will run it; + controll.run(); + + // Rest of code + float h = 3.1415; + h/=2; +} \ No newline at end of file diff --git a/lib/ArduinoThread/examples/StaticThreadController/StaticThreadController.ino b/lib/ArduinoThread/examples/StaticThreadController/StaticThreadController.ino new file mode 100644 index 0000000..bb4155a --- /dev/null +++ b/lib/ArduinoThread/examples/StaticThreadController/StaticThreadController.ino @@ -0,0 +1,56 @@ +#include +#include + +//My Thread (as a pointer) +Thread* myThread = new Thread(); +//His Thread (not pointer) +Thread hisThread = Thread(); + +// callback for myThread +void niceCallback(){ + Serial.print("COOL! I'm running on: "); + Serial.println(millis()); +} + +// callback for hisThread +void boringCallback(){ + Serial.println("BORING..."); +} + +// callback for theThread +void justCallback(){ + Serial.println("executing..."); +} + +//The Thread (as a pointer) with justCallback initialized +Thread* theThread = new Thread(justCallback); + +// StaticThreadController that will controll all threads +// All non-pointers go with '&', but pointers go without '&', +StaticThreadController<3> controll (myThread, &hisThread, theThread); + +void setup(){ + Serial.begin(9600); + + // Configure myThread + myThread->onRun(niceCallback); + myThread->setInterval(500); + + // Configure hisThread + hisThread.onRun(boringCallback); + hisThread.setInterval(250); + + // Set interval for theThread using StaticThreadController interface + controll[3].setInterval(375); +} + +void loop(){ + // run StaticThreadController + // this will check every thread inside ThreadController, + // if it should run. If yes, he will run it; + controll.run(); + + // Rest of code + float h = 3.1415; + h/=2; +} diff --git a/lib/ArduinoThread/keywords.txt b/lib/ArduinoThread/keywords.txt new file mode 100644 index 0000000..09b104d --- /dev/null +++ b/lib/ArduinoThread/keywords.txt @@ -0,0 +1,32 @@ +####################################### +# Syntax Coloring +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Thread KEYWORD1 +ThreadController KEYWORD1 +StaticThreadController KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +runned KEYWORD2 +setInterval KEYWORD2 +shouldRun KEYWORD2 +onRun KEYWORD2 +run KEYWORD2 + +# Specific of ThreadController or StaticThreadController +add KEYWORD2 +remove KEYWORD2 +clear KEYWORD2 +size KEYWORD2 +get KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/lib/ArduinoThread/library.json b/lib/ArduinoThread/library.json new file mode 100644 index 0000000..5870787 --- /dev/null +++ b/lib/ArduinoThread/library.json @@ -0,0 +1,13 @@ +{ + "name": "ArduinoThread", + "keywords": "thread, task", + "description": "A library for managing the periodic execution of multiple tasks", + "repository": { + "type": "git", + "url": "https://github.com/ivanseidel/ArduinoThread.git" + }, + "frameworks": "arduino", + //"platforms": "atmelavr", LK 2025 + "platforms": "*" + "version": "2.1.1" +} \ No newline at end of file diff --git a/lib/ArduinoThread/library.properties b/lib/ArduinoThread/library.properties new file mode 100644 index 0000000..59eed7a --- /dev/null +++ b/lib/ArduinoThread/library.properties @@ -0,0 +1,9 @@ +name=ArduinoThread +version=2.1.1 +author=Ivan Seidel +maintainer=Ivan Seidel +sentence=A simple way to run Threads on Arduino +paragraph=This Library helps to maintain organized and to facilitate the use of multiple tasks. We can use Timers Interrupts, and make it really powerfull, running "pseudo-background" tasks on the rug. +category=Timing +url=https://github.com/ivanseidel/ArduinoThread +architectures=* diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..d7637ec --- /dev/null +++ b/lib/README @@ -0,0 +1,4 @@ + +# Biblioteki + +Ten folder zawiera biblioteki wykorzystane w projekcie. diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..e41fe43 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,30 @@ +; 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:esp32-c3-devkitm-1] +platform = espressif32 +board = esp32-c3-devkitm-1 +framework = arduino +monitor_speed = 115200 +build_flags = + -DARDUINO_USB_MODE=1 + -DARDUINO_USB_CDC_ON_BOOT=1 + -DCORE_DEBUG_LEVEL=3 + -DLOG_LOCAL_LEVEL=ESP_LOG_INFO + +; Wymuszenie poprawnego sprawdzania zależności +lib_ldf_mode = deep+ + +lib_deps = + SPI + Wire + arminjo/ServoEasing@^3.6.0 + adafruit/Adafruit PWM Servo Driver Library@^3.0.3 + madhephaestus/ESP32Servo@^3.2.0 diff --git a/src/Logger.cpp b/src/Logger.cpp new file mode 100644 index 0000000..07b994b --- /dev/null +++ b/src/Logger.cpp @@ -0,0 +1,16 @@ +#include + +const char *TAG_MAIN = "MAIN"; +const char *TAG_DISPLAY = "DISPLAY"; +const char *TAG_WIFI = "WiFi"; +const char *TAG_ADXL = "ADXL345"; +const char *TAG_CONF = "CONFIG"; + + +void init_log_levels() { + esp_log_level_set(TAG_MAIN, ESP_LOG_INFO); + esp_log_level_set(TAG_DISPLAY, ESP_LOG_INFO); + esp_log_level_set(TAG_WIFI, ESP_LOG_INFO); + esp_log_level_set(TAG_ADXL, ESP_LOG_INFO); + esp_log_level_set(TAG_CONF, ESP_LOG_INFO); +} diff --git a/src/Tool.cpp b/src/Tool.cpp new file mode 100644 index 0000000..54c90cc --- /dev/null +++ b/src/Tool.cpp @@ -0,0 +1,48 @@ +#include + +static const char *TOOL = "tool"; + +bool isI2CDevPresent(uint8_t address) { + Wire.beginTransmission(address); + uint8_t error = Wire.endTransmission(); + + if (error == 0) { + ESP_LOGI(TOOL, "I2C response from 0x%02X", address); + return true; + } else { + if (error == 4) { + //ESP_LOGW(TOOL, "I2C unknown error at 0x%02X", address); + } else { + ESP_LOGI(TOOL, "No I2C device at 0x%02X", address); + } + return false; + } +} + +void scanI2C() { + byte error, address; + int nDevices = 0; + ESP_LOGI(TOOL, "I2C start scan"); + for (address = 1; address < 127; address++) { + Wire.beginTransmission(address); + error = Wire.endTransmission(); + + if (error == 0) { + char buf[32]; + snprintf(buf, sizeof(buf), "I2C device: 0x%02X", address); + ESP_LOGI(TOOL, "%s", buf); + nDevices++; + Watchdog::feed(); + } + else if (error == 4) { + ESP_LOGW(TOOL, "I2C error at address: 0x%02X", address); + } + } + + if (nDevices == 0) { + ESP_LOGE(TOOL, "I2C no devices found"); + } else { + ESP_LOGI(TOOL, "I2C scan finished. Found %d device(s)", nDevices); + } + Watchdog::feed(); +} diff --git a/src/Watchdog.cpp b/src/Watchdog.cpp new file mode 100644 index 0000000..5b7c5c6 --- /dev/null +++ b/src/Watchdog.cpp @@ -0,0 +1,81 @@ +#include "Watchdog.h" + +// Wykrywanie środowiska +#if defined(ESP_PLATFORM) || defined(ESP32) + #include + #define WDOG_HAS_ESP 1 +#else + #define WDOG_HAS_ESP 0 +#endif + +namespace Watchdog { + +static bool s_initialized = false; + +bool init(int timeout_seconds, bool panic_on_trigger) { +#if WDOG_HAS_ESP + if (s_initialized) return true; + esp_err_t err = esp_task_wdt_init(timeout_seconds, panic_on_trigger); + if (err == ESP_OK || err == ESP_ERR_INVALID_STATE) { + // ESP_ERR_INVALID_STATE: już zainicjalizowany — traktujemy jako OK + s_initialized = true; + return true; + } + return false; +#else + (void)timeout_seconds; (void)panic_on_trigger; + s_initialized = true; // no-op, aby nie blokować wywołań w kodzie + return true; +#endif +} + +bool addThisTask() { +#if WDOG_HAS_ESP + if (!s_initialized) return false; + esp_err_t err = esp_task_wdt_add(nullptr); // nullptr = bieżący task + return (err == ESP_OK || err == ESP_ERR_INVALID_STATE); +#else + return true; // no-op +#endif +} + +bool removeThisTask() { +#if WDOG_HAS_ESP + if (!s_initialized) return false; + esp_err_t err = esp_task_wdt_delete(nullptr); // bieżący task + return (err == ESP_OK || err == ESP_ERR_INVALID_STATE); +#else + return true; // no-op +#endif +} + +void feed() { +#if WDOG_HAS_ESP + esp_task_wdt_reset(); +#else + // no-op +#endif +} + +bool setTimeout(int timeout_seconds) { +#if WDOG_HAS_ESP + if (!s_initialized) { + // jeśli ktoś nie zainicjalizował — zrób to teraz + return init(timeout_seconds, true); + } + // W ESP-IDF/Arduino brak prostego API na „live update” — re-init: + esp_err_t err = esp_task_wdt_deinit(); + (void)err; // nie każdy port raportuje OK/INVALID_STATE spójnie + s_initialized = false; + return init(timeout_seconds, true); +#else + (void)timeout_seconds; + return true; // no-op +#endif +} + +bool isActive() { + return s_initialized; +} + +} // namespace Watchdog diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..10d7575 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,143 @@ +#include +#include "Watchdog.h" +#include +#include +#include +#include +#include +#include +#include + +#define WDT_TIMEOUT 60 // Czas watchdoga do restartu +// Konfiguracja serw (to trzeba skalibrować) +#define SERVOMIN 150 // Minimalna długość impulsu (0 stopni) +#define SERVOMAX 550 // Maksymalna długość impulsu (180 stopni) +#define NUM_FINGERS 5 + +// Aktualne pozycje serw (do płynnych przejść) +int currentPositions[NUM_FINGERS] = {0, 0, 0, 0, 0}; + +Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); + +// Struktura gestu +struct Gesture { + const char *name; + int angles[NUM_FINGERS]; // Kąty 0-180 +}; + +// --- DEFINICJA GESTÓW --- +// Kolejność: Kciuk, Wskazujący, Środkowy, Serdeczny, Mały +Gesture gestureList[] = { + {"OTWARTA", {0, 0, 0, 0, 0}}, // Wszystkie wyprostowane + {"PIESC", {170, 170, 170, 170, 170}},// Wszystkie zgięte + {"V-SIGN", {170, 0, 0, 170, 170}}, // Pokój / Zwycięstwo + {"OK", {150, 150, 0, 0, 0}}, // Kciuk i wskazujący złączone + {"PALEC", {170, 0, 170, 170, 170}}, // Wskazywanie palcem + + // --- NOWE GESTY --- + {"KCIUK_GORA", {0, 170, 170, 170, 170}}, // Lajk (Kciuk wyprostowany, reszta pięść) + {"ROCK_ON", {0, 0, 170, 170, 0}}, // "Rogi" (Kciuk, wskazujący i mały wyprostowane) + {"SPIDERMAN", {0, 0, 170, 170, 0}}, // Podobnie jak rock, ale kciuk szeroko + {"SHAKA", {0, 170, 170, 170, 0}}, // Gest surferów (Kciuk i mały wyprostowane) + {"PUNKT", {170, 0, 0, 170, 170}}, // Wskazujący i środkowy (jak pistolet) + + // --- LICZBY --- + {"LICZBA_1", {170, 0, 170, 170, 170}}, // Tylko wskazujący + {"LICZBA_2", {170, 0, 0, 170, 170}}, // Wskazujący i środkowy + {"LICZBA_3", {170, 0, 0, 0, 170}}, // Trzy środkowe palce + {"LICZBA_4", {170, 0, 0, 0, 0}}, // Bez kciuka + + // --- INNE --- + {"CZEŚĆ", {40, 40, 40, 40, 40}}, // Lekko ugięte (naturalna dłoń) + {"CHWYT_PRECYZ", {120, 120, 170, 170, 170}} // Pęseta (Kciuk i wskazujący do połowy) +}; +int totalGestures = sizeof(gestureList) / sizeof(Gesture); + +//////// PROTOTYPY ///////////////// +void setup(); +void loop(); +//void playGesture(Gesture g); +void moveToGesture(Gesture g, int speed); +int angleToPWM(int angle); + + +void setup() { + Serial.begin(115200); + delay(500); + unsigned long t0 = millis(); + while (!Serial && millis()-t0 < 2000) { delay(10); } + esp_log_level_set("*", ESP_LOG_INFO); // _ERROR, _WARN, _INFO, _DEBUG, _VERBOSE + delay(500); + + ESP_LOGI(TAG_MAIN, "----------------------"); + ESP_LOGI(TAG_MAIN, "WMT Stalowa Wola L.Klich"); + ESP_LOGI(TAG_MAIN, "Robotyczna reka"); + ESP_LOGI(TAG_MAIN, "Firmware: %s", VERSION); + ESP_LOGI(TAG_MAIN, "----------------------"); + ESP_LOGI(TAG_MAIN, "ESP32 model: %s Rev %d", ESP.getChipModel(), ESP.getChipRevision()); + ESP_LOGI(TAG_MAIN, "Chip cores: %d", ESP.getChipCores()); + + // Inicjalizacja Watchdoga panic_on_trigger = true + if (Watchdog::init(25, true)) { + ESP_LOGI(TAG_MAIN, "Watchdog init ok."); + } else { + ESP_LOGE(TAG_MAIN, "Watchdog init error."); + } + + Wire.begin(PIN_SDA, PIN_SCL); + scanI2C(); // Skanowanie magistrali I2C + pwm.begin(); + pwm.setPWMFreq(50); + + // Dodanie taska loop do WDT + if (Watchdog::addThisTask()) { + ESP_LOGI(TAG_MAIN, "Added main task to Watchdog"); + } + + // Ustawienie pozycji startowej (otwarta dłoń) + for(int i=0; i g.angles[i]) { + currentPositions[i]--; + allReached = false; + } + pwm.setPWM(i, 0, angleToPWM(currentPositions[i])); + } + delay(speed); // Kontrola prędkości (im mniejsza wartość, tym szybciej) + } +} + +void loop() { + Watchdog::feed(); + + for (int i = 0; i < totalGestures; i++) { + moveToGesture(gestureList[i], 10); // Prędkość 10ms na stopień + delay(1000); // 1 sekunda przed kolejnym gestem + Watchdog::feed(); + } + +} + diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -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