diff --git a/hardware/gps/Fragments/log_to_console.c b/hardware/gps/Fragments/log_to_console.c
new file mode 100644
index 00000000..aa5ef034
--- /dev/null
+++ b/hardware/gps/Fragments/log_to_console.c
@@ -0,0 +1,47 @@
+#include "esp_log.h"
+#include "driver/uart.h"
+
+static char tag[] = "gps";
+
+char *readLine(uart_port_t uart) {
+ static char line[256];
+ int size;
+ char *ptr = line;
+ while(1) {
+ size = uart_read_bytes(UART_NUM_1, (unsigned char *)ptr, 1, portMAX_DELAY);
+ if (size == 1) {
+ if (*ptr == '\n') {
+ *ptr = 0;
+ return line;
+ }
+ ptr++;
+ } // End of read a character
+ } // End of loop
+} // End of readLine
+
+void doGPS() {
+ ESP_LOGD(tag, ">> doGPS");
+ uart_config_t myUartConfig;
+ myUartConfig.baud_rate = 9600;
+ myUartConfig.data_bits = UART_DATA_8_BITS;
+ myUartConfig.parity = UART_PARITY_DISABLE;
+ myUartConfig.stop_bits = UART_STOP_BITS_1;
+ myUartConfig.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
+ myUartConfig.rx_flow_ctrl_thresh = 120;
+
+ uart_param_config(UART_NUM_1, &myUartConfig);
+
+ uart_set_pin(UART_NUM_1,
+ UART_PIN_NO_CHANGE, // TX
+ 34, // RX
+ UART_PIN_NO_CHANGE, // RTS
+ UART_PIN_NO_CHANGE // CTS
+ );
+
+ uart_driver_install(UART_NUM_1, 2048, 2048, 10, 17, NULL);
+
+ while(1) {
+ char *line = readLine(UART_NUM_1);
+ ESP_LOGD(tag, "%s", line);
+ }
+}
diff --git a/hardware/gps/gps/.cproject b/hardware/gps/gps/.cproject
new file mode 100644
index 00000000..96984ffc
--- /dev/null
+++ b/hardware/gps/gps/.cproject
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ make
+
+ all
+ true
+ true
+ true
+
+
+
+
diff --git a/hardware/gps/gps/.gitignore b/hardware/gps/gps/.gitignore
new file mode 100644
index 00000000..13fa9a7b
--- /dev/null
+++ b/hardware/gps/gps/.gitignore
@@ -0,0 +1,2 @@
+build/
+sdkconfig.old
diff --git a/hardware/gps/gps/.project b/hardware/gps/gps/.project
new file mode 100644
index 00000000..6327e038
--- /dev/null
+++ b/hardware/gps/gps/.project
@@ -0,0 +1,26 @@
+
+
+ gps
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/hardware/gps/gps/LICENSE b/hardware/gps/gps/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/hardware/gps/gps/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/hardware/gps/gps/Makefile b/hardware/gps/gps/Makefile
new file mode 100644
index 00000000..9f2c3278
--- /dev/null
+++ b/hardware/gps/gps/Makefile
@@ -0,0 +1,9 @@
+#
+# This is a project Makefile. It is assumed the directory this Makefile resides in is a
+# project subdirectory.
+#
+
+PROJECT_NAME := app-template
+
+include $(IDF_PATH)/make/project.mk
+
diff --git a/hardware/gps/gps/README.rst b/hardware/gps/gps/README.rst
new file mode 100644
index 00000000..b98c108c
--- /dev/null
+++ b/hardware/gps/gps/README.rst
@@ -0,0 +1,12 @@
+ESP-IDF template app
+====================
+
+This is a template application to be used with `Espressif IoT Development Framework`_ (ESP-IDF).
+
+Please check ESP-IDF docs for getting started instructions.
+
+Code in this repository is Copyright (C) 2016 Espressif Systems, licensed under the Apache License 2.0 as described in the file LICENSE.
+
+.. _Espressif IoT Development Framework: https://github.com/espressif/esp-idf
+
+
diff --git a/hardware/gps/gps/components/minmea b/hardware/gps/gps/components/minmea
new file mode 160000
index 00000000..48ba9127
--- /dev/null
+++ b/hardware/gps/gps/components/minmea
@@ -0,0 +1 @@
+Subproject commit 48ba91275c57838150979eb2820b6e10f5a894b2
diff --git a/hardware/gps/gps/main/component.mk b/hardware/gps/gps/main/component.mk
new file mode 100644
index 00000000..24356f23
--- /dev/null
+++ b/hardware/gps/gps/main/component.mk
@@ -0,0 +1,10 @@
+#
+# Main Makefile. This is basically the same as a component makefile.
+#
+# This Makefile should, at the very least, just include $(SDK_PATH)/make/component_common.mk. By default,
+# this will take the sources in the src/ directory, compile them and link them into
+# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable,
+# please read the ESP-IDF documents if you need to do this.
+#
+
+include $(IDF_PATH)/make/component_common.mk
diff --git a/hardware/gps/gps/main/gps.c b/hardware/gps/gps/main/gps.c
new file mode 100644
index 00000000..917f412c
--- /dev/null
+++ b/hardware/gps/gps/main/gps.c
@@ -0,0 +1,84 @@
+#include "esp_log.h"
+#include "driver/uart.h"
+#include "minmea.h"
+
+#define GPS_TX_PIN (34)
+
+static char tag[] = "gps";
+
+char *readLine(uart_port_t uart) {
+ static char line[256];
+ int size;
+ char *ptr = line;
+ while(1) {
+ size = uart_read_bytes(UART_NUM_1, (unsigned char *)ptr, 1, portMAX_DELAY);
+ if (size == 1) {
+ if (*ptr == '\n') {
+ ptr++;
+ *ptr = 0;
+ return line;
+ }
+ ptr++;
+ } // End of read a character
+ } // End of loop
+} // End of readLine
+
+
+void doGPS() {
+ ESP_LOGD(tag, ">> doGPS");
+ uart_config_t myUartConfig;
+ myUartConfig.baud_rate = 9600;
+ myUartConfig.data_bits = UART_DATA_8_BITS;
+ myUartConfig.parity = UART_PARITY_DISABLE;
+ myUartConfig.stop_bits = UART_STOP_BITS_1;
+ myUartConfig.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
+ myUartConfig.rx_flow_ctrl_thresh = 120;
+
+ uart_param_config(UART_NUM_1, &myUartConfig);
+
+ uart_set_pin(UART_NUM_1,
+ UART_PIN_NO_CHANGE, // TX
+ GPS_TX_PIN, // RX
+ UART_PIN_NO_CHANGE, // RTS
+ UART_PIN_NO_CHANGE // CTS
+ );
+
+ uart_driver_install(UART_NUM_1, 2048, 2048, 10, 17, NULL);
+
+ while(1) {
+ char *line = readLine(UART_NUM_1);
+ //ESP_LOGD(tag, "%s", line);
+ switch(minmea_sentence_id(line, false)) {
+ case MINMEA_SENTENCE_RMC:
+ ESP_LOGD(tag, "Sentence - MINMEA_SENTENCE_RMC");
+ struct minmea_sentence_rmc frame;
+ if (minmea_parse_rmc(&frame, line)) {
+ ESP_LOGD(tag, "$xxRMC: raw coordinates and speed: (%d/%d,%d/%d) %d/%d",
+ frame.latitude.value, frame.latitude.scale,
+ frame.longitude.value, frame.longitude.scale,
+ frame.speed.value, frame.speed.scale);
+ ESP_LOGD(tag, "$xxRMC fixed-point coordinates and speed scaled to three decimal places: (%d,%d) %d",
+ minmea_rescale(&frame.latitude, 1000),
+ minmea_rescale(&frame.longitude, 1000),
+ minmea_rescale(&frame.speed, 1000));
+ ESP_LOGD(tag, "$xxRMC floating point degree coordinates and speed: (%f,%f) %f",
+ minmea_tocoord(&frame.latitude),
+ minmea_tocoord(&frame.longitude),
+ minmea_tofloat(&frame.speed));
+ }
+ else {
+ ESP_LOGD(tag, "$xxRMC sentence is not parsed\n");
+ }
+ break;
+ case MINMEA_SENTENCE_GGA:
+ //ESP_LOGD(tag, "Sentence - MINMEA_SENTENCE_GGA");
+ break;
+ case MINMEA_SENTENCE_GSV:
+ //ESP_LOGD(tag, "Sentence - MINMEA_SENTENCE_GSV");
+ break;
+ default:
+ //ESP_LOGD(tag, "Sentence - other");
+ break;
+ }
+ }
+} // doGPS
diff --git a/hardware/gps/gps/main/main.c b/hardware/gps/gps/main/main.c
new file mode 100644
index 00000000..eca32ac3
--- /dev/null
+++ b/hardware/gps/gps/main/main.c
@@ -0,0 +1,7 @@
+extern void doGPS();
+
+int app_main(void)
+{
+ doGPS();
+ return 0;
+}
diff --git a/hardware/gps/gps/sdkconfig b/hardware/gps/gps/sdkconfig
new file mode 100644
index 00000000..5f661a18
--- /dev/null
+++ b/hardware/gps/gps/sdkconfig
@@ -0,0 +1,157 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Espressif IoT Development Framework Configuration
+#
+
+#
+# SDK tool configuration
+#
+CONFIG_TOOLPREFIX="xtensa-esp32-elf-"
+CONFIG_PYTHON="python"
+
+#
+# Bootloader config
+#
+# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
+CONFIG_LOG_BOOTLOADER_LEVEL_WARN=y
+# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
+CONFIG_LOG_BOOTLOADER_LEVEL=2
+
+#
+# Serial flasher config
+#
+CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0"
+# CONFIG_ESPTOOLPY_BAUD_115200B is not set
+# CONFIG_ESPTOOLPY_BAUD_230400B is not set
+CONFIG_ESPTOOLPY_BAUD_921600B=y
+# CONFIG_ESPTOOLPY_BAUD_2MB is not set
+# CONFIG_ESPTOOLPY_BAUD_OTHER is not set
+CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
+CONFIG_ESPTOOLPY_BAUD=921600
+CONFIG_ESPTOOLPY_COMPRESSED=y
+# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set
+# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
+CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
+# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
+CONFIG_ESPTOOLPY_FLASHMODE="dio"
+# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
+# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set
+# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ="40m"
+# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
+# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE="2MB"
+
+#
+# Partition Table
+#
+CONFIG_PARTITION_TABLE_SINGLE_APP=y
+# CONFIG_PARTITION_TABLE_TWO_OTA is not set
+# CONFIG_PARTITION_TABLE_CUSTOM is not set
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
+CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000
+CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv"
+CONFIG_APP_OFFSET=0x10000
+CONFIG_OPTIMIZATION_LEVEL_DEBUG=y
+# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set
+
+#
+# Component config
+#
+CONFIG_BT_RESERVE_DRAM=0
+
+#
+# ESP32-specific config
+#
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set
+CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
+CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
+CONFIG_ESP32_ENABLE_STACK_WIFI=y
+# CONFIG_ESP32_ENABLE_STACK_BT is not set
+# CONFIG_ESP32_ENABLE_STACK_NONE is not set
+CONFIG_MEMMAP_SMP=y
+# CONFIG_MEMMAP_TRACEMEM is not set
+CONFIG_TRACEMEM_RESERVE_DRAM=0x0
+CONFIG_WIFI_ENABLED=y
+CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2048
+CONFIG_MAIN_TASK_STACK_SIZE=4096
+CONFIG_NEWLIB_STDOUT_ADDCR=y
+# CONFIG_ULP_COPROC_ENABLED is not set
+CONFIG_ULP_COPROC_RESERVE_MEM=0
+# CONFIG_ESP32_PANIC_PRINT_HALT is not set
+# CONFIG_ESP32_PANIC_PRINT_REBOOT is not set
+# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set
+CONFIG_ESP32_PANIC_GDBSTUB=y
+CONFIG_ESP32_DEBUG_OCDAWARE=y
+CONFIG_INT_WDT=y
+CONFIG_INT_WDT_TIMEOUT_MS=300
+CONFIG_TASK_WDT=y
+# CONFIG_TASK_WDT_PANIC is not set
+CONFIG_TASK_WDT_TIMEOUT_S=5
+CONFIG_TASK_WDT_CHECK_IDLE_TASK=y
+# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y
+# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set
+CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y
+
+#
+# FreeRTOS
+#
+CONFIG_FREERTOS_UNICORE=y
+CONFIG_FREERTOS_CORETIMER_0=y
+# CONFIG_FREERTOS_CORETIMER_1 is not set
+# CONFIG_FREERTOS_CORETIMER_2 is not set
+CONFIG_FREERTOS_HZ=1000
+CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL=y
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY is not set
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
+CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
+# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set
+# CONFIG_FREERTOS_ASSERT_DISABLE is not set
+CONFIG_FREERTOS_BREAK_ON_SCHEDULER_START_JTAG=y
+# CONFIG_ENABLE_MEMORY_DEBUG is not set
+CONFIG_FREERTOS_ISR_STACKSIZE=1536
+# CONFIG_FREERTOS_DEBUG_INTERNALS is not set
+
+#
+# Log output
+#
+# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
+# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
+# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
+# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set
+# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
+CONFIG_LOG_DEFAULT_LEVEL_VERBOSE=y
+CONFIG_LOG_DEFAULT_LEVEL=5
+# CONFIG_LOG_COLORS is not set
+
+#
+# LWIP
+#
+CONFIG_LWIP_MAX_SOCKETS=4
+CONFIG_LWIP_THREAD_LOCAL_STORAGE_INDEX=0
+# CONFIG_LWIP_SO_REUSE is not set
+CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
+
+#
+# mbedTLS
+#
+CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384
+# CONFIG_MBEDTLS_DEBUG is not set
+
+#
+# SPI Flash driver
+#
+# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set
diff --git a/networking/telnet/README.md b/networking/telnet/README.md
index 299a739b..b7eb716d 100644
--- a/networking/telnet/README.md
+++ b/networking/telnet/README.md
@@ -9,6 +9,7 @@ TCP port 23 (Telnet) for an incoming client request.
##Addition of libtelnet
To install the libtelnet component:
+
1. Create a sub-directory called `components`.
2. Change into `components`.
3. Clone the libtelnet repository:
diff --git a/networking/telnet/main/main.c b/networking/telnet/main/main.c
index 54e9ea17..fbbe2cdc 100644
--- a/networking/telnet/main/main.c
+++ b/networking/telnet/main/main.c
@@ -23,6 +23,7 @@
#include "nvs_flash.h"
#include "esp_log.h"
#include "string.h"
+#include "telnet.h"
#include "sdkconfig.h"
// YOUR network SSID
@@ -31,22 +32,18 @@
// YOUR network password
#define PASSWORD "password"
-
-extern void telnet_listenForClients(void (*callbackParam)(uint8_t *buffer, size_t size));
-extern void telnet_sendData(uint8_t *buffer, size_t size);
-
static char tag[] = "telnet";
static void recvData(uint8_t *buffer, size_t size) {
char responseMessage[100];
ESP_LOGD(tag, "We received: %.*s", size, buffer);
sprintf(responseMessage, "Thanks for %d bytes of data\n", size);
- telnet_sendData((uint8_t *)responseMessage, strlen(responseMessage));
+ telnet_esp32_sendData((uint8_t *)responseMessage, strlen(responseMessage));
}
static void telnetTask(void *data) {
ESP_LOGD(tag, ">> telnetTask");
- telnet_listenForClients(recvData);
+ telnet_esp32_listenForClients(recvData);
ESP_LOGD(tag, "<< telnetTask");
vTaskDelete(NULL);
}
diff --git a/networking/telnet/main/telnet.c b/networking/telnet/main/telnet.c
index 9422e974..e3870f8d 100644
--- a/networking/telnet/main/telnet.c
+++ b/networking/telnet/main/telnet.c
@@ -70,13 +70,20 @@ struct telnetUserData {
int sockfd;
};
-void telnet_sendData(uint8_t *buffer, size_t size) {
+void telnet_esp32_sendData(uint8_t *buffer, size_t size) {
if (tnHandle != NULL) {
telnet_send(tnHandle, (char *)buffer, size);
}
}
+int telnet_esp32_vprintf(const char *fmt, va_list va) {
+ if (tnHandle == NULL) {
+ return 0;
+ }
+ return telnet_vprintf(tnHandle, fmt, va);
+}
+
static void myTelnetHandler(
telnet_t *thisTelnet,
telnet_event_t *event,
@@ -144,7 +151,7 @@ static void doTelnet(int partnerSocket) {
} // doTelnet
-void telnet_listenForClients(void (*callbackParam)(uint8_t *buffer, size_t size)) {
+void telnet_esp32_listenForClients(void (*callbackParam)(uint8_t *buffer, size_t size)) {
ESP_LOGD(tag, ">> telnet_listenForClients");
callback = callbackParam;
int serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
diff --git a/networking/telnet/main/telnet.h b/networking/telnet/main/telnet.h
new file mode 100644
index 00000000..764f26b8
--- /dev/null
+++ b/networking/telnet/main/telnet.h
@@ -0,0 +1,3 @@
+void telnet_esp32_listenForClients(void (*callbackParam)(uint8_t *buffer, size_t size));
+void telnet_esp32_sendData(uint8_t *buffer, size_t size);
+int telnet_esp32_vprintf(const char *fmt, va_list va);
diff --git a/sockets/utilities/socket_utils.c b/sockets/utilities/socket_utils.c
new file mode 100644
index 00000000..25136f30
--- /dev/null
+++ b/sockets/utilities/socket_utils.c
@@ -0,0 +1,17 @@
+#include "lwip/socket.h"
+
+static void dumpSockaddr(struct sockaddr_in address) {
+ ESP_LOGD(tag, "Address details:");
+ char *family = "Unknown";
+ unsigned short port;
+ char ipString[20];
+
+ if (address.sin_family == AF_INET) {
+ family = "AF_INET";
+ } else if (address.sin_family == AF_INET6) {
+ family = "AF_INET6";
+ }
+ port = ntohs(address.sin_port);
+ inet_ntop(address.sin_family, &address.sin_addr, ipString, sizeof(ipString)) ;
+ ESP_LOGD(tag, "Address details: family=%s, ip=%s, port=%d", family, ipString, port);
+}
diff --git a/uart/readLine.c b/uart/readLine.c
new file mode 100644
index 00000000..a9f756bb
--- /dev/null
+++ b/uart/readLine.c
@@ -0,0 +1,17 @@
+#include "driver/uart.h"
+
+char *readLine(uart_port_t uart) {
+ static char line[256];
+ int size;
+ char *ptr = line;
+ while(1) {
+ size = uart_read_bytes(UART_NUM_1, (unsigned char *)ptr, 1, portMAX_DELAY);
+ if (size == 1) {
+ if (*ptr == '\n') {
+ *ptr = 0;
+ return line;
+ }
+ ptr++;
+ } // End of read a character
+ } // End of loop
+} // End of readLine