Base Software System
This commit is contained in:
		
							
								
								
									
										6
									
								
								Software/ChainLube/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Software/ChainLube/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| .pio | ||||
| .vscode/.browse.c_cpp.db* | ||||
| .vscode/c_cpp_properties.json | ||||
| .vscode/launch.json | ||||
| .vscode/ipch | ||||
| wifi_credentials.ini | ||||
							
								
								
									
										7
									
								
								Software/ChainLube/.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Software/ChainLube/.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
|     // See http://go.microsoft.com/fwlink/?LinkId=827846 | ||||
|     // for the documentation about the extensions.json format | ||||
|     "recommendations": [ | ||||
|         "platformio.platformio-ide" | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										39
									
								
								Software/ChainLube/include/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Software/ChainLube/include/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
|  | ||||
| This directory is intended for project header files. | ||||
|  | ||||
| A header file is a file containing C declarations and macro definitions | ||||
| to be shared between several project source files. You request the use of a | ||||
| header file in your project source file (C, C++, etc) located in `src` folder | ||||
| by including it, with the C preprocessing directive `#include'. | ||||
|  | ||||
| ```src/main.c | ||||
|  | ||||
| #include "header.h" | ||||
|  | ||||
| int main (void) | ||||
| { | ||||
|  ... | ||||
| } | ||||
| ``` | ||||
|  | ||||
| Including a header file produces the same results as copying the header file | ||||
| into each source file that needs it. Such copying would be time-consuming | ||||
| and error-prone. With a header file, the related declarations appear | ||||
| in only one place. If they need to be changed, they can be changed in one | ||||
| place, and programs that include the header file will automatically use the | ||||
| new version when next recompiled. The header file eliminates the labor of | ||||
| finding and changing all the copies as well as the risk that a failure to | ||||
| find one copy will result in inconsistencies within a program. | ||||
|  | ||||
| In C, the usual convention is to give header files names that end with `.h'. | ||||
| It is most portable to use only letters, digits, dashes, and underscores in | ||||
| header file names, and at most one dot. | ||||
|  | ||||
| Read more about using header files in official GCC documentation: | ||||
|  | ||||
| * Include Syntax | ||||
| * Include Operation | ||||
| * Once-Only Headers | ||||
| * Computed Includes | ||||
|  | ||||
| https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html | ||||
							
								
								
									
										46
									
								
								Software/ChainLube/lib/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Software/ChainLube/lib/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
|  | ||||
| This directory is intended for project specific (private) libraries. | ||||
| PlatformIO will compile them to static libraries and link into executable file. | ||||
|  | ||||
| The source code of each library should be placed in a an own separate directory | ||||
| ("lib/your_library_name/[here are source files]"). | ||||
|  | ||||
| For example, see a structure of the following two libraries `Foo` and `Bar`: | ||||
|  | ||||
| |--lib | ||||
| |  | | ||||
| |  |--Bar | ||||
| |  |  |--docs | ||||
| |  |  |--examples | ||||
| |  |  |--src | ||||
| |  |     |- Bar.c | ||||
| |  |     |- Bar.h | ||||
| |  |  |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html | ||||
| |  | | ||||
| |  |--Foo | ||||
| |  |  |- Foo.c | ||||
| |  |  |- Foo.h | ||||
| |  | | ||||
| |  |- README --> THIS FILE | ||||
| | | ||||
| |- platformio.ini | ||||
| |--src | ||||
|    |- main.c | ||||
|  | ||||
| and a contents of `src/main.c`: | ||||
| ``` | ||||
| #include <Foo.h> | ||||
| #include <Bar.h> | ||||
|  | ||||
| int main (void) | ||||
| { | ||||
|   ... | ||||
| } | ||||
|  | ||||
| ``` | ||||
|  | ||||
| PlatformIO Library Dependency Finder will find automatically dependent | ||||
| libraries scanning project source files. | ||||
|  | ||||
| More information about PlatformIO Library Dependency Finder | ||||
| - https://docs.platformio.org/page/librarymanager/ldf.html | ||||
							
								
								
									
										43
									
								
								Software/ChainLube/platformio.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Software/ChainLube/platformio.ini
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| ; 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 | ||||
|  | ||||
| [platformio] | ||||
| extra_configs = | ||||
|   wifi_credentials.ini | ||||
|  | ||||
| [env:d1_mini] | ||||
| platform = espressif8266 | ||||
| board = d1_mini | ||||
| framework = arduino | ||||
|  | ||||
|  | ||||
| ;upload_port = 192.168.0.20 | ||||
| ;upload_protocol = espota | ||||
| ;upload_flags =   | ||||
| ;    --auth="chainlube" | ||||
| upload_protocol=esptool | ||||
|  | ||||
| build_flags = | ||||
|   ;-DDEBUG | ||||
|   -fexceptions | ||||
|  | ||||
| build_unflags = -fno-exceptions | ||||
| build_type = debug | ||||
| board_build.filesystem = littlefs | ||||
|  | ||||
| monitor_filters = esp8266_exception_decoder | ||||
| monitor_speed = 115200 | ||||
|  | ||||
| board_build.ldscript = eagle.flash.4m3m.ld | ||||
| lib_ldf_mode = deep | ||||
| lib_deps =  | ||||
|     olikraus/U8g2 @ ^2.28.8 | ||||
|     joaolopesf/RemoteDebug @ ^2.1.2 | ||||
|     fastled/FastLED @ ^3.5.0 | ||||
							
								
								
									
										27
									
								
								Software/ChainLube/src/common.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Software/ChainLube/src/common.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| #ifndef _COMMON_H_ | ||||
| #define _COMMON_H_ | ||||
|  | ||||
| #define GPIO_BUTTON 14 | ||||
| #define GPIO_LED D6 | ||||
| #define GPIO_TRIGGER 2 | ||||
| #define GPIO_PUMP 0 | ||||
|  | ||||
| #ifndef HOST_NAME | ||||
| #define HOST_NAME "ChainLube_%06X"      // Use printf-Formatting - Chip-ID (uin32_t) will be added | ||||
| #endif | ||||
|  | ||||
| #ifndef OTA_DELAY | ||||
| #define OTA_DELAY 50  // ticks -> 10ms / tick | ||||
| #endif | ||||
|  | ||||
| #ifndef ADMIN_PASS | ||||
| #error "You need to define ADMIN_PASS for OTA-Update" | ||||
| #endif | ||||
| #ifndef WIFI_PASSWORD | ||||
| #error "You must define an WIFI_PASSWORD for OTA-Update" | ||||
| #endif | ||||
| #ifndef WIFI_SSID  | ||||
| #error "You must define an WIFI_SSID for OTA-Update" | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										164
									
								
								Software/ChainLube/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								Software/ChainLube/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| #include <Arduino.h> | ||||
| #include <Wire.h> | ||||
| #include <U8g2lib.h> | ||||
| #include <ESP8266WiFi.h> | ||||
| #include <ESP8266WiFiMulti.h> | ||||
| #include <ESP8266mDNS.h> | ||||
| #include <ArduinoOTA.h> | ||||
| #include <RemoteDebug.h> | ||||
| #include <FastLED.h> | ||||
|  | ||||
| #include "common.h" | ||||
| #include "rmtdbghelp.h" | ||||
|  | ||||
| const char *ssid = WIFI_SSID; | ||||
| const char *password = WIFI_PASSWORD; | ||||
|  | ||||
| #ifdef DEBUG | ||||
| const bool debug_flag = true; | ||||
| #else | ||||
| const bool debug_flag = false; | ||||
| #endif | ||||
|  | ||||
| bool startSetupMode = false; | ||||
| char DeviceName[33]; | ||||
|  | ||||
| U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(-1); | ||||
| RemoteDebug Debug; | ||||
| ESP8266WiFiMulti wifiMulti; | ||||
|  | ||||
| // Function-Prototypes | ||||
| String IpAddress2String(const IPAddress &ipAddress); | ||||
| void processCmdRemoteDebug(); | ||||
| void RemotDebug_printSystemInfo(); | ||||
| void RemoteDebug_printWifiInfo(); | ||||
|  | ||||
| CRGB leds[1]; | ||||
|  | ||||
| void setup() | ||||
| { | ||||
|   system_update_cpu_freq(SYS_CPU_80MHZ); | ||||
|   snprintf(DeviceName, 32, HOST_NAME, ESP.getChipId()); | ||||
|   WiFi.mode(WIFI_OFF); | ||||
|   WiFi.persistent(false); | ||||
|   Serial.begin(115200); | ||||
|   Serial.setDebugOutput(true); | ||||
|  | ||||
|   Serial.println("Souko's ChainOiler Mk1"); | ||||
|   Serial.println(DeviceName); | ||||
|  | ||||
|   u8x8.begin(); | ||||
|   u8x8.setFont(u8x8_font_chroma48medium8_r); | ||||
|  | ||||
|   pinMode(GPIO_TRIGGER, INPUT_PULLUP); | ||||
|   pinMode(GPIO_BUTTON, INPUT_PULLUP); | ||||
|   pinMode(GPIO_PUMP, OUTPUT); | ||||
|  | ||||
|   WiFi.mode(WIFI_STA); | ||||
|   WiFi.setHostname(DeviceName); | ||||
|   wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD); | ||||
|  | ||||
|   Serial.println("Connecting Wifi..."); | ||||
|   if (wifiMulti.run() == WL_CONNECTED) | ||||
|   { | ||||
|     Serial.println(""); | ||||
|     Serial.println("WiFi connected"); | ||||
|     Serial.println("IP address: "); | ||||
|     Serial.print(WiFi.localIP()); | ||||
|   } | ||||
|  | ||||
|   if (MDNS.begin(DeviceName)) | ||||
|     MDNS.addService("telnet", "tcp", 23); | ||||
|  | ||||
|   Debug.begin(DeviceName);        // Initialize the WiFi server | ||||
|   Debug.setResetCmdEnabled(true); // Enable the reset command | ||||
|   Debug.showProfiler(true);       // Profiler (Good to measure times, to optimize codes) | ||||
|   Debug.showColors(true);         // Colors | ||||
|  | ||||
|   Debug.setHelpProjectsCmds(helpCmd); | ||||
|   Debug.setCallBackProjectCmds(&processCmdRemoteDebug); | ||||
|  | ||||
|   ArduinoOTA.setPort(8266); | ||||
|   ArduinoOTA.setHostname(DeviceName); | ||||
|   ArduinoOTA.setPassword(ADMIN_PASS); | ||||
|  | ||||
|   ArduinoOTA.onStart([]() | ||||
|                      { | ||||
|                        u8x8.clearDisplay(); | ||||
|                        u8x8.drawString(0, 0, "OTA-Update"); | ||||
|                        u8x8.refreshDisplay(); }); | ||||
|  | ||||
|   ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) | ||||
|                         { | ||||
|                           static bool refreshed = false; | ||||
|                           if (!refreshed) | ||||
|                           { | ||||
|                             u8x8.clearDisplay(); | ||||
|                             refreshed = true; | ||||
|                             u8x8.drawString(0, 0, "OTA Upload"); | ||||
|                           } | ||||
|                           uint32_t percent = progress / (total / 100); | ||||
|                           u8x8.setCursor(0, 1); | ||||
|                           u8x8.printf("%d %%", percent); | ||||
|                           u8x8.refreshDisplay(); }); | ||||
|  | ||||
|   ArduinoOTA.onEnd([]() | ||||
|                    { | ||||
|                      u8x8.clearDisplay(); | ||||
|                      u8x8.drawString(0, 0, "OTA-Restart"); | ||||
|                      u8x8.refreshDisplay(); }); | ||||
|  | ||||
|   ArduinoOTA.begin(); | ||||
|  | ||||
|   u8x8.clearDisplay(); | ||||
|   u8x8.drawString(4, 4, "Souko's"); | ||||
|   u8x8.drawString(1, 5, "ChainLube Mk1"); | ||||
|   u8x8.refreshDisplay(); | ||||
|  | ||||
|   FastLED.addLeds<WS2811, GPIO_LED, GRB>(leds, 1); // GRB ordering is assumed | ||||
| } | ||||
|  | ||||
| void loop() | ||||
| { | ||||
|   leds[0] = digitalRead(GPIO_BUTTON) ? CRGB::Green : CRGB::Red; | ||||
|  | ||||
|   FastLED.show(); | ||||
|   ArduinoOTA.handle(); | ||||
|   Debug.handle(); | ||||
|   yield(); | ||||
| } | ||||
|  | ||||
| String IpAddress2String(const IPAddress &ipAddress) | ||||
| { | ||||
|   return String(ipAddress[0]) + String(".") + | ||||
|          String(ipAddress[1]) + String(".") + | ||||
|          String(ipAddress[2]) + String(".") + | ||||
|          String(ipAddress[3]); | ||||
| } | ||||
|  | ||||
| void processCmdRemoteDebug() | ||||
| { | ||||
|   String lastCmd = Debug.getLastCommand(); | ||||
|  | ||||
|   if (lastCmd == "sysinfo") | ||||
|     RemotDebug_printSystemInfo(); | ||||
|   else if (lastCmd == "netinfo") | ||||
|     RemoteDebug_printWifiInfo(); | ||||
| } | ||||
|  | ||||
| void RemotDebug_printSystemInfo() | ||||
| { | ||||
|   debugA("Souko's ChainOiler Mk1"); | ||||
|   debugA("Hostname: %s", DeviceName); | ||||
|  | ||||
|   debugA("Sdk version: %s", ESP.getSdkVersion()); | ||||
|   debugA("Core Version: %s", ESP.getCoreVersion().c_str()); | ||||
|   debugA("Boot Version: %u", ESP.getBootVersion()); | ||||
|   debugA("Boot Mode: %u", ESP.getBootMode()); | ||||
|   debugA("CPU Frequency: %u MHz", ESP.getCpuFreqMHz()); | ||||
|   debugA("Reset reason: %s", ESP.getResetReason().c_str()); | ||||
| } | ||||
|  | ||||
| void RemoteDebug_printWifiInfo() | ||||
| { | ||||
| } | ||||
							
								
								
									
										2
									
								
								Software/ChainLube/src/rmtdbghelp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								Software/ChainLube/src/rmtdbghelp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| const char helpCmd[] = "sysinfo - System Info\r\n" | ||||
