From e9683b6a161d7dff13e932cb20445b56a9a7f7af Mon Sep 17 00:00:00 2001 From: Jaro Date: Fri, 9 Oct 2020 13:22:22 +0200 Subject: [PATCH] Init repo --- .gitignore | 5 + .travis.yml | 67 +++++++++++++ .vscode/extensions.json | 7 ++ include/README | 39 ++++++++ lib/README | 46 +++++++++ platformio.ini | 16 +++ src/main.cpp | 217 ++++++++++++++++++++++++++++++++++++++++ test/README | 11 ++ 8 files changed, 408 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 .vscode/extensions.json create mode 100644 include/README create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 src/main.cpp create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7c486f1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,67 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < https://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < https://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < https://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choose one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + + +# +# Template #1: General project. Test it using existing `platformio.ini`. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to be used as a library with examples. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# env: +# - PLATFORMIO_CI_SRC=path/to/test/file.c +# - PLATFORMIO_CI_SRC=examples/file.ino +# - PLATFORMIO_CI_SRC=path/to/test/directory +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..e80666b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // 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 new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -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 diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -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 +#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 new file mode 100644 index 0000000..c69537b --- /dev/null +++ b/platformio.ini @@ -0,0 +1,16 @@ +; 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:esp32doit-devkit-v1] +platform = espressif32 +board = esp32doit-devkit-v1 +framework = arduino +monitor_port = COM[13] +monitor_speed = 115200 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..7f0a44f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,217 @@ +/** + * IotWebConf03CustomParameters.ino -- IotWebConf is an ESP8266/ESP32 + * non blocking WiFi/AP web configuration library for Arduino. + * https://github.com/prampec/IotWebConf + * + * Copyright (C) 2018 Balazs Kelemen + * + * This software may be modified and distributed under the terms + * of the MIT license. See the LICENSE file for details. + */ + +/** + * Example: Custom parameters + * Description: + * In this example it is shown how to attach your custom parameters + * to the config portal. Your parameters will be maintained by + * IotWebConf. This means, they will be loaded from/saved to EEPROM, + * and will appear in the config portal. + * Note the configSaved and formValidator callbacks! + * (See previous examples for more details!) + * + * Hardware setup for this example: + * - An LED is attached to LED_BUILTIN pin with setup On=LOW. + * - [Optional] A push button is attached to pin D2, the other leg of the + * button should be attached to GND. + */ + +#include +#include + +WiFiUDP udp; + +// -- Initial name of the Thing. Used e.g. as SSID of the own Access Point. +const char thingName[] = "BADBell"; + +// -- Initial password to connect to the Thing, when it creates an own Access Point. +const char wifiInitialApPassword[] = "bell4home"; + +#define STRING_LEN 128 +#define NUMBER_LEN 32 + +// -- Configuration specific key. The value should be modified if config structure was changed. +#define CONFIG_VERSION "dem2" + +// -- When CONFIG_PIN is pulled to ground on startup, the Thing will use the initial +// password to buld an AP. (E.g. in case of lost password) +#define CONFIG_PIN 2 + +// -- Status indicator pin. +// First it will light up (kept LOW), on Wifi connection it will blink, +// when connected to the Wifi it will turn off (kept HIGH). +#define STATUS_PIN LED_BUILTIN + +#define BELL_PIN 12 // Pin 12 as default +#define MINIMAL_GAP 30*1000 // 30 seconds between rings + +int val = 0; // value from pin +unsigned long last_low = 0; // time of uptime + + +// -- Callback method declarations. +void configSaved(); +boolean formValidator(); +void handleRoot(); +void sendRingPacket(); +void sendPacket(); + +DNSServer dnsServer; +WebServer server(80); + +char ipParamValue[STRING_LEN]; +char portParamValue[NUMBER_LEN]; +char bellParamValue[NUMBER_LEN]; + +IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION); +IotWebConfParameter ipParam = IotWebConfParameter("Mulicast ip param", "ipParam", ipParamValue, STRING_LEN,"text","224.1.2.3","224.1.2.3",NULL); +IotWebConfSeparator separator1 = IotWebConfSeparator(); +IotWebConfParameter portParam = IotWebConfParameter("Port param", "portParam", portParamValue, NUMBER_LEN, "number", "1025..65535", "1234", "min='1025' max='65535' step='1'"); +// -- We can add a legend to the separator +IotWebConfSeparator separator2 = IotWebConfSeparator("Calibration factor"); +IotWebConfParameter bellParam = IotWebConfParameter("Bell number param", "bellParam", bellParamValue, NUMBER_LEN, "number", "1", "1", "step='1'"); + +void setup() +{ + Serial.begin(115200); + Serial.println(); + Serial.println("Starting up..."); + +// iotWebConf.setStatusPin(STATUS_PIN); +// iotWebConf.setConfigPin(CONFIG_PIN); + iotWebConf.addParameter(&ipParam); + iotWebConf.addParameter(&separator1); + iotWebConf.addParameter(&portParam); + iotWebConf.addParameter(&separator2); + iotWebConf.addParameter(&bellParam); + iotWebConf.setConfigSavedCallback(&configSaved); + iotWebConf.setFormValidator(&formValidator); + iotWebConf.getApTimeoutParameter()->visible = true; + + // -- Initializing the configuration. + iotWebConf.init(); + + // -- Set up required URL handlers on the web server. + server.on("/", handleRoot); + server.on("/ring", sendRingPacket); + server.on("/config", []{ iotWebConf.handleConfig(); }); + server.onNotFound([](){ iotWebConf.handleNotFound(); }); + + pinMode(BELL_PIN, INPUT); + digitalWrite(BELL_PIN, LOW); + + Serial.println("Ready."); +} + +void loop() +{ + // -- doLoop should be called as frequently as possible. + iotWebConf.doLoop(); + val = digitalRead(BELL_PIN); + if (val == 1) { + if (millis() - last_low > MINIMAL_GAP || last_low == 0) sendPacket(); + else { + Serial.println("Minimal gap not meeted"); + delay(500); + } + last_low = millis(); + } +} + +/** + * Handle web requests to "/" path. + */ +void handleRoot() +{ + // -- Let IotWebConf test and handle captive portal requests. + if (iotWebConf.handleCaptivePortal()) + { + // -- Captive portal request were already served. + return; + } + String s = ""; + s += "WIFI BELL FOR BAD HOMEBell for Wifi"; + s += "
    "; + s += "
  • Multicast IP value: "; + s += ipParamValue; + s += "
  • Port of multicast message: "; + s += atoi(portParamValue); + s += "
  • Bell number: "; + s += atoi(bellParamValue); + s += "
