From a6be38ff7f23d8b14d37bae8677d5357f4bebd30 Mon Sep 17 00:00:00 2001 From: Stefan de Bruijn Date: Mon, 5 Jul 2021 17:00:31 +0200 Subject: [PATCH] Changed analogoutput to uint32_t Added a few more support classes. --- Grbl_Esp32/src/UserOutput.cpp | 3 +- Grbl_Esp32/src/UserOutput.h | 4 +- UnitTests.vcxproj | 2 + UnitTests.vcxproj.filters | 1122 +++++++++++++++++++++++++-------- X86TestSupport/Arduino.cpp | 4 + X86TestSupport/Capture.h | 44 ++ X86TestSupport/TODO.txt | 13 - X86TestSupport/WString.cpp | 40 +- X86TestSupport/nvs.cpp | 64 ++ X86TestSupport/nvs.h | 18 +- generate_vcxproj.py | 11 + 11 files changed, 1018 insertions(+), 307 deletions(-) create mode 100644 X86TestSupport/Capture.h create mode 100644 X86TestSupport/nvs.cpp diff --git a/Grbl_Esp32/src/UserOutput.cpp b/Grbl_Esp32/src/UserOutput.cpp index cac48afd..8bab3deb 100644 --- a/Grbl_Esp32/src/UserOutput.cpp +++ b/Grbl_Esp32/src/UserOutput.cpp @@ -49,7 +49,8 @@ namespace UserOutput { // ================================================================== - AnalogOutput::AnalogOutput(uint8_t number, Pin& pin, float pwm_frequency) : _number(number), _pin(pin), _pwm_frequency(pwm_frequency) { + AnalogOutput::AnalogOutput(uint8_t number, Pin& pin, uint32_t pwm_frequency) : + _number(number), _pin(pin), _pwm_frequency(pwm_frequency) { if (_pin.undefined()) { return; } diff --git a/Grbl_Esp32/src/UserOutput.h b/Grbl_Esp32/src/UserOutput.h index 42beb761..bedd466a 100644 --- a/Grbl_Esp32/src/UserOutput.h +++ b/Grbl_Esp32/src/UserOutput.h @@ -40,7 +40,7 @@ namespace UserOutput { class AnalogOutput { public: - AnalogOutput(uint8_t number, Pin& pin, float pwm_frequency); + AnalogOutput(uint8_t number, Pin& pin, uint32_t pwm_frequency); bool set_level(uint32_t numerator); uint32_t denominator() { return 1UL << _resolution_bits; }; @@ -51,7 +51,7 @@ namespace UserOutput { uint8_t _number = UNDEFINED_OUTPUT; Pin& _pin; uint8_t _pwm_channel = -1; // -1 means invalid or not setup - float _pwm_frequency; + uint32_t _pwm_frequency; uint8_t _resolution_bits; uint32_t _current_value; }; diff --git a/UnitTests.vcxproj b/UnitTests.vcxproj index 98e7da4d..629c4422 100644 --- a/UnitTests.vcxproj +++ b/UnitTests.vcxproj @@ -166,6 +166,7 @@ + @@ -304,6 +305,7 @@ + diff --git a/UnitTests.vcxproj.filters b/UnitTests.vcxproj.filters index 2c19bf16..476faeb8 100644 --- a/UnitTests.vcxproj.filters +++ b/UnitTests.vcxproj.filters @@ -1,279 +1,861 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + {FDE5A3A1-4E92-3B7B-BA93-74C1C89D4E58} + + + {2896077E-16A8-3EAE-B5C4-159DC4FA2436} + + + {EED825A4-B73C-33F5-96D4-769C2A167F8C} + + + {58B2381C-99DF-3035-A3F0-4AADBB709BE7} + + + {245249FF-C286-3813-BCCF-413895DB9135} + + + {76D241B7-03F7-3DD3-9834-4EFF878918F6} + + + {2D9E09B1-7C61-3463-9CF9-D57FA109EF03} + + + {57EA2BFF-20B3-353C-8D6A-52862855F6A7} + + + {E7013460-23D9-3E12-8F4C-4A4FE671769C} + + + {4FE640FC-EB59-3010-9873-80157C13991B} + + + {D77ADD93-FE73-3DE5-92BB-25ABE9077DD6} + + + {9396f607-9b99-4f0e-bfdb-f549462e0205} + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + src\Machine + + + src + + + src\Motors + + + src\Configuration + + + src\Configuration + + + src\Pins + + + src + + + X86TestSupport + + + src\Spindles + + + src\Configuration + + + src + + + X86TestSupport + + + src + + + src\Configuration + + + src + + + src\Pins + + + X86TestSupport + + + src + + + src + + + src + + + src\Motors + + + src\Machine + + + src + + + src\Motors + + + src\WebUI + + + src\Pins + + + src\Pins + + + src + + + X86TestSupport + + + src + + + src + + + src\Configuration + + + src\WebUI + + + src + + + X86TestSupport + + + src\Machine + + + src\Motors + + + src + + + src\WebUI + + + src\Pins + + + X86TestSupport + + + X86TestSupport + + + src\Configuration + + + src + + + src\WebUI + + + src + + + X86TestSupport + + + src + + + src\StackTrace + + + src\WebUI + + + X86TestSupport + + + src + + + src\WebUI + + + X86TestSupport + + + src\Spindles + + + src\Machine + + + X86TestSupport + + + src\Machine + + + X86TestSupport + + + src + + + src\Spindles + + + X86TestSupport + + + X86TestSupport + + + X86TestSupport + + + src\WebUI + + + src\Spindles + + + src\Motors + + + src + + + src + + + src\Motors + + + src\Configuration + + + X86TestSupport + + + src\WebUI + + + X86TestSupport + + + src\Spindles + + + src + + + src + + + src\Spindles + + + src + + + src\Spindles + + + src + + + X86TestSupport + + + src\Spindles + + + src\Machine + + + src\Motors + + + src\Motors + + + src\Machine + + + src\Pins + + + X86TestSupport + + + src\Machine + + + src\Machine + + + X86TestSupport + + + X86TestSupport + + + src + + + src + + + src\WebUI + + + X86TestSupport + + + src + + + src\WebUI + + + src\Pins + + + src\Pins + + + src + + + src + + + src\Pins + + + src\WebUI + + + src + + + src\Configuration + + + src\Spindles + + + X86TestSupport + + + src\Configuration + + + src + + + src\Pins + + + src\Spindles + + + src\Machine + + + src\Configuration + + + X86TestSupport + + + src\WebUI + + + src + + + src\WebUI + + + src\WebUI + + + src\Machine + + + src\Machine + + + X86TestSupport + + + X86TestSupport + + + src + + + src + + + src\StackTrace + + + src\Configuration + + + src\Motors + + + src\Configuration + + + src + + + src\Spindles + + + src + + + src\Spindles + + + src\Motors + + + src\Configuration + + + X86TestSupport + + + src\Configuration + + + src + + + src\Spindles + + + src\Machine + + + X86TestSupport + + + src\Machine + + + X86TestSupport + + + X86TestSupport + + + X86TestSupport + + + src\Configuration + + + src + + + src\Configuration + + + tests + + + tests + + + X86TestSupport + - - - - - - - - - + + src\WebUI + + + src\Spindles + + + src\Configuration + + + src + + + src\WebUI + + + src\Spindles + + + src + + + src\Configuration + + + src + + + src\Spindles + + + src\Pins + + + src\Machine + + + src\WebUI + + + src + + + src + + + src\Pins + + + src + + + src + + + src + + + src + + + src\Motors + + + src + + + src\Motors + + + src\Configuration + + + src\Spindles + + + src\Pins + + + src\Machine + + + src + + + X86TestSupport + + + src + + + src + + + src\Pins + + + src\Pins + + + src + + + X86TestSupport + + + src\Machine + + + src\Pins + + + src\Configuration + + + src + + + src\Spindles + + + src + + + src\WebUI + + + src\Pins + + + src + + + src\StackTrace + + + src\WebUI + + + src + + + src\Spindles + + + src\Configuration + + + src\WebUI + + + src + + + src\Spindles + + + src\StackTrace + + + src\Motors + + + src\Motors + + + src + + + src + + + src\WebUI + + + src\Motors + + + src\Spindles + + + src\Motors + + + X86TestSupport + + + src\Spindles + + + src\Motors + + + src + + + X86TestSupport + + + src\Configuration + + + src + + + src + + + src\Spindles + + + src\Motors + + + src + + + src\WebUI + + + src\Machine + + + src + + + src + + + src\Pins + + + src\Machine + + + src\Configuration + + + src\WebUI + + + src\Spindles + + + src\WebUI + + + src\Pins + + + src\Machine + + + src\Spindles + + + src\Machine + + + src\WebUI + + + src\Pins + + + src\WebUI + + + src + + + X86TestSupport + + + src\Spindles + + + src + + + src\Configuration + + + X86TestSupport + + + src\Machine + + + src + + + src\WebUI + + + tests + + + tests + + + tests + + + tests + + + tests + + + tests + + + tests + + + tests + + + tests + + + tests + + + tests + + + X86TestSupport + + + + + src + + + src\Spindles + + + src\Configuration + + + src + + + src\Configuration + + + src\Configuration + + + src\Configuration + + + src\Motors + + + tests + \ No newline at end of file diff --git a/X86TestSupport/Arduino.cpp b/X86TestSupport/Arduino.cpp index 3ebfb712..7928b2dd 100644 --- a/X86TestSupport/Arduino.cpp +++ b/X86TestSupport/Arduino.cpp @@ -42,3 +42,7 @@ extern "C" void __digitalWrite(uint8_t pin, uint8_t val) { void delay(int ms) { std::this_thread::sleep_for(std::chrono::milliseconds(ms)); } + +int temperatureRead(void) { + return 22; // Nobody cares +} diff --git a/X86TestSupport/Capture.h b/X86TestSupport/Capture.h new file mode 100644 index 00000000..699d904b --- /dev/null +++ b/X86TestSupport/Capture.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +// Capture here defines everything that we want to know. Specifically, we want to capture per ID: +// 1. Timings. *When* did something happen? +// 2. Data. This can be a simple '1' or '0', or a character stream. For simplicity, we store a vector of integers. +// +// An ID itself is a string. This can be a pin ID (gpio.1), an uart (uart.0), an ledc, or whatever. + +struct CaptureEvent { + uint32_t time; + std::string id; + std::vector data; +}; + +class Capture { + Capture() {} + + std::vector events; + uint32_t currentTime; + +public: + static Capture& instance() { + static Capture instance; + return instance; + } + + void reset() { events.clear(); } + + void write(std::string id, uint32_t value) { + CaptureEvent evt; + evt.time = currentTime; + evt.id = id; + evt.data.reserve(1); + evt.data.push_back(value); + events.push_back(evt); + } + + void wait(uint32_t delay) { currentTime += delay; } + void yield() { wait(1); } +}; diff --git a/X86TestSupport/TODO.txt b/X86TestSupport/TODO.txt index 23b35888..01d9874e 100644 --- a/X86TestSupport/TODO.txt +++ b/X86TestSupport/TODO.txt @@ -16,22 +16,9 @@ TODO: Two things need to be captured: (1) uart/pin/etc and (2) timings. All timi "int __cdecl i2s_out_set_pulse_callback(void (__cdecl*)(void))" (?i2s_out_set_pulse_callback@@YAHP6AXXZ@Z) "int __cdecl i2s_out_set_pulse_period(unsigned int)" (?i2s_out_set_pulse_period@@YAHI@Z) "int __cdecl i2s_out_set_stepping(void)" (?i2s_out_set_stepping@@YAHXZ) -"int __cdecl nvs_erase_key(class NvsEmulator *,char const *)" (?nvs_erase_key@@YAHPAVNvsEmulator@@PBD@Z) -"int __cdecl nvs_get_blob(class NvsEmulator *,char const *,void *,unsigned int *)" (?nvs_get_blob@@YAHPAVNvsEmulator@@PBDPAXPAI@Z) -"int __cdecl nvs_get_i32(class NvsEmulator *,char const *,int *)" (?nvs_get_i32@@YAHPAVNvsEmulator@@PBDPAH@Z) -"int __cdecl nvs_get_i8(class NvsEmulator *,char const *,signed char *)" (?nvs_get_i8@@YAHPAVNvsEmulator@@PBDPAC@Z) -"int __cdecl nvs_get_str(class NvsEmulator *,char const *,char *,unsigned int *)" (?nvs_get_str@@YAHPAVNvsEmulator@@PBDPADPAI@Z) -"int __cdecl nvs_open(char const *,enum nvs_open_mode,class NvsEmulator * *)" (?nvs_open@@YAHPBDW4nvs_open_mode@@PAPAVNvsEmulator@@@Z) -"int __cdecl nvs_set_blob(class NvsEmulator *,char const *,void const *,unsigned int)" (?nvs_set_blob@@YAHPAVNvsEmulator@@PBDPBXI@Z) -"int __cdecl nvs_set_i32(class NvsEmulator *,char const *,int)" (?nvs_set_i32@@YAHPAVNvsEmulator@@PBDH@Z) -"int __cdecl nvs_set_i8(class NvsEmulator *,char const *,int)" (?nvs_set_i8@@YAHPAVNvsEmulator@@PBDH@Z) -"int __cdecl nvs_set_str(class NvsEmulator *,char const *,char const *)" (?nvs_set_str@@YAHPAVNvsEmulator@@PBD1@Z) "int __cdecl rmt_config(struct rmt_config_t const *)" (?rmt_config@@YAHPBUrmt_config_t@@@Z) "int __cdecl rmt_fill_tx_items(enum rmt_channel_t,struct rmt_item32_s const *,unsigned short,unsigned short)" (?rmt_fill_tx_items@@YAHW4rmt_channel_t@@PBUrmt_item32_s@@GG@Z) "int __cdecl rmt_set_source_clk(enum rmt_channel_t,enum rmt_source_clk_t)" (?rmt_set_source_clk@@YAHW4rmt_channel_t@@W4rmt_source_clk_t@@@Z) -"int __cdecl strcasecmp(char const *,char const *)" (?strcasecmp@@YAHPBD0@Z) -"int __cdecl strncasecmp(char const *,char const *,unsigned int)" (?strncasecmp@@YAHPBD0I@Z) -"int __cdecl temperatureRead(void)" (?temperatureRead@@YAHXZ) "int __cdecl uart_driver_install(enum uart_port_t,int,int,int,void * *,int)" (?uart_driver_install@@YAHW4uart_port_t@@HHHPAPAXH@Z) "int __cdecl uart_flush(enum uart_port_t)" (?uart_flush@@YAHW4uart_port_t@@@Z) "int __cdecl uart_get_buffered_data_len(enum uart_port_t,unsigned int *)" (?uart_get_buffered_data_len@@YAHW4uart_port_t@@PAI@Z) diff --git a/X86TestSupport/WString.cpp b/X86TestSupport/WString.cpp index 74883bfb..68e731c3 100644 --- a/X86TestSupport/WString.cpp +++ b/X86TestSupport/WString.cpp @@ -3,12 +3,12 @@ #include #include -#pragma warning(disable : 4996) // itoa +#pragma warning(disable : 4996) // itoa std::string String::ValueToString(int value, int base) { char buffer[100] = { 0 }; int number_base = 10; - std::string output = itoa(value, buffer, base); + std::string output = itoa(value, buffer, base); return output; } @@ -19,62 +19,78 @@ std::string String::DecToString(double value, int decimalPlaces) { return s; } -StringAppender& operator +(const StringAppender& lhs, const String& rhs) { +StringAppender& operator+(const StringAppender& lhs, const String& rhs) { StringAppender& a = const_cast(lhs); a.concat(rhs); return a; } -StringAppender& operator +(const StringAppender& lhs, const char* cstr) { +StringAppender& operator+(const StringAppender& lhs, const char* cstr) { StringAppender& a = const_cast(lhs); a.concat(cstr); return a; } -StringAppender& operator +(const StringAppender& lhs, char c) { +StringAppender& operator+(const StringAppender& lhs, char c) { StringAppender& a = const_cast(lhs); a.concat(c); return a; } -StringAppender& operator +(const StringAppender& lhs, unsigned char num) { +StringAppender& operator+(const StringAppender& lhs, unsigned char num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } -StringAppender& operator +(const StringAppender& lhs, int num) { +StringAppender& operator+(const StringAppender& lhs, int num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } -StringAppender& operator +(const StringAppender& lhs, unsigned int num) { +StringAppender& operator+(const StringAppender& lhs, unsigned int num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } -StringAppender& operator +(const StringAppender& lhs, long num) { +StringAppender& operator+(const StringAppender& lhs, long num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } -StringAppender& operator +(const StringAppender& lhs, unsigned long num) { +StringAppender& operator+(const StringAppender& lhs, unsigned long num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } -StringAppender& operator +(const StringAppender& lhs, float num) { +StringAppender& operator+(const StringAppender& lhs, float num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } -StringAppender& operator +(const StringAppender& lhs, double num) { +StringAppender& operator+(const StringAppender& lhs, double num) { StringAppender& a = const_cast(lhs); a.concat(num); return a; } + +int strcasecmp(const char* lhs, const char* rhs) { + while (*lhs && *rhs && tolower(*lhs) == tolower(*rhs)) { + ++lhs; + ++rhs; + } + return (*lhs) == '\0' && (*rhs) == '\0'; +} +int strncasecmp(const char* lhs, const char* rhs, size_t count) { + while (*lhs && *rhs && tolower(*lhs) == tolower(*rhs) && count > 0) { + ++lhs; + ++rhs; + --count; + } + return count == 0 || ((*lhs) == '\0' && (*rhs) == '\0'); +} diff --git a/X86TestSupport/nvs.cpp b/X86TestSupport/nvs.cpp new file mode 100644 index 00000000..2297096d --- /dev/null +++ b/X86TestSupport/nvs.cpp @@ -0,0 +1,64 @@ +#include "nvs.h" + +esp_err_t nvs_open(const char* name, nvs_open_mode open_mode, nvs_handle* out_handle) { + *out_handle = &(NvsEmulator::instance()); + return ESP_OK; +} +esp_err_t nvs_get_i32(nvs_handle handle, const char* key, int32_t* out_value) { + if (handle->tryGetI32(key, *out_value)) { + return ESP_OK; + } else { + return ESP_ERR_NVS_NOT_FOUND; + } +} +esp_err_t nvs_get_i8(nvs_handle handle, const char* key, int8_t* out_value) { + if (handle->tryGetI8(key, *out_value)) { + return ESP_OK; + } else { + return ESP_ERR_NVS_NOT_FOUND; + } +} +esp_err_t nvs_get_str(nvs_handle handle, const char* key, char* out_value, size_t* length) { + if (handle->tryGetStr(key, out_value, *length)) { + return ESP_OK; + } else { + return ESP_ERR_NVS_NOT_FOUND; + } +} +esp_err_t nvs_get_blob(nvs_handle handle, const char* key, void* out_value, size_t* length) { + if (handle->tryGetBlob(key, out_value, *length)) { + return ESP_OK; + } else { + return ESP_ERR_NVS_NOT_FOUND; + } +} +esp_err_t nvs_erase_key(nvs_handle handle, const char* key) { + handle->erase(key); + return ESP_OK; +} +esp_err_t nvs_erase_all(nvs_handle handle) { + handle->clear(); + return ESP_OK; +} +esp_err_t nvs_set_i8(nvs_handle handle, const char* key, int8_t value) { + char* v = reinterpret_cast(&value); + std::string data(v, v + 1); + handle->set(key, data); + return ESP_OK; +} +esp_err_t nvs_set_i32(nvs_handle handle, const char* key, int32_t value) { + char* v = reinterpret_cast(&value); + std::string data(v, v + 4); + handle->set(key, data); + return ESP_OK; +} +esp_err_t nvs_set_str(nvs_handle handle, const char* key, const char* value) { + handle->set(key, value); + return ESP_OK; +} +esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, size_t length) { + auto c = static_cast(value); + std::string data(c, c + length); + handle->set(key, data); + return ESP_OK; +} diff --git a/X86TestSupport/nvs.h b/X86TestSupport/nvs.h index 5d9851dc..b558eecb 100644 --- a/X86TestSupport/nvs.h +++ b/X86TestSupport/nvs.h @@ -1,6 +1,7 @@ #pragma once #include +#include "esp_err.h" class NvsEmulator { // NVS is basically a key-value store. @@ -28,10 +29,10 @@ public: } } - bool tryGetStr(const char* str, char* buf, int32_t& len) { + bool tryGetStr(const char* str, char* buf, size_t& len) { auto it = data.find(str); if (it != data.end()) { - auto v = int32_t(it->second.size()); + auto v = it->second.size(); if (buf) { if (v > len) { v = len; @@ -47,10 +48,10 @@ public: } } - bool tryGetBlob(const char* str, char* buf, int32_t& len) { + bool tryGetBlob(const char* str, void* buf, size_t& len) { auto it = data.find(str); if (it != data.end()) { - auto v = int32_t(it->second.size()); + auto v = it->second.size(); if (buf) { if (v > len) { v = len; @@ -66,6 +67,8 @@ public: } } + void set(const char* str, std::string value) { data[str] = value; } + void erase(const char* str) { auto it = data.find(str); if (it != data.end()) { @@ -97,10 +100,7 @@ inline esp_err_t nvs_get_stats(const char* part_name, nvs_stats_t* stats) { return ESP_OK; } -inline esp_err_t nvs_erase_all(nvs_handle handle) { - handle->clear(); - return ESP_OK; -} +esp_err_t nvs_erase_all(nvs_handle handle); enum nvs_open_mode { NVS_READWRITE }; @@ -157,7 +157,7 @@ esp_err_t nvs_get_blob(nvs_handle handle, const char* key, void* out_value, size esp_err_t nvs_erase_key(nvs_handle handle, const char* key); esp_err_t nvs_erase_all(nvs_handle handle); -esp_err_t nvs_set_i8(nvs_handle handle, const char* key, int32_t value); +esp_err_t nvs_set_i8(nvs_handle handle, const char* key, int8_t value); esp_err_t nvs_set_i32(nvs_handle handle, const char* key, int32_t value); esp_err_t nvs_set_str(nvs_handle handle, const char* key, const char* value); esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, size_t length); diff --git a/generate_vcxproj.py b/generate_vcxproj.py index c2624a6a..9f54c579 100644 --- a/generate_vcxproj.py +++ b/generate_vcxproj.py @@ -17,6 +17,7 @@ PATHS_TO_SEARCH = ['Grbl_Esp32'] HEADER_EXT = ['.h', '.inl'] SOURCE_EXT = ['.c', '.cpp'] OTHER_EXT = ['.ino', '.md'] +TEST_IGNORE = ['I2SOut.cpp','I2SOut.h'] import os, uuid @@ -276,5 +277,15 @@ def main(paths): for path in paths: generator.Walk(path) generator.Generate() + +def tests(paths): + generator = Generator() + generator.Name = "UnitTests" + OTHER_EXT = ['.md'] + newpaths = ['Grbl_Esp32', 'X86TestSupport'] + for path in newpaths: + generator.Walk(path) + generator.Generate() main(PATHS_TO_SEARCH) +