|                        "netinfo - WiFi Info\r\n"; | ||||
							
								
								
									
										172
									
								
								Software/ChainLube/src/webui.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								Software/ChainLube/src/webui.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | ||||
| #include <Arduino.h> | ||||
| #include <ESPUI.h> | ||||
|  | ||||
| uint16_t button1; | ||||
| uint16_t switchOne; | ||||
| uint16_t status; | ||||
|  | ||||
| void initWebUI(); | ||||
|  | ||||
| void numberCall( Control* sender, int type ) { | ||||
|   Serial.println( sender->value ); | ||||
| } | ||||
|  | ||||
| void textCall( Control* sender, int type ) { | ||||
|   Serial.print("Text: ID: "); | ||||
|   Serial.print(sender->id); | ||||
|   Serial.print(", Value: "); | ||||
|   Serial.println( sender->value );} | ||||
|  | ||||
| void slider( Control* sender, int type ) { | ||||
|   Serial.print("Slider: ID: "); | ||||
|   Serial.print(sender->id); | ||||
|   Serial.print(", Value: "); | ||||
|   Serial.println( sender->value );} | ||||
|  | ||||
| void buttonCallback( Control* sender, int type ) { | ||||
|   switch ( type ) { | ||||
|     case B_DOWN: | ||||
|       Serial.println( "Button DOWN" ); | ||||
|       break; | ||||
|  | ||||
|     case B_UP: | ||||
|       Serial.println( "Button UP" ); | ||||
|       break; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void buttonExample( Control* sender, int type ) { | ||||
|   switch ( type ) { | ||||
|     case B_DOWN: | ||||
|       Serial.println( "Status: Start" ); | ||||
|       ESPUI.updateControlValue( status, "Start" ); | ||||
|      | ||||
|       ESPUI.getControl( button1 )->color = ControlColor::Carrot; | ||||
|       ESPUI.updateControl( button1 ); | ||||
|       break; | ||||
|  | ||||
|     case B_UP: | ||||
|       Serial.println( "Status: Stop" ); | ||||
|       ESPUI.updateControlValue( status, "Stop" ); | ||||
|     | ||||
|       ESPUI.getControl( button1 )->color = ControlColor::Peterriver; | ||||
|       ESPUI.updateControl( button1 ); | ||||
|       break; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void padExample( Control* sender, int value ) { | ||||
|   switch ( value ) { | ||||
|     case P_LEFT_DOWN: | ||||
|       Serial.print( "left down" ); | ||||
|       break; | ||||
|  | ||||
|     case P_LEFT_UP: | ||||
|       Serial.print( "left up" ); | ||||
|       break; | ||||
|  | ||||
|     case P_RIGHT_DOWN: | ||||
|       Serial.print( "right down" ); | ||||
|       break; | ||||
|  | ||||
|     case P_RIGHT_UP: | ||||
|       Serial.print( "right up" ); | ||||
|       break; | ||||
|  | ||||
|     case P_FOR_DOWN: | ||||
|       Serial.print( "for down" ); | ||||
|       break; | ||||
|  | ||||
|     case P_FOR_UP: | ||||
|       Serial.print( "for up" ); | ||||
|       break; | ||||
|  | ||||
|     case P_BACK_DOWN: | ||||
|       Serial.print( "back down" ); | ||||
|       break; | ||||
|  | ||||
|     case P_BACK_UP: | ||||
|       Serial.print( "back up" ); | ||||
|       break; | ||||
|  | ||||
|     case P_CENTER_DOWN: | ||||
|       Serial.print( "center down" ); | ||||
|       break; | ||||
|  | ||||
|     case P_CENTER_UP: | ||||
|       Serial.print( "center up" ); | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   Serial.print( " " ); | ||||
|   Serial.println( sender->id ); | ||||
| } | ||||
|  | ||||
| void switchExample( Control* sender, int value ) { | ||||
|   switch ( value ) { | ||||
|     case S_ACTIVE: | ||||
|       Serial.print( "Active:" ); | ||||
|       break; | ||||
|  | ||||
|     case S_INACTIVE: | ||||
|       Serial.print( "Inactive" ); | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   Serial.print( " " ); | ||||
|   Serial.println( sender->id ); | ||||
| } | ||||
|  | ||||
| void selectExample( Control* sender, int value ) { | ||||
|   Serial.print("Select: ID: "); | ||||
|   Serial.print(sender->id); | ||||
|   Serial.print(", Value: "); | ||||
|   Serial.println( sender->value ); | ||||
| } | ||||
|  | ||||
| void otherSwitchExample( Control* sender, int value ) { | ||||
|   switch ( value ) { | ||||
|     case S_ACTIVE: | ||||
|       Serial.print( "Active:" ); | ||||
|       break; | ||||
|  | ||||
|     case S_INACTIVE: | ||||
|       Serial.print( "Inactive" ); | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   Serial.print( " " ); | ||||
|   Serial.println( sender->id ); | ||||
| } | ||||
|  | ||||
| void initWebUI (void){ | ||||
|  | ||||
|   uint16_t tab1 = ESPUI.addControl( ControlType::Tab, "Settings 1", "Settings 1" ); | ||||
|   uint16_t tab2 = ESPUI.addControl( ControlType::Tab, "Settings 2", "Settings 2" ); | ||||
|   uint16_t tab3 = ESPUI.addControl( ControlType::Tab, "Settings 3", "Settings 3" ); | ||||
|  | ||||
|   // shown above all tabs | ||||
|   status = ESPUI.addControl( ControlType::Label, "Status:", "Stop", ControlColor::Turquoise ); | ||||
|  | ||||
|   uint16_t select1 = ESPUI.addControl( ControlType::Select, "Select:", "", ControlColor::Alizarin, tab1, &selectExample ); | ||||
|   ESPUI.addControl( ControlType::Option, "Option1", "Opt1", ControlColor::Alizarin, select1 ); | ||||
|   ESPUI.addControl( ControlType::Option, "Option2", "Opt2", ControlColor::Alizarin, select1 ); | ||||
|   ESPUI.addControl( ControlType::Option, "Option3", "Opt3", ControlColor::Alizarin, select1 ); | ||||
|    | ||||
|   ESPUI.addControl( ControlType::Text, "Text Test:", "a Text Field", ControlColor::Alizarin, tab1, &textCall ); | ||||
|  | ||||
|   // tabbed controls | ||||
|   ESPUI.addControl( ControlType::Label, "Millis:", "0", ControlColor::Emerald, tab1 ); | ||||
|   button1 = ESPUI.addControl( ControlType::Button, "Push Button", "Press", ControlColor::Peterriver, tab1, &buttonCallback ); | ||||
|   ESPUI.addControl( ControlType::Button, "Other Button", "Press", ControlColor::Wetasphalt, tab1, &buttonExample ); | ||||
|   ESPUI.addControl( ControlType::PadWithCenter, "Pad with center", "", ControlColor::Sunflower, tab2, &padExample ); | ||||
|   ESPUI.addControl( ControlType::Pad, "Pad without center", "", ControlColor::Carrot, tab3, &padExample ); | ||||
|   switchOne = ESPUI.addControl( ControlType::Switcher, "Switch one", "", ControlColor::Alizarin, tab3, &switchExample ); | ||||
|   ESPUI.addControl( ControlType::Switcher, "Switch two", "", ControlColor::None, tab3, &otherSwitchExample ); | ||||
|   ESPUI.addControl( ControlType::Slider, "Slider one", "30", ControlColor::Alizarin, tab1, &slider ); | ||||
|   ESPUI.addControl( ControlType::Slider, "Slider two", "100", ControlColor::Alizarin, tab3, &slider ); | ||||
|   ESPUI.addControl( ControlType::Number, "Number:", "50", ControlColor::Alizarin, tab3, &numberCall ); | ||||
|  | ||||
|   ESPUI.begin("ESPUI Control"); | ||||
| } | ||||
|  | ||||
							
								
								
									
										11
									
								
								Software/ChainLube/test/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Software/ChainLube/test/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
|  | ||||
| This directory is intended for PlatformIO Unit Testing 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/page/plus/unit-testing.html | ||||
							
								
								
									
										5
									
								
								Software/ChainLube/wifi_credentials.example.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Software/ChainLube/wifi_credentials.example.ini
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| [common] | ||||
| build_flags = | ||||
|   -DWIFI_SSID='"Wifi-SSID"' | ||||
|   -DWIFI_PASSWORD='"Wifi-Password"' | ||||
|   -DADMIN_PASS='"adminpass"' | ||||
		Reference in New Issue
	
	Block a user