From aa53b5aca17b0cebce65be36104bb6160ec54901 Mon Sep 17 00:00:00 2001 From: Jaro Date: Fri, 15 Oct 2021 18:22:06 +0200 Subject: [PATCH] speed 460800, commands bright, satur, contr --- .gitignore | 4 + .vscode/extensions.json | 14 +- include/README | 78 +++---- lib/README | 92 ++++---- platformio.ini | 38 +-- read.sh | 106 ++++----- src/main.cpp | 497 +++++++++++++++++++++++----------------- test/README | 22 +- 8 files changed, 463 insertions(+), 388 deletions(-) diff --git a/.gitignore b/.gitignore index 89cc49c..36de5d4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch +src/.vscode/c_cpp_properties.json +.vscode/extensions.json +.vscode/extensions.json +platformio.ini diff --git a/.vscode/extensions.json b/.vscode/extensions.json index e80666b..0f0d740 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,7 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "platformio.platformio-ide" - ] -} +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/include/README b/include/README index 194dcd4..45496b1 100644 --- a/include/README +++ b/include/README @@ -1,39 +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 + +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 diff --git a/lib/README b/lib/README index 6debab1..8c9c29c 100644 --- a/lib/README +++ b/lib/README @@ -1,46 +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 -#include - -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 + +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 +#include + +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 diff --git a/platformio.ini b/platformio.ini index be2713c..f432cb6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,18 +1,20 @@ -; 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:esp32cam] -platform = espressif32 -board = esp32cam -framework = arduino -monitor_port = COM[13678] -monitor_speed = 115200 -lib_deps = - enviromonitor/BME280_Light@0.0.0-alpha+sha.600667f3a6 +; 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:esp32cam] +platform = espressif32 +board = esp32cam +framework = arduino +monitor_port = COM[13678] +monitor_speed = 115200 +monitor_rts = 0 +monitor_dtr = 0 +lib_deps = + enviromonitor/BME280_Light@0.0.0-alpha+sha.600667f3a6 diff --git a/read.sh b/read.sh index f718888..ce8198e 100644 --- a/read.sh +++ b/read.sh @@ -1,53 +1,53 @@ -#!/bin/bash - -host="172.16.1.254" -topic="home/sensor/strecha/bme280" -url="https://meranie.bh.ttx.sk/upload/image" -tty="/dev/ttyUSB0" - -cd /tmp - -while true -do - while true - do - echo "measure" - - input= - while [[ $input = "" ]]; do - read input - done - read t h p <<< $input - - IFS="=" - read v k <<< $t - echo $k > /dev/tty - t=$k - - read v k <<< $h - echo $k > /dev/tty - h=$k - - read v k <<< $p - echo $k > /dev/tty - p=$k - - unset IFS - - break - done <$ttyname >$ttyname - - mosquitto_pub -h $host -t $topic/temperature -m N:$t - mosquitto_pub -h $host -t $topic/humidity -m N:$h - mosquitto_pub -h $host -t $topic/pressure -m N:$p - - echo "capture" > $ttyname - echo "rb" > $ttyname - rb --ymodem <$ttyname >$ttyname - - echo "free" > $ttyname - - curl -v -X POST -F "submit=OK" -F "file=@camera.jpg" $url - rm camera.jpg - sleep 300 -done +#!/bin/bash + +host="172.16.1.254" +topic="home/sensor/strecha/bme280" +url="https://meranie.bh.ttx.sk/upload/image" +tty="/dev/ttyUSB0" + +cd /tmp + +while true +do + while true + do + echo "measure" + + input= + while [[ $input = "" ]]; do + read input + done + read t h p <<< $input + + IFS="=" + read v k <<< $t + echo $k > /dev/tty + t=$k + + read v k <<< $h + echo $k > /dev/tty + h=$k + + read v k <<< $p + echo $k > /dev/tty + p=$k + + unset IFS + + break + done <$ttyname >$ttyname + + mosquitto_pub -h $host -t $topic/temperature -m N:$t + mosquitto_pub -h $host -t $topic/humidity -m N:$h + mosquitto_pub -h $host -t $topic/pressure -m N:$p + + echo "capture" > $ttyname + echo "rb" > $ttyname + rb --ymodem <$ttyname >$ttyname + + echo "free" > $ttyname + + curl -v -X POST -F "submit=OK" -F "file=@camera.jpg" $url + rm camera.jpg + sleep 300 +done diff --git a/src/main.cpp b/src/main.cpp index 9edc357..9255035 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,215 +1,284 @@ -#include -#include -#include "esp_camera.h" -#include "Arduino.h" -#include "soc/soc.h" // Disable brownour problems -#include "soc/rtc_cntl_reg.h" // Disable brownour problems -#include "driver/rtc_io.h" -#include // read and write from flash memory -#include -#include // import BME280 template library - -char bufout[10]; -BME280<> BMESensor; - -// define the number of bytes you want to access -#define EEPROM_SIZE 1 - -// Pin definition for CAMERA_MODEL_AI_THINKER -#define PWDN_GPIO_NUM 32 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 0 -#define SIOD_GPIO_NUM 26 -#define SIOC_GPIO_NUM 27 - -#define Y9_GPIO_NUM 35 -#define Y8_GPIO_NUM 34 -#define Y7_GPIO_NUM 39 -#define Y6_GPIO_NUM 36 -#define Y5_GPIO_NUM 21 -#define Y4_GPIO_NUM 19 -#define Y3_GPIO_NUM 18 -#define Y2_GPIO_NUM 5 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 23 -#define PCLK_GPIO_NUM 22 - -int pictureNumber = 0; -camera_fb_t * fb = NULL; -XModem xmodem(&Serial, ModeYModem); - -typedef void (*action_func_t)(char *aLine); - -typedef struct { - char command[7+1]; // max 7 characters plus '\0' terminator - action_func_t action; -} command_action_t; - - -void toLower(char *s) { - while (*s) { - if (isupper(*s)) { - *s += 0x20; - } - s++; - } -} - -void print_commands(char *aLine); - -void reboot_esp32(char *aLine) -{ - Serial.println("[OK] GOING TO REBOOT"); - delay(1000); - ESP.restart(); -} - -void recv_ymodem(char *aLine) -{ - xmodem.sendFile(fb->buf, fb->len, "camera.jpg"); -} - -void capture_image(char *aLine) -{ - fb = esp_camera_fb_get(); - Serial.println("[OK] CAPTURED IMAGE"); -} - -void free_image(char *aLine) -{ - esp_camera_fb_return(fb); - Serial.println("[OK] FREE CAPTURED IMAGE"); -} - -void print_measurement(char *aLine) -{ - BMESensor.refresh(); // read current sensor dat - Serial.printf("temperature=%.2f humidity=%.2f pressure=%.2f\n",BMESensor.temperature,BMESensor.humidity,BMESensor.pressure / 100.0F); - return; -} - -const command_action_t commands[] = { - // Name of command user types, function that implements the command. - {"reboot", reboot_esp32}, - {"capture", capture_image}, - {"free", free_image}, - {"measure", print_measurement}, - {"rb", recv_ymodem}, - {"help", print_commands}, - {"?", print_commands}, -}; - -void print_commands(char *aLine) { - Serial.print(commands[0].command); - for (size_t i = 1; i < sizeof(commands)/sizeof(commands[0]); i++) { - Serial.print(','); Serial.print(commands[i].command); - } - Serial.println(); -} - - -void execute(char *aLine) { - if (aLine == NULL || *aLine == '\0') return; - char *cmd = strtok(aLine, " \t"); - if (cmd == NULL || *cmd == '\0') return; - toLower(cmd); - for (size_t i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) { - if (strcmp(cmd, commands[i].command) == 0) { - commands[i].action(aLine); - return; - } - } - Serial.println("command not found"); -} - - -void setup() { - WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector - - Serial.begin(115200); - while (!Serial) { - ; // wait for serial port to connect. Needed for Leonardo only - } - -camera_config_t config; - config.ledc_channel = LEDC_CHANNEL_0; - config.ledc_timer = LEDC_TIMER_0; - config.pin_d0 = Y2_GPIO_NUM; - config.pin_d1 = Y3_GPIO_NUM; - config.pin_d2 = Y4_GPIO_NUM; - config.pin_d3 = Y5_GPIO_NUM; - config.pin_d4 = Y6_GPIO_NUM; - config.pin_d5 = Y7_GPIO_NUM; - config.pin_d6 = Y8_GPIO_NUM; - config.pin_d7 = Y9_GPIO_NUM; - config.pin_xclk = XCLK_GPIO_NUM; - config.pin_pclk = PCLK_GPIO_NUM; - config.pin_vsync = VSYNC_GPIO_NUM; - config.pin_href = HREF_GPIO_NUM; - config.pin_sscb_sda = SIOD_GPIO_NUM; - config.pin_sscb_scl = SIOC_GPIO_NUM; - config.pin_pwdn = PWDN_GPIO_NUM; - config.pin_reset = RESET_GPIO_NUM; - config.xclk_freq_hz = 20000000; - config.pixel_format = PIXFORMAT_JPEG; - - if(psramFound()){ - config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA - config.jpeg_quality = 10; - config.fb_count = 2; - } else { - config.frame_size = FRAMESIZE_SVGA; - config.jpeg_quality = 12; - config.fb_count = 1; - } - -// Init Camera - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - Serial.printf("Camera init failed with error 0x%x", err); - return; - } - - // Take Picture with Camera - fb = esp_camera_fb_get(); - if(!fb) { - Serial.println("Camera capture failed"); - return; - } - esp_camera_fb_return(fb); - - Wire.begin(14,15); - - BMESensor.begin(); - -} - -uint8_t bytesIn; -char aLine[80+1]; - - -void loop() { - if (Serial.available() > 0) { - int b = Serial.read(); - if (b != -1) { - switch (b) { - case '\n': - if (bytesIn && aLine[bytesIn-1] == '\0') break; - case '\r': - Serial.println(); - aLine[bytesIn] = '\0'; - execute(aLine); - bytesIn = 0; - break; - default: - aLine[bytesIn++] = (char)b; - if (bytesIn >= sizeof(aLine)-1) { - aLine[bytesIn] = '\0'; - execute(aLine); - bytesIn = 0; - } - break; - } - } - } +#include +#include +#include "esp_camera.h" +#include "Arduino.h" +#include "soc/soc.h" // Disable brownour problems +#include "soc/rtc_cntl_reg.h" // Disable brownour problems +#include "driver/rtc_io.h" +#include // read and write from flash memory +#include +#include // import BME280 template library + +char bufout[10]; +BME280<> BMESensor; + +// define the number of bytes you want to access +#define EEPROM_SIZE 1 + +// Pin definition for CAMERA_MODEL_AI_THINKER +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +int pictureNumber = 0; +camera_fb_t * fb = NULL; +XModem xmodem(&Serial, ModeYModem); + +typedef void (*action_func_t)(char *aLine); + +typedef struct { + char command[7+1]; // max 7 characters plus '\0' terminator + action_func_t action; +} command_action_t; + + +void toLower(char *s) { + while (*s) { + if (isupper(*s)) { + *s += 0x20; + } + s++; + } +} + +void print_commands(char *aLine); + +void reboot_esp32(char *aLine) +{ + Serial.println("[OK] GOING TO REBOOT"); + delay(1000); + ESP.restart(); +} + +void set_speed(char *aLine) +{ + char *cmd = strtok(aLine, " \t"); + char *speed = strtok(NULL," \t"); + Serial.updateBaudRate(strtoul(speed,nullptr,10)); + Serial.print("[OK] SETTING SPEED"); +} + + +void capture_image(char *aLine) +{ + fb = esp_camera_fb_get(); + Serial.println("[OK] CAPTURED IMAGE"); +} + +void free_image(char *aLine) +{ + esp_camera_fb_return(fb); + Serial.println("[OK] FREE CAPTURED IMAGE"); +} + +void recv_ymodem(char *aLine) +{ + xmodem.sendFile(fb->buf, fb->len, "camera.jpg"); + Serial.println("[OK] SEND IMAGE"); + free_image(aLine); +} + +void print_measurement(char *aLine) +{ + BMESensor.refresh(); // read current sensor dat + Serial.printf("temperature=%.2f humidity=%.2f pressure=%.2f\n",BMESensor.temperature,BMESensor.humidity,BMESensor.pressure / 100.0F); + return; +} + +void set_brightness(char *aLine) +{ + char *cmd = strtok(aLine, " \t"); + char *str = strtok(NULL," \t"); + sensor_t * s = esp_camera_sensor_get(); + s->set_brightness(s, strtol(str,nullptr,10)); // -2 to 2 + Serial.print("[OK] SETTING BRIGHTNESS"); +} + +void set_saturation(char *aLine) +{ + char *cmd = strtok(aLine, " \t"); + char *str = strtok(NULL," \t"); + sensor_t * s = esp_camera_sensor_get(); + s->set_saturation(s, strtol(str,nullptr,10)); // -2 to 2 + Serial.print("[OK] SETTING SATURATION"); +} + +void set_contrast(char *aLine) +{ + char *cmd = strtok(aLine, " \t"); + char *str = strtok(NULL," \t"); + sensor_t * s = esp_camera_sensor_get(); + s->set_contrast(s, strtol(str,nullptr,10)); // -2 to 2 + Serial.print("[OK] SETTING CONTRAST"); +} + +const command_action_t commands[] = { + // Name of command user types, function that implements the command. + {"reboot", reboot_esp32}, + {"bright",set_brightness}, + {"satur",set_saturation}, + {"contr",set_contrast}, + {"speed", set_speed}, + {"capture", capture_image}, + {"free", free_image}, + {"measure", print_measurement}, + {"rb", recv_ymodem}, + {"help", print_commands}, + {"?", print_commands}, +}; + +void print_commands(char *aLine) { + Serial.print(commands[0].command); + for (size_t i = 1; i < sizeof(commands)/sizeof(commands[0]); i++) { + Serial.print(','); Serial.print(commands[i].command); + } + Serial.println(); +} + + +void execute(char *aLine) { + if (aLine == NULL || *aLine == '\0') return; + char *cmd = strtok(aLine, " \t"); + if (cmd == NULL || *cmd == '\0') return; + toLower(cmd); + for (size_t i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) { + if (strcmp(cmd, commands[i].command) == 0) { + commands[i].action(aLine); + return; + } + } + Serial.println("command not found"); +} + + +void setup() { + WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector + + Serial.begin(460800); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + +camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sscb_sda = SIOD_GPIO_NUM; + config.pin_sscb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.pixel_format = PIXFORMAT_JPEG; + + if(psramFound()){ + config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA + config.jpeg_quality = 7; + config.fb_count = 2; + } else { + config.frame_size = FRAMESIZE_SVGA; + config.jpeg_quality = 10; + config.fb_count = 1; + } + +// Init Camera + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return; + } + + sensor_t * s = esp_camera_sensor_get(); + s->set_brightness(s, 0); // -2 to 2 + s->set_contrast(s, 0); // -2 to 2 + s->set_saturation(s, 0); // -2 to 2 + s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) + s->set_whitebal(s, 1); // 0 = disable , 1 = enable + s->set_awb_gain(s, 1); // 0 = disable , 1 = enable + s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) + s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable + s->set_aec2(s, 0); // 0 = disable , 1 = enable + s->set_ae_level(s, 0); // -2 to 2 + s->set_aec_value(s, 300); // 0 to 1200 + s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable + s->set_agc_gain(s, 0); // 0 to 30 + s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 + s->set_bpc(s, 0); // 0 = disable , 1 = enable + s->set_wpc(s, 1); // 0 = disable , 1 = enable + s->set_raw_gma(s, 1); // 0 = disable , 1 = enable + s->set_lenc(s, 1); // 0 = disable , 1 = enable + s->set_hmirror(s, 0); // 0 = disable , 1 = enable + s->set_vflip(s, 0); // 0 = disable , 1 = enable + s->set_dcw(s, 1); // 0 = disable , 1 = enable + s->set_colorbar(s, 0); // 0 = disable , 1 = enable + + + // Take Picture with Camera + fb = esp_camera_fb_get(); + if(!fb) { + Serial.println("Camera capture failed"); + return; + } + esp_camera_fb_return(fb); + + Wire.begin(14,15); + + BMESensor.begin(); + + print_commands(""); + +} + +uint8_t bytesIn; +char aLine[80+1]; + + +void loop() { + if (Serial.available() > 0) { + int b = Serial.read(); + if (b != -1) { + switch (b) { + case '\n': + if (bytesIn && aLine[bytesIn-1] == '\0') break; + case '\r': + Serial.println(); + aLine[bytesIn] = '\0'; + execute(aLine); + bytesIn = 0; + break; + default: + aLine[bytesIn++] = (char)b; + if (bytesIn >= sizeof(aLine)-1) { + aLine[bytesIn] = '\0'; + execute(aLine); + bytesIn = 0; + } + break; + } + } + } } \ No newline at end of file diff --git a/test/README b/test/README index b94d089..e7d1588 100644 --- a/test/README +++ b/test/README @@ -1,11 +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 + +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