"; + s += "Go to configure page to change values.
"; + s += "Go to ring Send ring packet."; + s += "\n"; + + server.send(200, "text/html", s); +} + +void sendPacket() +{ + IPAddress multicast; + multicast.fromString(ipParamValue); + + + Serial.print("sendUDP : "); + + // convert string to char array + char msg[255]; + sprintf(msg,"BELL:%s",bellParamValue); + Serial.println(msg); + + udp.beginMulticast(multicast, atoi(portParamValue)); + udp.beginMulticastPacket(); + udp.write((uint8_t *)msg,7); + udp.endPacket(); + udp.flush(); + udp.stop(); + +} + +void sendRingPacket() +{ + sendPacket(); + + server.send(200, "text/html", "Packet sended"); +} + +void configSaved() +{ + Serial.println("Configuration was updated."); +} + +boolean formValidator() +{ + Serial.println("Validating form."); + boolean valid = true; + + // match state object + MatchState ms; + String ip = server.arg(ipParam.getId()); + char ips[128]; + + // what we are searching (the target) + ip.toCharArray(ips,128); + ms.Target (ips); // set its address + Serial.println (ips); + + char result = ms.Match ("[0-9\\.]+"); + //char result = ms.Match ("(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"); + Serial.println(result); + if (result <= 0) + { + ipParam.errorMessage = "Please provide IP addrerss!"; + valid = false; + } + + return valid; +} diff --git a/test/README b/test/README new file mode 100644 index 0000000..df5066e --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO 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 PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html