From 12fa20199e6a1cd4a60b0ca2191d0170dc265baf Mon Sep 17 00:00:00 2001 From: Stephen Porter Date: Fri, 13 May 2016 16:07:09 -0700 Subject: [PATCH] Initial Commit --- .gitignore | 16 + LICENSE | 138 ++ README.md | 15 +- documents/harmony_license_v1.07.01.pdf | Bin 0 -> 42065 bytes documents/images/DM990004.png | Bin 0 -> 466476 bytes documents/images/generateCode.png | Bin 0 -> 6681 bytes documents/images/program_icon.png | Bin 0 -> 4026 bytes ...t-ethernet-firmware-compile-and-program.md | 52 + documents/iot-ethernet-out-of-box-guide.md | 241 +++ hardware/iot-ethernet-schematic.pdf | Bin 0 -> 1079857 bytes .../firmware/aws-iot-ethernet.X/Makefile | 113 + .../nbproject/configurations.xml | 1022 +++++++++ .../aws-iot-ethernet.X/nbproject/project.xml | 18 + .../firmware/aws-iot-ethernet.hconfig | 60 + software/aws-iot-ethernet/firmware/src/app.c | 1021 +++++++++ software/aws-iot-ethernet/firmware/src/app.h | 296 +++ software/aws-iot-ethernet/firmware/src/app1.c | 260 +++ software/aws-iot-ethernet/firmware/src/app1.h | 233 ++ .../firmware/src/app_nvm_support.c | 159 ++ .../firmware/src/app_nvm_support.h | 53 + .../firmware/src/bsp_config.h | 612 ++++++ .../firmware/src/bsp_sys_init.c | 572 +++++ .../aws-iot-ethernet/firmware/src/ca-certs.h | 360 ++++ .../firmware/src/configuration_http.c | 289 +++ .../src/configuration_webpage/DynRcrd.bin | Bin 0 -> 60 bytes .../src/configuration_webpage/FileRcrd.bin | Bin 0 -> 24 bytes .../configuration_webpage/css/mchp-min.css | 1 + .../src/configuration_webpage/css/mchp.css | 149 ++ .../src/configuration_webpage/error.htm | 12 + .../src/configuration_webpage/footer.inc | 4 + .../src/configuration_webpage/header.inc | 11 + .../src/configuration_webpage/images/mchp.gif | Bin 0 -> 1263 bytes .../src/configuration_webpage/index.htm | 32 + .../configuration_webpage/javascript/mchp.js | 198 ++ .../src/configuration_webpage/reconnect.htm | 16 + .../firmware/src/custom_http_app.c | 1879 +++++++++++++++++ .../firmware/src/http_print.c | 79 + .../firmware/src/http_print.idx | 4 + software/aws-iot-ethernet/firmware/src/main.c | 92 + .../aws-iot-ethernet/firmware/src/mpfs_img2.c | 587 +++++ .../aws-iot-ethernet/firmware/src/parson.c | 1759 +++++++++++++++ .../aws-iot-ethernet/firmware/src/parson.h | 222 ++ .../IoT-Ethernet/FreeRTOSConfig.h | 159 ++ .../IoT-Ethernet/IoT-Ethernet.mhc | 1177 +++++++++++ .../src/system_config/IoT-Ethernet/config.h | 78 + .../IoT-Ethernet/configuration.xml | 1301 ++++++++++++ .../framework/driver/adc/drv_adc_static.h | 105 + .../framework/driver/adc/src/drv_adc_static.c | 268 +++ .../framework/driver/cmp/drv_cmp_static.h | 65 + .../framework/driver/cmp/src/drv_cmp_static.c | 111 + .../framework/net/pres/net_pres_cert_store.c | 45 + .../framework/net/pres/net_pres_enc_glue.c | 299 +++ .../framework/net/pres/net_pres_enc_glue.h | 61 + .../framework/system/clk/src/sys_clk_static.c | 371 ++++ .../framework/system/clk/sys_clk_static.h | 81 + .../system/ports/src/sys_ports_static.c | 111 + .../system_config/IoT-Ethernet/rtos_hooks.c | 118 ++ .../IoT-Ethernet/system_config.h | 614 ++++++ .../IoT-Ethernet/system_definitions.h | 158 ++ .../IoT-Ethernet/system_exceptions.c | 143 ++ .../system_config/IoT-Ethernet/system_init.c | 1072 ++++++++++ .../IoT-Ethernet/system_interrupt.c | 142 ++ .../IoT-Ethernet/system_interrupt_a.S | 184 ++ .../system_config/IoT-Ethernet/system_tasks.c | 195 ++ .../firmware/src/wolfmqttsdk/src/include.am | 14 + .../src/wolfmqttsdk/src/mqtt_client.c | 506 +++++ .../src/wolfmqttsdk/src/mqtt_packet.c | 755 +++++++ .../src/wolfmqttsdk/src/mqtt_socket.c | 345 +++ .../src/wolfmqttsdk/wolfmqtt/include.am | 11 + .../src/wolfmqttsdk/wolfmqtt/mqtt_client.h | 247 +++ .../src/wolfmqttsdk/wolfmqtt/mqtt_packet.h | 354 ++++ .../src/wolfmqttsdk/wolfmqtt/mqtt_socket.h | 97 + .../src/wolfmqttsdk/wolfmqtt/mqtt_types.h | 144 ++ .../src/wolfmqttsdk/wolfmqtt/version.h | 42 + .../src/wolfmqttsdk/wolfmqtt/version.h.in | 42 + .../src/wolfmqttsdk/wolfmqtt/visibility.h | 61 + 76 files changed, 20049 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE mode change 100644 => 100755 README.md create mode 100644 documents/harmony_license_v1.07.01.pdf create mode 100644 documents/images/DM990004.png create mode 100644 documents/images/generateCode.png create mode 100644 documents/images/program_icon.png create mode 100644 documents/iot-ethernet-firmware-compile-and-program.md create mode 100755 documents/iot-ethernet-out-of-box-guide.md create mode 100644 hardware/iot-ethernet-schematic.pdf create mode 100644 software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/Makefile create mode 100644 software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/configurations.xml create mode 100644 software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/project.xml create mode 100644 software/aws-iot-ethernet/firmware/aws-iot-ethernet.hconfig create mode 100644 software/aws-iot-ethernet/firmware/src/app.c create mode 100644 software/aws-iot-ethernet/firmware/src/app.h create mode 100644 software/aws-iot-ethernet/firmware/src/app1.c create mode 100644 software/aws-iot-ethernet/firmware/src/app1.h create mode 100644 software/aws-iot-ethernet/firmware/src/app_nvm_support.c create mode 100644 software/aws-iot-ethernet/firmware/src/app_nvm_support.h create mode 100755 software/aws-iot-ethernet/firmware/src/bsp_config.h create mode 100755 software/aws-iot-ethernet/firmware/src/bsp_sys_init.c create mode 100644 software/aws-iot-ethernet/firmware/src/ca-certs.h create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_http.c create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/DynRcrd.bin create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/FileRcrd.bin create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp-min.css create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp.css create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/error.htm create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/footer.inc create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/header.inc create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/images/mchp.gif create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/index.htm create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/javascript/mchp.js create mode 100644 software/aws-iot-ethernet/firmware/src/configuration_webpage/reconnect.htm create mode 100644 software/aws-iot-ethernet/firmware/src/custom_http_app.c create mode 100644 software/aws-iot-ethernet/firmware/src/http_print.c create mode 100644 software/aws-iot-ethernet/firmware/src/http_print.idx create mode 100644 software/aws-iot-ethernet/firmware/src/main.c create mode 100644 software/aws-iot-ethernet/firmware/src/mpfs_img2.c create mode 100755 software/aws-iot-ethernet/firmware/src/parson.c create mode 100755 software/aws-iot-ethernet/firmware/src/parson.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/FreeRTOSConfig.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/IoT-Ethernet.mhc create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/config.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/configuration.xml create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/drv_adc_static.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/src/drv_adc_static.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/drv_cmp_static.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/src/drv_cmp_static.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_cert_store.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/src/sys_clk_static.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/sys_clk_static.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/ports/src/sys_ports_static.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/rtos_hooks.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_config.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_definitions.h create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_exceptions.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_init.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt.c create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt_a.S create mode 100644 software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_tasks.c create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/include.am create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_client.c create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_packet.c create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_socket.c create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/include.am create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_client.h create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_packet.h create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_socket.h create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_types.h create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h.in create mode 100755 software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/visibility.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ec0427 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +#### SOFTWARE SECTION #### +# MPLab files +software/**/*.X/build +software/**/*.X/debug +software/**/*.X/dist +software/**/*.X/*.log +software/**/*.X/funclist +software/**/*.X/*.obj +software/**/*.X/nbproject/*.properties +software/**/*.X/nbproject/*.mk +software/**/*.X/nbproject/*.bash +software/**/*.X/nbproject/private + +#### HARDWARE SECTION #### + +#### DOCUMENTS SECTION #### diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8806560 --- /dev/null +++ b/LICENSE @@ -0,0 +1,138 @@ +Software License Agreement +MPLAB Harmony Integrated Software Framework v1.07.01 + +See documents/harmony_license_v1.07.01.pdf + +################################################################################ + +FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. +All rights reserved + +VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + +This file is part of the FreeRTOS distribution. + +FreeRTOS is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License (version 2) as published by the +Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + +*************************************************************************** +>>! NOTE: The modification to the GPL is included to allow you to !<< +>>! distribute a combined work that includes FreeRTOS without being !<< +>>! obliged to provide the source code for proprietary components !<< +>>! outside of the FreeRTOS kernel. !<< +*************************************************************************** + +FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. Full license text is available on the following +link: http://www.freertos.org/a00114.html + +*************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * +*************************************************************************** + +http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading +the FAQ page "My application does not run, what could be wrong?". Have you +defined configASSERT()? + +http://www.FreeRTOS.org/support - In return for receiving this top quality +embedded software for free we request you assist our global community by +participating in the support forum. + +http://www.FreeRTOS.org/training - Investing in training allows your team to +be as productive as possible as early as possible. Now you can receive +FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers +Ltd, and the world's leading authority on the world's leading RTOS. + +http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, +including FreeRTOS+Trace - an indispensable productivity tool, a DOS +compatible FAT file system, and our tiny thread aware UDP/IP stack. + +http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. +Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + +http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High +Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS +licenses offer ticketed support, indemnification and commercial middleware. + +http://www.SafeRTOS.com - High Integrity Systems also provide a safety +engineered and independently SIL3 certified version for use in safety and +mission critical applications that require provable dependability. + +1 tab == 4 spaces! + +################################################################################ + + Parson ( http://kgabis.github.com/parson/ ) + Copyright (c) 2012 - 2015 Krzysztof Gabis + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + ################################################################################ + + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + + ################################################################################ + + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 5e77736..60a2a09 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ -### Firmware for the PIC32MZ based IoT demos +### AWS IoT Firmware for PIC32MZ Based Demos -This firmware will be released by June 2016. +--- +### Introduction +[AWS IoT](http://aws.amazon.com/iot/) is a service that will allow internet of things (IoT) devices to be easily and securely connected to Amazon Web Services (AWS). + +--- +### Out of Box Guides +Select the demo that you are using below to go to the out of box guide: +- [IoT Ethernet Out of Box Guide](documents/iot-ethernet-out-of-box-guide.md) + +--- + +For more information on Microchip's IoT Demos, please visit [Microchip's IoT Page](http://www.microchip.com/iot) diff --git a/documents/harmony_license_v1.07.01.pdf b/documents/harmony_license_v1.07.01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b6412422b1b51443583bce8713e2a8065625dcc0 GIT binary patch literal 42065 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 I&u~Kj0~#bbyZ`_I literal 0 HcmV?d00001 diff --git a/documents/images/DM990004.png b/documents/images/DM990004.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0da7564d727a8a7b6d15c7ac21395957504bd7 GIT binary patch literal 466476 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 z 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�&B3KVyAb~W2^)iWQj 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

q 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

3=@@=#EOb*GE(^OPcHs$ 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

@-w&|RJj(JT2T%Pvj$9JjQcCdb*72$F7 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�-RVOPLO@ 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 literal 0 HcmV?d00001 diff --git a/documents/images/generateCode.png b/documents/images/generateCode.png new file mode 100644 index 0000000000000000000000000000000000000000..d89361a8bd6dc621b878b20c517d1d04aad5d923 GIT binary patch literal 6681 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 HIOzWXZ$6;{ literal 0 HcmV?d00001 diff --git a/documents/images/program_icon.png b/documents/images/program_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ede683e9d9c8cce614c3722157eec7cab35b975a GIT binary patch literal 4026 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

8a8WeUa|SZ7S5JyTRpedZ`0gX zy6y9J-u62?0(LZ38&;R^B<{@L`D|C*u5-UR{Z_kMeRt{ZuY34=x@)3pPS-lt*6!8V zySfgo6V>(Yo3^iWzwiF$dh_}n4UC4;1K@z@z{}s0f4_AwTXVK?m8NLw7tc(<;Wivf9z@1X{|b@a%}Z+%JHJ(BPR+@47Lf{`cI~v z>}j9be*aX$sT-%KobEUia_0P5|Ffsgd7V3P-tBzr1(yp)FFIXpy5w-F@v{BpBUkLN z9O-cAXuRrpwYk%|v!!ct*YRr}*G^vdy?*va(2Yws!*6!oioJE`_O#pGcQ|)m+|9cC z=3f52;rojp5FV5~RCrkaNaIoUpC*4cbUSn(d+hu8@{{N%_j}kqub$>U{nA_XjP|Vj zx%Ttg7d9_i`~3SlUrv45`%3U?xWD)>#lJScHhz8hZ_mFk4o%-0BDKu>;Ug^6glbrOCpH$&L~0PpRn|fCJ_e!_ILsiyBL5_ct+U@n*qdB z_!J+%V>|(BYdhXXB{$X9MjDF>Z!v_ABO~uL0U)&i@Krc6GQ4GEK{0$22wfuH4HaZPIi&n=!v00009a7bBm000&x000&x0ZCFM@Bjbe5T1{&cK^Wee5c~xmq)_dL=q+jffEV@TLBva;f(nvCu!kPZ9&!p;bLgQZ*y2GU zg&9X+26laBiisiM^L%Xm zrpVfz8c>)q^&!Q?g9y-ZnW|p!tj;?Q_cCxN#xIk@p9jAnMMggFU!df{ zGl7D^5gnI_=>^~4@i_bQ{l>LvAuTk&Picqlp^$H#iqj^u=(tQxc(O_)5;B-_%|E60 z@R4^Uip93l2W4;dxhX?kIXp@ z6Qkpx#4yI>Mv_cZC>4a$<+FK`uV?DQx``w@ZbHRgdnDJW^XsqI33cJ=0vYSi2In-K zBRURB=#0rEbxwy%IPmB#f3)wpeZAiO%0b6_mh&&6Z>M!8)!>MnkF4WH7VbEX_3sZp zqZY$?wU0&?-rn$kIaYeh8n&2fwaP#$l?oGAt8851@f~ppzQWGeF+VpSb234Ij*C literal 0 HcmV?d00001 diff --git a/documents/iot-ethernet-firmware-compile-and-program.md b/documents/iot-ethernet-firmware-compile-and-program.md new file mode 100644 index 0000000..eb98737 --- /dev/null +++ b/documents/iot-ethernet-firmware-compile-and-program.md @@ -0,0 +1,52 @@ +### IoT Ethernet Firmware +#### Compile and Programing + +--- + +### Introduction +This document will show you where to find the latest _released_ version of the firmware source, how to compile it, and then program it into the IoT Ethernet Kit + +--- + +### Required Tools and Applications +#### Microchip Required Tools and Applications +You will need the following Microchip development tools to program and develop with the Microchip IoT Ethernet. + +- Download the latest project for IoT Ethernet from here: [IoT Ethernet Project](https://github.com/MicrochipTech/aws-iot-firmware-pic32mz/releases/latest) +- Download and install Microchip MPLAB® Harmony Integrated Software Framework v1.07.01 for your OS from here: [Harmony](http://www.microchip.com/mplab/mplab-harmony) +- Download and install Microchip MPLAB® X IDE for your OS from here: +[Microchip MPLAB® X IDE](http://www.microchip.com/mplabx) +- Download and install the latest XC32 compiler for your OS from here: [Microchip MPLAB® XC32 Compiler](http://www.microchip.com/xc32) + +--- + +### Compiling and programming the IoT Ethernet Board + +#### Compiling the Firmware +1. Extract the zip file downloaded from the git repository to a location of your choice +- Open MPLAB® X IDE +- Select __File -> Open Project__ +- Navigate to: ` /aws-iot-firmware-pic32mz/software/aws-iot-ethernet/firmware` +- Select the project __aws-iot-ethernet.X__ +- With your project opened, right click on the project __aws-iot-ethernet__ in the Projects tab and select __Set as Main Project__ +- Follow these directions to install the Microchip Harmony Configurator (MHC): [Steps to Install MHC](http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB%20Harmony%20Configurator%20%28MHC%29%20and%20MPLAB%20Harmony%20Graphics%20Composer%20%28v1.07.01%29.pdf) +- Open the MHC; The MHC will prompt asking to choose a Harmony framework to use, select "Yes" and select the location of your v1.07.01 Harmony install and click "OK" +- The MHC will then ask if you want to open the configuration file __IoT-Ethernet.mhc__ for the __aws-iot-ethernet__ project, select "Open" to proceed. +- With the new Harmony framework selected for your project, you will need to regenerate code by clicking the generate code button. ![](images/generateCode.png) +- The MHC merge tool will show differences between code sets. Ignore the differences and hit "Close" for each file + +#### Programing the IoT Ethernet Board +1. Connect the PICKit™ 3 to your computer using the provided USB cable. +- Connect the PICKit™ 3 to the IoT Ethernet ICSP 6-pin header. The pins should match by aligning the triangles. +- Power on the starter kit by connecting a Micro-USB cable to a power source and changing the power switch on the board to USB. +- On the top tab of MPLAB® X, click the __Make and Program Device Main Project__ button. ![](images/program_icon.png) + + >MPLAB® X may prompt you to select with programmer to use. Select PICKit™ 3 from the prompt and continue. + +--- + +### Troubleshooting +If you are having trouble, check to make sure that each of the issues bellow are resolved. + +#### Project won't compile due to missing files +- Often times a project won't compile if you are on a Windows machine due to a limitation in the path length. Windows OS has a max path length of 260 characters, so file paths are sometimes truncated when attempting to compile which leads to files not being found by the compiler. Try putting the project in the topmost directory, usually "C:/". For more information please see [MSDN article from Microsoft](https://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath). diff --git a/documents/iot-ethernet-out-of-box-guide.md b/documents/iot-ethernet-out-of-box-guide.md new file mode 100755 index 0000000..b1c311b --- /dev/null +++ b/documents/iot-ethernet-out-of-box-guide.md @@ -0,0 +1,241 @@ +### IoT Ethernet +#### Out of Box Guide + +--- +### Introduction +[AWS IoT](http://aws.amazon.com/iot/) is a service that will allow internet of things (IoT) devices to be easily and securely connected to Amazon Web Services (AWS). The IoT Ethernet Kit has been design to work with this service and allow you to develop new IoT based designs. + +![IoT Ethernet Overview](images/DM990004.png) + +--- +### Required Tools and Applications +#### Microchip Tools and Applications +You will need the following Microchip development tools to run out of box demo + +- IoT Ethernet Kit (DM990004), available from [Microchip Direct](http://www.microchipdirect.com/productsearch.aspx?Keywords=DM990004) +- Download and install [Insight on Things](https://github.com/MicrochipTech/aws-iot-insight-on-things-desktop-app) desktop application; [Download latest version](https://github.com/MicrochipTech/aws-iot-insight-on-things-desktop-app/releases/latest) +- To learn more about building the project from source or just upgrading the firmware, read [IoT Ethernet Firmware Compiling and Programing](iot-ethernet-firmware-compile-and-program.md) in our documents folder + +#### AWS Tools and Applications +- You will need an AWS account to use AWS IoT. + - For more information how to setup an AWS Account please go to [AWS](http://aws.amazon.com) main page + - Please check with your IT or IS department on your company's policies on using cloud computing, or to see if you have a corporate AWS account that should be used. + +- To use the AWS IoT services you will need to make use of _AWS Command Line Interface_ (awscli) tool. For more information on how to install, configure, and use the awscli tool please go to [AWS Command Line Interface User Guide](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html). + +> NOTE: If you are a **Microchip Employee** we have a corporate AWS account that must be used. To setup your AWS IoT device please go to https://setup.iot.microchip.com for more information + +--- +### Setting Up the AWS Command Line Interface +#### Linux, Unix, and Windows Installations +Follow the instructions in the [Getting Set Up with the AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html) for installations for your operating system. + +#### Mac OS X Installation +This assumes that you have not installed previous version of Python, awscli, or openssl; if you have you will need to uninstall those versions. You will need to use a version of openssl 1.0.0 or later to connect to AWS IoT services as TLS 1.1 is required. To do this follow the these steps: + +1. Use [Homebrew](http://brew.sh/) to install the latest version of openssl with the following commands in a terminal window. You will need to force the links so that Python will use the right version of openssl. + + ``` + brew update + brew install openssl + brew link --force openssl + ``` +- Reinstall Python to use the latest openssl: + + ``` + brew install python --with-brewed-openssl + ``` +- To verify that python was updated run the following command and make sure the version os greater than 1.0.2d + + ``` + python -c 'import ssl; print ssl.OPENSSL_VERSION' + ``` +- Install/upgrade the AWS CLI: + + ``` + pip install --upgrade awscli + ``` +- To verify the version of the AWS CLI tool installed run the following command and look for version 1.10.x or greater: + + ``` + aws --version + ``` + +--- +### Setting Up the AWS IoT Service + +To setup your AWS IoT service to work with the _IoT Ethernet Kit_ you will need to work with the awscli that you installed in the previous section. + +1. Using the awscli you will need to find the endpoint that will be used for your AWS IoT account. To do this run the following command in your terminal/command window. + + ``` + aws iot describe-endpoint + ``` +You will receive the following back that you will need to add to the firmware in the next section. The output will look like: `.iot.us-east-1.amazonaws.com` +- Create certificates that will be used in the application firmware by running the following command in your terminal/command prompt window: + + ``` + aws iot create-keys-and-certificate --set-as-active --output text + ``` + > You will need to copy the output on the terminal/command window to text files for the certs and private key. Please also note the _certificate arn_ value that will be used later in this section; it is the first long string of text that you will seen on the screen. + > + > NOTE: this is the only time that you will be able to see this information and make sure there is no text or spaces at the beginning of each of the files you create. For example in the output below you will need to remove the `KEYPAIR` text and spaces so that the first line of the private key starts with the dashes: + > + >``` + >... + >Gmh/2ib2NsA8Tf+8drTQXf3gQ4oemdOfnA4IlXiFGA9QAP9i/krzYvaVAlSogLWh + >wRHaP1hzPuS9+0UjZkS1Uzyfqmd+vR4Om8S+t2VmEwYMJMG3mUaFXdhBhMDJ + >-----END CERTIFICATE----- + > + >KEYPAIR -----BEGIN RSA PRIVATE KEY----- + >MIIEpAIBAAKCAQEAynvp1r7jl9HzbAVCgVWzYmKu4O6nNM4wBZQ1YjHpSOL1+joF + >KKcXM8eS8jmUbHRJ84JeDrr9A50ok1cyUCDBPkf6c7VO4xWGzXruR3WoVjRYq3vc + >... + >``` +- Create and attach the following policy that will allow your thing to publish and subscribe to the AWS IoT service + - First create a file that will have the policy information in it and save it to you computer: + > NOTE: Make sure you replace `` and `` with the AWS-IoT region and your AWS account number + + ``` + { + "Version": "2012-10-17", + "Statement": [{ + "Effect": "Allow", + "Action": [ + "iot:Connect" + ], + "Resource": [ + "arn:aws:iot:::client/${iot:ClientId}" + ] + }, + { + "Effect": "Allow", + "Action": [ + "iot:Publish" + ], + "Resource": [ + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/update", + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/get" + ] + }, + { + "Effect": "Allow", + "Action": [ + "iot:Subscribe" + ], + "Resource": [ + "arn:aws:iot:::topicfilter/$aws/things/${iot:ClientId}/shadow/update/delta", + "arn:aws:iot:::topicfilter/$aws/things/${iot:ClientId}/shadow/update/accepted", + "arn:aws:iot:::topicfilter/$aws/things/${iot:ClientId}/shadow/update/rejected", + "arn:aws:iot:::topicfilter/$aws/things/${iot:ClientId}/shadow/get/accepted", + "arn:aws:iot:::topicfilter/$aws/things/${iot:ClientId}/shadow/get/rejected" + ] + }, + { + "Effect": "Allow", + "Action": [ + "iot:Receive" + ], + "Resource": [ + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/update/delta", + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/update/accepted", + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/update/rejected", + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/get/accepted", + "arn:aws:iot:::topic/$aws/things/${iot:ClientId}/shadow/get/rejected" + ] + }] + } + ``` + - Load the policy to the AWS IoT services with the following command: + + ``` + aws iot create-policy --policy-name 'MQTTandShadowPolicy' --policy-document file:// + ``` + - You will need to attached this policy to a principal to allow the cert the rights to publish and subscribe to topics: + + ``` + aws iot attach-principal-policy --principal-arn '' --policy-name 'MQTTandShadowPolicy' + ``` +- Create a thing shadow based on the MAC address of the board: + + ``` + aws iot create-thing --thing-name '' + ``` + +--- +### Running the Demo +There are two parts to running the demo. First you have to commission the demo so it knows how to talk to your AWS Account that you setup in the [Setting Up the AWS IoT Service](Setting Up the AWS IoT Service) section of this out of box guide. Second is sending and receiving data from AWS IoT. + +#### Commissioning +To setup and run the demo follow these instructions: + +1. Plug the IoT Ethernet Kit into a router or switch using an ethernet cable +- Power the IoT Ethernet Kit by connecting the supplied Micro-USB cable to a power source and setting the power switch on the board to USB +- Connect your computer to the same network that the IoT Ethernet Kit is connected + - Your board will register a Multicast DNS (mDNS) name with the local network that will allow you to access a configuration webpage. +- Use a bonjour or multicast DNS service to find your board's IP address and enter the IP address into a web browser. The kit will have a service name such as `xxxxxx_IoT-E` where `xxxxxx` is the last six characters of the kit's MAC address. + - Alternatively you can try entering `xxxxxx_iot-e.local` into a web browser to navigate to the webpage where `xxxxxx` is the last six bytes of the MAC address on the board +- Once the web browser finds and displays the IoT Ethernet Kit configuration webpage + - Enter your AWS IoT Endpoint that you received from the previous AWS IoT Service Setup section. The endpoint will have the form `.iot.us-east-1.amazonaws.com` +- Copy and paste your client certificate into the box labeled Client Public Cert. + - The cert should look like + + ``` + -----BEGIN CERTIFICATE----- + + -----END CERTIFICATE----- + ``` +- Copy and paste your private key into the box labeled Client Private Key. + - The key should look like + + ``` + -----BEGIN RSA PRIVATE KEY---- + + -----END RSA PRIVATE KEY----- + ``` +- Click the __Join__ button and a _Connecting to server_ page will appear showing the endpoint that the IoT Ethernet board will connect to along with the full UUID + > NOTE: The information you enter above will be sent in the clear and is not secured as if you where using https; this is an option that you can add to your code later +- You will see a LEDs D1-D6 light up while the board gets initial data from the server. + - If not, please see the [Status and Error Code Table](Status and Error Code Table) table below for more information +- The board is now connect and running; there are two blue LED status indicator on the board. + - LED D6 will flash briefly when transmitting data + - LED D5 will flash briefly when receiving data + +#### Sending and Receiving Data with AWS IoT +This demo is controlled though the AWS IoT shadow registors by the [Insight on Things](https://github.com/MicrochipTech/aws-iot-insight-on-things-desktop-app) desktop application that we provide you. [Click here download the latest version](https://github.com/MicrochipTech/aws-iot-insight-on-things-desktop-app/releases/latest). You will need to follow the README.md guide on the github page to setup this application. + +--- + +### Troubleshooting +If you are having trouble connecting with the starter kit, check to make sure that each of the issues bellow are resolved. + +#### Connection Issue +- Check that you have a valid internet connection on your network. +- Ensure that port 8883 is open to the internet. +- Ensure that your AWS IoT service is setup property. + +#### Change the configuration +- Changing the configuration that you entered, or if you entered it incorrectly, simply power off the starter kit, press and hold S2 and S3 while turning on the power to the starter kit. +- This will erase the current configuration and you can begin this process again and re-enter the configuration information. + + +#### Association to AP Failed +- Check that your access point is not blocking MAC addresses. + +#### DNS Resolved Failed +- Check that the AWS Endpoint you configured your starter kit with is correct. +- Check that you have a valid internet connection on your network + +#### Status and Error Code Table + D7 | D6 | D5 | D4 | D3 | D2 | D1 | Diagnostic Report +:---:|:---:|:---:|:---:|:---:|:---:|:---:|----- + - | 0 | F | 0 | 0 | 0 | 0 | Configuration Mode: Need to configure Connected to network + - | 1 | 1 | 1 | 1 | 1 | 1 | Connected to network and waiting on data + - | 1 | 0 | C | C | C | C | Associating to network + - | 1 | 1 | 0 | 0 | 0 | 1 | Connection Issue, no internet found + - | 1 | 1 | 0 | 0 | 1 | 0 | Association to network failed + - | 1 | 1 | 0 | 1 | 0 | 1 | DNS Unresolved: Bad endpoint or no connection + - | F | 0 | - | - | - | - | Normal Operation: D6 flashes each message transmission + - | 0 | F | - | - | - | - | Normal Operation: D5 flashes each subscription receive + 1 | - | - | - | - | - | - | Battery Voltage Low +F = Flashing, C = Rotating in a counter clockwise pattern, - = Don’t care, 0 = Off, and 1 = On diff --git a/hardware/iot-ethernet-schematic.pdf b/hardware/iot-ethernet-schematic.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba0ed3d25de022a7c3481ccee5cefc6f998c9582 GIT binary patch literal 1079857 zcmeFZ2|Sel+dp~>*^@OCqY$!X-;J^-p)i)1Y*{8GYqn8}tP?^hyDW*Z%f6FjUnAM~ zZGrAh^xaYnT;*LA(G_Z6Rkx~7P@s3aXV z-{9iFZ#rs8aT#gu>)dWO&UDmDN@8kH?5#cBo^T7?c;xBi<-)CQ@8RU&YX3x#j{2|f zoZMX1tv&6z1=JNJu8YfDm$)u@{mYHnVxp4{LN{rfg0#by7oSyTN#qWvYL=bxT*T)?jW zH1f#p$-T$cwqWn-_TEmm_II^zg7gBXxUQH@nl8Z`->%fKQ7{%1TQ7C8LKYIBPC+)FQ2?+p@fPa9KNk9!aOGbW{ob2pb^0O2aXDO-AQ&Uq>Q8S;Tr#*jxnT_oN zGb<|xCm)34BF`mOR&HT#o~!(V*96%iBG*L(uJZ{93Y<1VLP0@6O-ao}P0b|0!O9`< zzx+9A0vIR({26^xk}JR&1`<*Rl9M(70?J8F^5+Bm%ZKC)DJU-mB^5Od_&~*Z;0y^V z=@~Loa&j^<@aaJCdw`6Aobj^wjk8RK))ZIVnI)dZW>E6nENN!BJAmPpw0ZKJikkHT z8#@QzRek}%Yf{oOvU2hYYU&!ATG~3d?im@Iz)a1|ZSCwIIygExdw6)YVa@W|-c_>YO% zx%q{~rR9~?wVmI)d;8b}+~LuwUL*kNUuuDW|E1X9>BRu*b%uvImMp;mo)oV z#r{pN34oTA1e`ol1^@~ir6>&L=Z~i7&?W3&T(^|z@SnOlCxp;G-z7X)Y^=elBaJ!e zY>YM!i}tc86jNDHAZ7d7bN@I`MX)h~pm}umWgfedvW<6R zLd*Tz^dcV!YYOM4^p!X;5jNBUnZf@o7t|=e(6?&Sc)k*o7K|*DS}!?={>()ElHDs9 z`T2pz?|qsyY>cv2d9FEO|2UmsCKlNsxPF1_Ntc7e<&yI8A8=6#O)Y#+b>ocD>mN&d zh8p7J%!aD}EEnV>l1aJ}Gu=AP;Jl-KC3&>Nig z+=CIIS-;kgMiS#ccJS5LC0M_tAtw)STEGZxPQQSXNI}TeShlJzadgx-@7mpOrP_$B94lawwvP$QkK zoNJ=yw;|HjYJ0})kb?nqKxVK~7Lk2@HtCqgT>Scpnm+Mk`#7FUY|Ru{^)}237U*H#5@-psZXl zw%&UJI4V1pi@i{}QjJovD-L`|xnXzN z9@fxUSsuw{_xrPMnh7`kvhn%=)M1ms>ja2w;HrG{kS!Ol8-;*tdtDZ+O zysHpnprVeRbiLf+-V628KLJ8bFwkQ%f)+T~*TK>Kbg(8s+Ju}%)cAk8ZlV1MpRu58qnmMvil-YPdAyXhIDnPoCBW?&68M&fmj zkzyeg<3H`qTfBJ2J4Oys0&OuA`RHNGhnH1QflT~w(PR<#*ryVBSPp&M+kVqyQM>7s zE1401&^me?rN-c>!ZVg)RMFmIra3jNSv!eQu|ZBt{}u^)9@L|70ZZRJMa88Y|Es{N ztMAwDIinL``Xa@wDp!UEvjGWQjyO^CqXH8Yoz-D_aWYGCK0~`x4OdJkSXslRVY|i} z%Y%3)Rt>+Ji%1NpiP^`gRX6TTy&;+L+Vj~k&MfSU@=CGXA%;0$(LcymB1XdH#wOt< z9WRelFcZu7yxM9KCa-@bl3mnVPX-P?o!Z`+2E}!U))RnANzXTJonv^CfAlU--waz? zOYOvAA9i@Gp=+k+qDIv0_Eyw(NblD%HlF?@$UzSf;654$?$p!W`oDH1kB-i5S+is_ z_6e@UUbaD!sGc9NG;VC|WBW^4$p5K(=EaCpqPdFpXx~7B7n@-Dw9r zjP7M?MSs)&986cH|J>Be3{rn9O0O#-Y!s}v(PJlRzk0-$R zL$PB9CH)rTynZWXsh zNSM8yfvr-sLMbPGA8ZAQzFgzBi{^O`dGljl>+546EiI6+;fXisrFyRe0HE z6kYV^9BuPE{)=5bfS)DkqmTg4DZfe|+WJyYeWz?b*9wUa%7rcVRz|ay1jN*uJ$$T{ z(Undu1sYJZp+}3uUKcHd>_wEn=hHeXmYt_qL+tIg9(kIpyv$v#Tr;_->pP?BPi_GH z7=#S!JAzkiwISKJZ7wQ!VysNe)ZcOmC`Yv7LZIh!XdMuuL4{$opeUGw&ePXg(Z(* zt8Wam#d+NYOb2d$iU~gVJec!z58n5QA#&j0oj$B(xXc#aE|J&Srqzkp(?6uL1QQS? zpb-p3{@9(3y51$6Oq;==D~|U(2Ko-xX9HadA!ZFOGGbTTdWq`(kuE6r35h5AZ0G^E z$fIQfPa`csBcDpCny1_=JnUfH1wI@>m`ta4I({3(>7=5vb2T5_hMWaIR};NwHq5w` zzVy#0Af%(o*m<@35^v-UOQq9 zR!SnWPtWEa1NNY4TSpN^K@0sKUf%yCK)TpC!8Gd-tVDzPwS0Hb)9Lc?QmP`tiEg2n zA^hi^Q5*VipP?LwDh=r4D(TH)Umw+&o3a<`-zhR2oIe3pz8&5SR*uIy;aqYEYCGrh zk_q=3-Z?zFc>Sxv;pZj+UjMVumw|Mki5#QiU1Cw^V2O5QXIwX zW=DRGg(YZ>yCiP7Em=weI$d(xP13)o0$NTciW!=17aVF|lMd4-An%WL?E#-? zu9N1=p-ThE@iI6YIJFrxV$&_ObdrEcB4-ZRtOAf_l@0fC_8G_)-5rY7BSj%8A6RU5 zt)_O=rD_5*6Z~U2$y_6*2TG4zo&^1drb^HS`d4X3HjNA@B2Iw+Aalcm&1isGPM7CzODXTR`#R?-(@76Z9hUkQ;o`8B+$KF5BE$BJ zUtHz(Lc*_U-jP7sFaJcQ0HEvJsz{JJ0n%w3ah&ep790R4WE(R?43+@h2CvQ&;DS|! z2JlpjAlcZee*|=cKE@b?VCn0&sWwAT;mdTVzpzf^qjbYZq*PQN_MN?oIUuw7kSA{b zgTvy{*pGxIB0tW>Wu88~()=Kt!C_G9y>U!$`zyQDC*ON`P+L)XlRsm8*|;Il0KwyA zFA?uwoVp!l-Pu2&-xIZ=gZGgYsXUPTY1VKpob9aaGlDdu==<5ps|k+-@Go|=`NupK zP%X9TASe*5XsCLgFQt?|?ib4uH*E>0HD>zhZlHb#q@hmBYmt7s|N-UR=;SCsw;b5?eDb5V^oZt*-%E1haKpB~~ zu>;^${J76UELWD?rLo~(49Cd?hAfL*Y@Lt7)HHc^sv3uba;(07zVwq0;Cr-F}Y!T>OZm_lf9DXA=OnH#G4f=-ELJ}>ZW_+ z*PI1NX)H0wFzJ;jzuvH1D^Zyx3ol-J+o*`c>3RN*N&B-&KA&-v-OR;;iFy*6qD5Kp zizN$O_&XkxoI-2nS{kwJoN7F@EIiyOHC0H$XX+AKN}lI*d|pTvDc?Hi&c!x!%P*7U z6&sOk9V+)1f0Tw#{w2hP**bYAmcE84i z!~2yi4zTGKt_oHnVpI(5AHnt4QNOcb|MGx2@;S(N9!~ zMOvxFYlTer+8udlbYMP46e=`J@nT56J;LK~Y+0N)PX8YKBa}J=feih{9v(_PuGWG4 zaW+`tk5fcw+j*l;5$W~To-IzX%Q#qmK^{F+Lm0rN&`c6Eca$V-1N;(NWX@@-N2^}y z0SzcbJE&cO=cjL@`Dl!~cVgyLAdU79qAuJ9782BPBm~BKv|C*%*o8$HU-9N#djSp97~ zUG4Wu=d(Oc04a3t%BizP!kNHaR&30vBX=ePZ(l_qsGR_T5x*f5t#Adg7XL`!6!oL% zHt!jR_;St#6n-Jd3$u+)Stfv%yi*GdvVI^dFTAoY$623yPd1=blQ4JL;D#d8GXE|$ zlmnNU^QAU#Y+K+yAma|0HtIK$amL5gj? zPu~d#@nVFxFfT*%8=QroWiZdLgtJPKEd#XFiJ+H|qj&8FZQS=}o@iZ3uHbVz>GUs< z&YO=BkPGOH=!DFnjF$ERwo;GX_ctE@>bPsyIok+%>Ep#&F6idQ z%s{Kf@xt)K49T;*1|%BHUD>AAPwnK??|u&iKrv1L1f7$YTjW@=<_(m7s3IK4Dl5A- zGH+Zz-vh_{cO?JHZ@vI~qWuNZVmiOq{-B?tI;e9((iy_~lBkWkU6%Ohs0<}c-!)ET zIbaFs#xtz+oO?N^?1Z}@+36fIAuX)GbOL+~l>UPuu~{jO45?xsR(H*d9abWm*poqOo#(1&y^6{sk4$tOG|Q{HXf6LQDe z=tjpsPJZ@7>W^=O)9vCX@)0$KsbN{aoRi;VUR2ahcDj!>knGG?2DY?WFb?h8Q8m+T zbQ-TIH})Luu1@^0z1!s3EzZt6<8MGQoj7*=em=q}^WBYR@h=bPXYY99 zV@78S|%@LYH}o)y1A9;k-r#2wrlag~NpI}4XiPD}xba%$M<1@VTuUoG;-_Ey?}!mp&~L#|#UQyUk?rcGnI~UEN zWuzgz@fcv|9a{+ljh$?81E=X~l032h!~25f4=)p%4z>EpAqIK@S$GlOYi`U0oyuXm zyHcABiCZwC*Mp?^@)b=T_9MaV2z<+5&Nr?T+p!bn*BH4$kaslB7&IvVE`PlH>^G4H z)!R_BbEg6^+jnkFp(A}(+p9I#9Wz*B4>_|U)#pw>$XUE&wRgg z_GwcOV1OQKBv%!wrA4kj*RqRB<&R4EHx@m@H zlh-)xJjR;WC70Lf<~5+_IQ0#aj_s$u$IIM#`j9{WXv9)wLbrR}-_fWpUc2N|Om=(} zxV)idqM@G9kcsQBC3^gWOa*aIcl$$uCah$j(Gum+7>5g%f4D~@A3z0Kxv9EG2YX{AX215!P5%wq|@959-pJIRH zUXr=9v^?od^d#ALIR&TPk?a-am=mDo1Ym?W{EXCkNuq3iqu7>s)HiGSF#wNuSf_Eo z?A{sd2$;n8w^HD2@9M9C)>c$0c|Yxk$4wWvd9Juc_Vl5VZ95@?q9${i%SOUN#XfXH zEmJ(Lt!6!xnpIJtS597WI_(kvvMR)60F2mSmv?+D;O7X^JFMBJLYEd$mIc5iMqC?BvcH;@KVhaymAGX064m$Mk5J3nE0#v+XEo;@5L9oNrHs=f{uCtRa&`)CR7V1ab{ zH%OObC-dc21&+Wy9WlEjMh58K1#}`}w9#45UK$lu)AX{t-LB+Ee%DN9^gQNCOI>2H zO6KvaJrftTHor+bUU$Ase4-+X_#CQm^sNqoy*-eoi@V{Z^oexs0^<~EjQ0X}-|=sx z0@nP`{9>jj@NLi^P@2$p7sXNv?tkXfUgrqd&>~RsFT>A`4Z9+uTYwb(43a*A{FRIdawR<2A=!bp6(Wtu*cPho zB1v%<7UBKW$0WG00<8?+3s%D)T?*VBgh)RGOlqHoslBn^<0Pwo+32L79UE#aVU5}@ z#Kl|iz6hNXZX)h@|3Zoh2YKzX1P_u4_@U_x%%qT2%6| z0tk5e=cs2kpqPMHrV-+%#E7lp$d&N*xrzS?UZX?zlG*U~jawwVfP@~OpTow%%)2_o z4p)mv?glHZ=+=ik?rR@jF2~%V0GFdVvF8^}Qga%e2v5CbO=$YGOUkX8oEe#n?UrX_ z)zWL8B+s4=f=(zX`p))*kM0its{lH;3}2XT>i)JU>CZa1;MiPluBY7~7#om$2q!YT zwdo(RZXvfp1c~FADl-@gE#H0)InQKJ;S?bMgoiQ1w%V7SeH$J$sd=R`;`()lGxICg zZv6$Kq5B{cTqJHgN$r%`uU&n1iG!iUiX%=q5Hu_<485eJo_C%8_43+-sI=jJiUe4B zP?w+NTG|B{S8vxa{pY%2ax3l?NE4R1{e9GiR%WTWFUmYt8|JuaD>pMQ{1YG0m;wZ9 zosOjya%b1vl4ceXF6u+VTiG!}BKOly@tiV7hal81w5&e~GqZ3bTbWSpeD~DXVdgih zG*50d5)6c7&|1f-Qa+;%;=ax-vo2d2lZ+DL=f#dTJLj$3;W|NW6N-IvQ~svcXk{u9 zu2h^{T4c7E=tczqPkm}RGa9O6zI~fpvwf8w{n2A1i~rDQWcdW(+JDneWb}<$d>a-w zKG_)(RYu4<1kv^7SLogX^qTB4|E4UXE{K=fAQV8n5nb14Psh2J7E&qkHOS@WoJE~2 zx#msKEq=WVI?W816OE#82)6;`K_7g@Zn@C6a9n*etDb0L(1iD6H6lSR(E*SCoI)MQ z%EaQNAjQG*FI_#+sjFv^;p4GKB=Co@W&O@Td+F&&6`tDg$eUGHndN(L1~d)^%W>d4 zv3CaE-@+-|O1-1c(--+g*+HTR+ohzRhf``s^G05JP*y?>Z0QBP_q}+F*ot`=_A!pC zyexuIwc}R$*Qiz@IxE`>Zd?iioEUDWh^WcegeNjA-MWZ_NhDBZM*n z_;!@%A0(9_?Ae>YH`cNpT-*h{{N=HT3awFsUV(EQt@7s2Dl!K-(Z$BXhi#!|ccmBK zzJ%PnT~s@JHR2aHh(u0F3ECz8mb`lQaqwb{axj>0xEVl^okG)W&Xw3*s%s&a75n(? zC4s4GZ)+$3T0pz9^L|Ur=Y|a#%mz z_K0P(&@9IHi7J0O4daP@*AOp-&Mf{rwJ}N zO>~J+Gt$-lZXU;*gC=nf86f9lK|P(%iePJCNUqY@QSv$4E6 zC&%Ium8barkQ#TlArnNt65>D*CHdNQ5k?))8Ls!Q3<=QzwW`!-wMp~QLy$0YMPFo7 z5M4MRR)jCPk@EQRV0=@@&r)VhqI3T!vU%N2wZVC)c8iMDaICOG27;o z)X(b|`gz*PHl$7iH5G!h+c{o4l${9+$=RuDvlP?UevuffEh^f5#@OaARj;xy>CcE` zmS|SF5guc80~TXVfVB9pR0%kX^o352i}1UpCKP1s{pXPipi}OEbajI6F&BeS85kgO zK&zzEj;KwMGdGdZfa8Es`bha?xQT!?jl8`p3!}YFP%uaBUuG$Q2@eBQWD)ALOe_t7 zC&1%`gNgutyhT)ieS=(wOF9%j1s=kF_ya6_pf?udp)HzWSLY-;ZcDNBh?YoA7r@{^ zbAPIp%-L+=aqzi?53tqk(7o*q)VWnZw{Bt>f~5hLG5*Y#kVmR{x*Zw>j!XAnHsF$+ zayu-Dd|2%m$&O{d-9r{a!KNSKC$9CgXzh+-Tk?y$lC69j&n2dRQji`RP;kQCf;trx z!HAybYGWcdI&WI%ii*5%KN%$0ntvV6a1OCoFl!a#2?-@$95RQBY75)!-eYTv%18r` zxvRkn$)`z|!y)YODC=aixyqYT2EN7VKp_Q6LICca>MEj_Oe4e!EQAu)R ze*JAAM_ttPyagvJAKW2tR&w8FbJ`-m4hfJ};zY74>vv$StXD2eTpV9ap!_PH@#_%u zkMq$3YdADke4uB$Epk(5{=0c#q)R~H56Zgcl6P}~n#w$_$*EbAhwc-T zI)ZMu1*H$eeH8Cc=_$QPO87AzAEzUau5WbawDwF3Np3lO$y+bz9L#0mL5upzfjbwh zC>AoIhDc)~NZY*n%z>3>lhw=f`9P!rJ@_5y1|nN}yRExWHM88C_4X4j%_q#Z(}jU0 zf2Ny7`aQ0^@Cx4WOIPS1#g_oDi3n5T^F}c-e*gDf%L$P>!ciM-3vqXJ&_ijgtAp!Y zETf*?-p0w;ZwR}GE9~>vsIXn=9uYV7;XS=O{&XfCbECgm1$MMwoOdLZX_!7nN$E&U zhcZt0Fho}fRmSSD2}hg>*^;bjFvB@vhT5!@My;!cg!wGE=Ql6J<(p>S-;Mt{U%W83 z;u@A?;aDS`_}-pF%f*ShB_i@!u=vpazr-rLeVe(TMbN>X(E_ZD)9|NtT-2Ij+(Zen zMYtNQJ+0EaxGIg|v($LDjj-?=?Xb++l1E^IkI#{GdF`Nad{PUs9bUx|4xd^bb)9`h z!;{qPPYqI{1Y%q zg^m&2GMuzY@Rl0}AEJUkhU#EX)514{7+1ht7nDv(I+u-5eWfHi`?l@5R(}vo`;Pd0 zioa!MG zbY(%&nnDQc)wMaD(y5@+400ggpS0nhm7+FR-5~UKZ(W{mDr)vUB}EnObV6V|Tq>w7 zSxs$r`uy4ka6y*JweHDHL4Hj4*x=rubs921W#$PXTd&C~hL@Uk3-HEd+@Vn3jUarp zF^dEE`R z%y#Tz>LM$nsJ`Z2$|CRa;gb8&Yr$7XtynFLW4{Wdvckt@agC#P+r+JYL5xztJ^l+m zI;Va#tMa*!g>T{JylHy)8O@06EUHa_AITpO$$&x(JXf4%p(F_N?ps&leofUS@<8jA z_&JF-Lc3N^t)6Blnuzd5nT2oZbfG^ry1-e;!!$AN6`jI*i^I0RZ>Ql`<{AwD3SzX6 zQ>-Ne9%8<-9g5QIZsato3C+0uuwjtxNMU21F1d=#;ZYi!mim(?g|$H|Zz>Q>UzNTt z%vCo^o%e`=o=0r1;To}H_rUW^OzTlVuJ(;Iyo)sObh$}{dmVnEPSRyDoK-R7@!Ax1 z=PtOj2OHJb=iSB&wDJ1U`_aa;^qdJviABigI&8MP#(wy#e~^Xi1fNf$ku&ukcb$~b zWoF%18nav!k@sOsMx|1vbumwRb(yvhThkMrFyeRI4gWK`rMidnRWwscif@tg6_`Na zk*`9VbE;_n2Ak^zSih>Kd&=OoeF9<+16zVVbITl3a+zJn$G;Nsy7+WKC8D$d(hpm0 z|JQkb3}toMv%D}n9qwf&)lHtPD0rqDYbVSZ+AiN&KuuT!xlU_{&Fx7hQ&tF#O^MDe zU8HY#6@DeXET|SSM-AX5v4Vpd=-~Yn!#Ck#ZZA~97=`BsYUEeLt0K}Ft~gKl3of<_ zJIZZmQ8xdtw?E(sBh&qVJc{nLN^FrycdNOAw#rk!8c)t30~Q?+^@$EhvFgE_tu5cf zH9vK|B;^-aXVP@8^J3rp?pRbm#VE4)IGxzLqcMBuc5%x^3_m0forhQe_hpz-xF|vQ zqf)TmmG;N4{EFG{Y7Jd!DE>3~X9}#w&8EpNR3;u=K4+xI7MMGE<@10lEqYm+jj;Z-*^yAX2>-!o<8dw&ZI05YRc-Nq8B3lt> zQFqFdXX3|W7g713alDO1GouTkHk{l!@8?|X=OFcoLZ%DKK?Y{Q;8cwUtE8V28qmte z>C$c+ZXrazFZ3k~m3RdRHv2NP(2pfx6_0S9n{4I~eN$wj+dU*`NYLTS=zvQxoq zTqrTHy)UFIXH=fVn0<@lNgD}ag>-xSN29g^w7HMIV}()o)x>K39jve8tAcVZS#n(DZ^S1P@RUy}jlM{nF z`8Wslh}(4xx;_&0*l(YLpghE&{olu)D$pI}>8JpB{(5rAR^r;-Z{oqPQ4M{)<_RscI+}1`I5wwV|orzj(FyR*GrHUbICEsc}6;&|DZ-$ z-n-c0_r#Z_H$Zh*>|XQqx$FV2rvW!0*xD|)Pl`(Myx-QyR7>+obGxhJ6y}0eeCjGw zzilBbzNB7!b-$C>_4?PQndizk@(>_D&WSQTavmO@IAUnfMN@ny)%FHEvh(R9{8Akl zj{fI7V4*em4^4av*LlonMiDN|V(|06%S~H14qeYsqi4zn0o~PQV?`s_zHXy?3`g?d zNr-5I?#Vbo4~|ec3o9_L%qY7B64XWxJ2ily7-Y)?hW?l?8Foy}BC?JJBUc^`Hg4|+ zxeusvy0s%28zURI*UejR+ebM4uzqCAAVvx7HL-O43;WP-d!r(6bwa;A5;0|KP(HM2 zTk)2?D91FO@A26s?uQK^f#YS^4EpGj5-3QB92ED7Fa&}Ky3ko`oDeaL{v2|qm!5bH zg)F@>x7 z)_IdTA9$REw-_IM=JR-N^x+c2;n?#5RmlCIuM>TtO7b(xw_I$k2KJ6Mf8&-E3sy2c z7_V$9nud&|)(`!C+q-unfMel*koWH-ZIoI`r~e3jq|dgRyphT|v?pTKX;}G6M=7V* z^PO=ovt7Q@yb`R(6LfI`)i4ljNX1}zUbz_8lgG0^Kn~*1VwsRx!@SsA{7hwRHq0wCtf}Q%3wDz0(8;e$C z%tZ?v@_tNO)D?}!3+I(e+LFJC{U9(`N3T<*TW``kVa5|9pQHU_;c-NIFk@sq9DIH80etrxrc0N#lViwaa}qAnm<4Y#z9Wt=zmPZ z6cboZ0JX3%D8_-}1Ypr32t&z{{nN931ombydkbR=)(*ZNKU>XAsp z>ZUa22!Y57sYi1v|1beEC#2_~{-O1$>reLtFJp z(!9iPGq3EXryuZcv9Fe=Quaw7PTiuS2mxpFUS^|&)bs^hlJ2Y1^r2~4)V_uP4_ioF zae*Wb-yzvHpg-4lUWe)N*P}Pz>4#a<=?Cil;e$$0XIHPDJAL|LWTDmX?s+TBFm+)s zjeSqM1a})VR#4BQ-?4&&> z2x1EKN{8!iSdmnFc zw^u%|-s2tn3TJHK^$nY2%@&oO>>1sOUoda0z48j8(Y5?D&iB&Tg}?aO{>v}wY%_cd znz4xr#7a*n+iJ0LbZX9ImQEqN_u*YRSRYx8k$a5a$Trnl>IIz3>~g%xj&kEG*UfB1 zkI=2Mgd&lw+6m)_?iE0@65&Vl%)<$5mFD zEM*7pxAT|@p%1mVp?RmT;?CDCY|BkbK7fFn>ZlkCng5$F`Vi^uC!Hf8POp9-G2rkha$oH^^x7y( zhVr}lx!)fi(wh%YSRTOrWF0e$EBaVh%sD5_K}yZ_shX$HNs{6px_|lf{N{2sTOqyN zROY8uzn7^6)^uC%yy&Jrbl1p(s7&j4M8#k5`6)*D&vZQ%Yjca5a0{ETpd+yzu8`(4 z+r_`tuZH;I>H8`k1U$r*mmKG|64`whY-nLVZ)vki)Hn2Prjzmxe}5^kQTa|^@fGJ} z9MNXWn!+>Pa{|Ox&7oKjRsuD<`?ZIz*PoOuGvwkw$#Di%gln*LRv&n-w!AUo{+y%^ zS~YSo1FTAJHsn_1*>m$3w!ZuljP- zi5L5qC;hLT06BNU-Wr?$fb!dzhLH8n^Z=cmgxrt-sPgwxO)n}Qw^A_KeE+z>|agX}ZMQXw6V?LE^Jl+Ang>1v~kS}v$Ozr9Zow?u7# zOlYwUODW$FqZdUVecwKpz0}IEjWU_R)A}W2uWe+7-Hl!dxa!e1;$)+oNLQfcgO~yr zBF6GKr6bK>Ib~0b{JZE~?Vk?{&W%_#gdS%FFf31^BRt2E{^uE{ubnef5KaqI+tB(L zuzP=mdsfsW(8}zs+V$3sa-X$Y=sJd4Ab&%6OPXd}cq8L!k%RjsP~?aFfDu=SlTevM zvlY{bl665O-4$s*&DDpm=j4(`PHu)>G)`A(y}0xOEI<-cB9 zK7`d1Bru*_G??!uf?;(@j8nIuF}FRrTGI*mG1DfA*G=brxetoQt?!}gs}He~kwU^S zymEaqA%IYadM30k_N+nX1bC6#dZibuH&L0IDX+7B%@cMY$EGr`yxtZh?aPbPYU>gC zpzd^`t;z?lSJtOFN%|aO`oGag{Shysr3~C1bCR!>tN%v7H+#5a; z?xfLGY|0;;_C3NLL((#^`z-oe!-Zba*TxKsf=95(*8H`I_vC^d9< zl`wJqlfOL8nhCWBNeB225xLe7Sx%!o#-lgG-qF_bRFT=8*S2Ro{X=BI=9Tuhh}kHpSad+m4T6L(rQyVy#k+2F&Js3*JKYmykZM^^EFG$E-B?GX$K%oCWsf#B^1G&P5z~rZRVk?K zVBo=Ha4PmuU$u)0=V~hxe=SKTQW<2wn!o%e>bzEt&^$82iax2iK`{C2Sp<8Tbat3h zhyE1*h##cs09}TN#Ffm96YOW5T(XQg5*i+szs3fw?^$;)_`_7LBq_O8Y1OwL<_?Rq zzCYm0`n^Gf$L`bzvg4I-G#e(7bI~T3vF~4k)?V{cC;K}8NUeV$V%aG(jw)3!HqLas zAPeNoKc_^0B9i$I`@U~g)2|O$OLqS3mRhPY0AKH*|I+8T*qT?p7KmatLetVxa`nO_)yaImWhLH;du=W2~0VRQ6l=*G=pUawEjo%o^{_CPld1uytwBJ`Wn{bXp=7sSMN_a z0igFPG9!eFaZQ;KF?04+Rf$fLrP89~d!$k%hb23j$NT!>Tmp5m-G?;^&3F9;VxOa$ zKn#D0IpM)K?FUaNH}6jM9>DJ1*F{OdoGx-o+|dJz5VF$9>ny+w8@koyA}qGb@@-w@ z=l$LIMO)mw&%jIX{ofZhEatXL5jE(SqHqQ{|D?#X6CgG3`i%b@5DTmH+TR3Nb`Cbv z=1zbrU({_(;pcZ@`uY|3^OV>>1f=6XfmC-Fp><1#yOjfbkyE#hZg775Af{C0f9<*c ziqI~!ePXjOyiWfU0@ik%c{ICh{b7>~lQm9DvLQfvrJ?dTY@g{WYOYYKq)oE<@h5$V zLQNcWdtw=bjzg@{kH_q3&5JRZZYkyzn*}eY#F3l;6{k!x>j8~Z-;oYJr+;)|4~buc z6R!oUv}e|}&d|4kRF3cPK;i98sAvy3;6KoR&$>}*BgQBHa-4SXXgI+PC~XL*5q*3-s~!}y$U>fJ2f0Y zl8OOtml(JQC6FVD@~RNm0XPHlKis>ORslh=G|SY`070u2@f5$~f>nNI*7?s|=(w>X z?e^J=hHb+ulGn`4`pG~KyPRjD9hGbMzBTb4$6Hj&1eG+e4qxlv@f8{h~#e%PW)TmeeCC4Z3(^9_OXo#rXpQXUv5b(>TF0 zLz=_FI;N~M+`{r(cAOaxG@qZ?dA-K5I=KBs0`cD81%L#y61OjU{0${fId$>{d zXSGA+LT^2G1wz#y`7`iCUP9md{>ev*Kd)iSap_PF&yNym}fQw;nsJ$O>tiHrhAr(w}!T6 z{I$0Ny1GNVC21e4c6OVBT+l|xXpau~c_}3QFUJY{`ug>nx)OF-QHJ+XACPoFprpoA z*e1!2m;ufq(+O5%A6+;<^;1f?iaglhg8W5oG&tR%=pFuJnj`4(z8HwHt3qrB;GD=- z7%rap@)$xq0-5&_S%0^jfxt+OfTtHWt>+lHC2&4Ec3Z4E%xRtchp?)Ei@2dof{ss# zDdhI(oW6J=@8k6=F@+arTsxkUk?vpWr}zYp&i|D;(Z+8mU}sF22TX|n*0yh$d6qxXd5rL#%3B-4)DYk^u^kFG2o8Xh%3FVddlGF~3q31lb) zN7P8Hm6cp_E+n$y=Ottwq4osupQxiVw|Lqr=$jK=O8Kp{7@Bdm0f$b4IwGk+DmgC0 z%U{u*GxX!GxYcv_gIf15*7dz>E9e_H_?Z^J_$cLvqZQbae1s~F(04j32v>HJeY;x* zx+MjMH{Dq#=(oL*StMyiTFzTS^Y9l$K{qPgx85zCWJM}eyf^SwJaxgLq`9x;2=;?= z{fbc5Sxt7@b2qpu8n|+m9vx`)?VK|$W=nJTj~jXF0~h=1#cXIv@jPH2uj$LbA-g^o zs32@%d0n^N@PH5W>@`;ci4}_t)H|GGFO_s03e0}@SMs8ibl7L#9BVB+_J>U*cf3b@ zc7mCE5rXUszdsbbkW0~zRS9k2*-?r1m^}`{>(<|lx6r;9{{e0M=;-_n0;0F=-a?YZ zT2OSWFK)hguz75x-C|TR=we{!q@QRmqR>euIWdj@9m0bxP6n%t%HX84M5jU@rm;Si z^-02noOW5kFL$4?0^#%2%Jrn0EHQNX3_=d*#Q+MdvQ^Yzypv zTSgfOEu5j0Q{vdY);yRRwq~X&!QMbVgf76@6OqvG_+O)QLbZ-XBH3mS5=c8%p0I0w zp{z0EEjH& zq*phl3Fd^g8$i~F{~TiApm4AI9kT=bm8(sJ9ZSxq)0;G&!bBQe(cNY>^H*g={3qL; zsfhkLsFIMy-TtBtDNYD1!NVaxTwNq8V4z_XKB7OrX(qkb`*D^hKd56uWMVS0e#kz_ zfb9C$=ptSds9qEs3JVg>AW)nv{0pWkqP+0Q_cVo$*{jshDAHZA{wP#OqwZeH%}JBN zjeQz+vdW~#**kJX-UpP>Sai1^9)(rk5yOtP%;xln$E|C9aip#?4sWnKiZP`>aGwYk zB#sA(5IZpB4IwU9C+iAOv1P07ie ze!M)tbb%eqmCzQTh{5A>I~BNI#lBJZwu{4x<|mv?Ze3XM^OPp&9&>*P)pz#Gcp&R%Pl} z^x>%?$1I$_otyAEDzCK2u~GYR@IRc;LNG1|-wN|US$@|dkip9SOOmn){~*c&to>Rs^kJ(9z4 zu%f%6@dQv+2H8?1pr+K_sq8L`j=9luv3^aIFg}ZxjcMmQF z3GVK}-6eQI;qLAbBqTtP;O-VIKoZ>D-J!UZbNck{?)$pmcz@m-k1_UUueJB8Ez9Pd z>-*-U#lpNd<_eT)%Z|E3Zh=?_iAz=9z7a3~A~R$6=(+RD-qiq^q(?j(ws7N{$dk!{ zfllt!qt&v`GZ|$*l@-<7r>3` zGkoeZOFSgszg+n9CmRp@W1dP;rLaWDm>2nKye;pD<7egb{sF={uevEwLigpxjG_Hq zDYi0IXBn|x+D<^=M`o7Zw4|PGoW*XrE_|Qp4(apZ{>PQ&;If=irAy392JNYr>u)Bx z>30Ih546DJ-_GCSWDzbC%d?pwpM%7CE)v?^Ho*k;ZNIm;a~?N#sk_7QE^B^51$9<( zNo&-i3`PLvb^2}1vF}DK8Zgqvgujkl1+uGt8v$q=h&0s})3W5I?F!5S-0wY6LhG!^ zbMNKe<-Al_rWA%zr2_z-MTA!3i!>Bp!OD7UGM}O&j(Pzvd&*Hn9H3;61qor@hr$i6 zwr-(7@RXI!!p9RLNOVG{<}EptYLE$qTpz_ZL&E8OO-|^c)zdx*yjkRY!6W}zSWh(I zg7qxcc>&)=m*bOhD@aJmg2$kcIq5cg28EX;#9Soa+o?u^uO7aD*Gc~hcFgBz5HKIs zGn_r(fp;tOIUUN+2hYox>>0lTo}i+@2-cv<%@q$2n>0)J)=mE(?cc;XX{-prj7b_;|*+mtxyToOaU`gG%VT*a9f?Z#vsn$&vluRW4RP#G<(+*-Z%N1?0kIraO$&`f`;whk>a^&aS#Fm z+6lshJOUT9sB-O>jKbxq#6Ze>UbTyidVcGRTl+JQ z-%}pZ)_lGeWr8PrP&V*4*gBBK#*r%iz1Nw17rZRbbG7i$R=U|WaKlhbXM&lPcc5HD z>vK7hb)#&b!ELJdCkG-w>k`ULZ^vB$z_vfmA#yLpP*>zj{dtB?wL0-q< z`wcRu$C^vpnHH=?6@TU~DygP0z5yNEOnSMVfN=@&Cj|(+ZtlLpx7Elh1AD)Z1s{Gl zghw@L<)|a4RmTzQ19)cR8tQ;wWy&QT7F1f>Xs$it9j>o1}lAcUGrPFv0U7 z=_Y;{y?h`1>08D1tnvrSj9=v}nyxwZ23$2%FP}v5UK)$RE_N3-YO}L<6(!kbhhT#3 z7v2-&Zn=M%FTZ|85WK7}fr~3Z?Qob~31qDhN2_Zu=(|O07cyYYB9kYJ{jEn9YGMNt zx-g>PKJRQQBmCV$+1?sOdE=f?vhSB@VZslxJ(oX^j9xgQrIqhuFmy-4$$OrLkZjGz z#ICQ!llDTG-@EQTv0O(vXMVrB9EA?}jF${8%*r$QrGcS&rU!e1#G9^MdgDOQRXZ+ZE|i*OI8uhqBYHv==pBju;0G z2+E`1qD`>8cwqDqtOO|tSd*M$VptdyHY8>rZZD*LKUVm9Yn(U>fw@fVrB8-1?X%)x zgN7NAYU86{VEz(Zx?t}K@1!phTD>b})URh8OT_Y*(DnQs7XuTGuhhe1)!W4|nFloo zEQsp86I35hCF$ILc^^9i3IzGyMY%Id-pRX^W{iZ4MdQV^U-s?U9$XMqA3^{4l=B?_15RnTkfDvy!ZlS4P*_ypVK{8-IRjbjrsC* z4hTvkF8lPPERy%a+0iIV+^#*03!m(KRF4CxXF!@x6g1t5$C-4P@Lzbsp3=4;3v&}% zfQPaa-_jf#JNo3<_PSAX6?w)#U0E+N&y2VECVCei`m9Byo-pcwSJSnVvMnDzSjp>(6 zfzy9MK{_`Z-Dqbj`4^0RbEfOk6^4Yb0PhK-#4)~W?~{JJZu#@{y@{u{N5~`?+`{=x!i;xbC{9=ATsln$-V$QRzG}f`Tcr zH&Ap2B*|C5GHiJ|gzs8*8P}=ec2^0t_uM;(@j}84r=HPFAPily#X;gNP#wE|7Pzn7 z0Yxb_LXAHTLxI8|!WxL4pXW?O`1@sjot zE#71kQt1DNyK!bKW!HNcj%g%Ryeuma@CfBUFH>H^o!7j8rl8YC8B{0)f#Hml*T?e3 zCs%FatJzPB;%Fyz&)B+GojOAI%NHAfPS+ODNe@ksl4eDz^eN2EiojmtW8$dC;v>rNm#imaC%^_B%4P+*-zn7{1|d_mG`hb z$YO&4@p_Olbgo;4s?Wwyv0xvup)%vXys8&^t4L$oU(Qx~e^^Q05mGrPr&Tabxes6s z1p)aSPJs(s5amYTQTiPuk{%>v;trW|`yM#q%8N;Xwrf(J%>;pZhv?V7t2u_+$LM5b zUIEo}z(=8@^@^w5+jqa6Tmo_4TcHOnAKYom^4KJ|#(o|Cgz@+WaJ%?-Wdynb#esI5 z5A3VV(2~>O{j8($quKwG1HQGrcPM(6>6qKRAX>a#kVTWe^?m2Qb5(#D2*qgP7k6zz ztIy&bsk#n2Us^y-mQYtmi9Hl;!w`f-2t$xKSxq(2>=p0;b6*MRGKC5h#$8VL*~N?Z z9>b52#B$$4i|_3|=2xU1PDpVDH`kfRz*hhjkN`Y4PWg!T6R7~QU~;K*0_{;mSkSNF z-d*qVoNOm4#dqbs8 zeQgX1iGHdOZ8=@xkJcq)2Vynm#M51YSGicW7#|1ug^$+ z2aN$Tb8@pBo*3`cG0NIV=sf1JcKyw}`0m3um%2%OQUYYQzxRkM+M;YS4NKmL$=?7K z_6D@KbqwqG1;I?d;emd!cW!G_W6#eCfwzbLN2Ar%J9gC!9&{<(&_zhPoQN3KNuZ`Y zy`^7bj|(Zdk8hLu^O}6K!Y?Cg#!`)Iom-?&&sg@4)m?BkmE!O|OAuTaOt6iKe7p8+ z8ZF)*y*AdTg5h(qqZ$mI)h%(-n9G`ngwl?(N8t2xqT1&%8fnr|Ru-9{dR{UBl7`)H zs2dO2M1;oH^QKIJvmG^;d{w5%WXfMR;`2Av73lU1OD^Q(H(0 zltadJ7LI2x$+k*fUwl@Ms42cZ2i;X;#;}e#jjj~dY}8(#|0=SO^?B8A(7|(ET#6r_3)<}%bKufVCBlb@b7}J<>F(NHke`8Vo~A)xKOdCQIx)B z(Wek<8Ep)H`E`&Ic14QSQNB#U+K!={?cNo+2U1NB&}sf-SK|(birk^ytB&f@1iwJF ze;59Ae^53PYzP?Rd`I`HFd82_N+m{m1&{-?YbuZSY8C}Hh++b1ed?9FewNMR4*eN< zCp|u%xa*r>7*rmI|6&Wb<R;t^lk<1nwp7*ET-al=c#*JZPTq2X?u; z7lAu?y3c7%^4*8de_Z^COQB}@(T^Z^hl8B9H1zxZRC zM70v8SNwje699^Q67=C$C3;q!1&yHRSm$isp443i+F8cFL5tFxlhpg)#EBse*Ja`csRTL)3kQJCEE(ez^<)XE-|gR27v`C-1l|A z7Z>+oRlm6Fe|YOe^6k&v3AajwH&d3;9v$3#!S5^8XP&!6;NI4I==@R+<)}gZSnTyz zZhQp+&wuX=J;~%cQQtDq)483QWH&x)pLa`jpYQdbpvnARWaz4E!j?04Ke$XmL;+k6 z+dptZNc@KjuP#18VE|C=@S+WHV=`X|k-vp1GiJ~m6qnTCy;L+Xe{_j6$nU2ne9UuO zeK)_p^NwrkX=E*{=JPAShBI<;xW5MV(7>zfHqp(^&l!73?t|B{_I8rckDTTE?(;GE z`^-| z4v+?1NP~m7C~?8-GhhfyC#&8|R)@EZ`;qCQ@h1R~EqU43GSSnO3yh}^T@9Fc1>kh= zliEOsZRpS)4{%*Ouj_DuqH{B&f#-J6QTQ*O+=Uc6V()CKKEF}@3n=%1I!al)AcX`s zf$vEvp_c5I+(4R+V1uDPE^u@W9^B<<5ysj==pcmo4}^Vw(SDWYPa_(ze)0_C_x1PT zJ~G^@0nb5a$g;^L?s?>k8}ys~EUA%sDGWpv=+8cF3~)Y0>vZ1aq}EwuV4|hNg`pxe zm)L_NzN>fzG?e$%V1wj3ep;PBXCOCmkAHuu&{4`{jx$pUJSf7-0o&-&wBAo|WL4A1 zo7-6~CwxkS>^z2=fL;NnworW%1u99LlK}g=tnMYx(FP$n_sPW$ZB>hk`uZa$R1q85 z=N4AP2uNP!M~6QE6Of*1=sb-FZ7u6O;BZj%lckS^!p~>*PiqJKuKHb{T$u8yBx1(n zS{yNX-mkwP1mqeMJSl)!E|3OdClF1rMonWa$i_Gq%PdFTvxe~ZPICZIR~7cws__sa z7CCXplEnA$L31>ZuUQ~8iW(}At8HA+x%_j*fT0nggr!2jC0DF185|3z;z zQGyJ=+3l_|^r_x5`NPMqBDngSN}yR4nBm48&>lVHo;_@YrEqBoTqxfpyQ*?uvTGXg z8)e^2r@R|syoS!F=pf;ydxs62vO(Zt4P)B!hh?Wl@)0;x5hei4eZe)%Ma_RUIr)_z zi~O~661@WENL^k~75=V`_iz&3w{OZcS08BFv0C}kyft@-(CvxW+J+bVbyvN1>u|5V zi4}2|bKOOi();I8P>1vTkExLGtGqA6tN1Xd4N#PLp!>5sRABDjJbOYOdp=r&4vhav z{;Tbx51fJ;>KGFnPi$0k%nhU7e`zxIo@-?rQ^BmS_HN zHKcF#72{ZHg?=QeOHg1vS%F6lq4t?tBj6)h`VVOPx-{%ye+7IfgGzZky6upkP_TgN z1>CTk!yEiIdjs|~uWh68k)`y!0@wm^Gd(b}IE+ts9}xGgvbT1wyaTHcc`5cXuQ}Mx&g|xn)Ze9gA{;BB$wUXX0GV zMB~mM4Gqxn5gE`BO%sXOEO7GZ+w;r27^bR3M^>9Y3YyOI8Yt`bgJ2>*Uc|dVee4^} zV{p%Hl|9pZPTH0Z2cE8~OaM-0;7@+`;^teObg#C020)=pDyiQ#SuI5t$!$$xP4y|~ z8AE$V`fh9X*eGpYhQ+U6_}Y`DWbu*G{8*6E45$r59U&QQ=QZBcnzoIJ*S;V;ee z7W81zV%e}kS8QOfJlPGXl-8a(!AQt;u$>)qH;p#uRgm=M;%=>5{#|i1eZQQdTnYt` z!v44N_`j)I|F56FqKxWB{#c0Lk-6x>kzLWuw%;0~d3baL`T6W&oG-1kK~gDq(6_~E zdg!l!TMubI1u1W?Avi$r^HcR|lc|x=+=$ok0*Kx2$tdmjSkJO85^NWRk}cySNc1dm zPFbfqWY4|(gh#y-Mz0r^?vHb!s$CbR?j>x?Ubw@C&Ek4X9|qIrhRur89k{=ccG~!? zGH}Y9WpYua9W4$N?TMn~PpAPF4J4RUJ!c)fz^gr|w|L5gx4BZ+6V@~=SuHEHy3ziv zeKmU}S{-w}b5Fg+V2aV1lBnsrw5gvL@cmAyDY1)u+hv3UXrPd{CS%8T1cTsh z0EGGhp&em9AEcWpRV$IFO{$3E(Sv&Ek=X~=L(*Y%|1>&O_F*cyQiZG5F}eXGSZ6x~ zHpr3s<>QGIo0~wUKZrht`L~V*HdeXL`tSP^cd_?r=oIIzEq9ZH;r7;GL3n@oG86U& z=o>0wd3W-B&#sMQp>Buw7Q153=ORCLW7v&Z6fep;0d|@$C&3*PzY4!OsDDV?A1YWX zB+A+o%o~Ki++8d*tv*s2azaB- zQE_Tn`Fy0}{6{#Z_f&twI!XI{l-2zBH+B^?&Xuf`yfQSLlCqhH0~P<@7*PMpQE_p1 zGIOL7_?!2a0K+Nc0u9n6DhfT)(&DCqhRgcLsedGS{w4+gUiptC@86`*zbD^9lLB1- zO#b~PD$al7^!)SJhEbjAug)7-28tt|1G)|FF!vo zGy>PZ2f&hXgjU?YLSX&)f{7ZDa=fNL>eBB>0)L z9mE?P6}IvhFd`#Th7G(mDdY>H7fiss>OOR8UxdHR3M%`Zm?=*^Wv~c6q6yEkK6fYmh>%SLLE();?!7V1y!6m>{V=K>NP?LNsi877O8m%zQ zVD@(BZ7^yvib9mNUgPJna?kUFMqUaJoLFT2pJ~#)Fb}j*KSGF!bxIIp#t%pLvs09c zVi=^ArC7Hm(n$r}2AO`tSA5a5Vwd2WMkn=^ zs)76F^0Reb75j|7&^{A_xc&{y7#ADkpQug`7F-ewzoH_riP}5V&u_2 zbBe}g_Yk+5_bJud+mq}((xh_deT~IxP>S?G+9M1L|Q^r5&@2< zj*TuR1qU&#X=|cnB*1?P1;(e}3D>K})BlG5Q^_ReZl_~&O> zyz##0w76X?tlcRa2`6hRmb2h+B49_mALNR%>*=E38;F(FD#aV+i@H%Wb1Cn~OCU-P zlMAwn^L4habGVFw8~(YA1Cn#_7KrEyUuv%o^AU3^1=$t zWCNB;RTS>|haSb2OA0>@wg;A~8V3Ub&C}a|Rq({~vX&(X}4*MuS7Qm+tP1Plx zwYP)yWp-z)o+q(=XVu|m=IS-BuDXq3=o6XAuox*foPO_us;xV zT~2t8#l8-9jzcS`r1X9~2)HNDO+#1{c|KhttfMsOxr;>DfOD%3j|li7cow0UB-!g2 zvVyDEQh|Jji}Pb+-3#P4p4xmW34`-|=DQn0#efZmCT~aB8GyjwcAGIv=h;FO)i0$d z5gxBBBpuD57VW#pjVzlDXz$sVE;*RU)tp(nlUGN4~$X#Yz&JT6H9z0Rf#7KFf z<_<*ePJ6VH{KP`+w)V*CRbD){?&zm;$G16OX^q&d_Ko|pn8xVsA@K6D(K|aS-Bg0i z;x&<~VT1qtqdGjm%T1t7ME6idfBInF#c}2$`6T)w)BWsK;I#_o6=|pvHetPc ztn$u>l~Zi~;Z?e4i^%)xcRl6v&dF$E_1kfI6SrVa`eHB5{f*b-_QI~$xuK1-9iDqk zXhY=BpWRXC2z4}h8NLI)ZWu>$yN>6xPIV!dL~{FN{F&@5Co{$)`P9n|Xicd&p+;Cb zSx8)a9*%6mjUbWT{o1c!B=$1ZFo>M4^oKhI1+yM4<>2*AcBb`AQJ?Z|zb=UHgV@VO zu8T|e)6@p3+$QWe8gI=qS-0>8S%-=US(WiJn23K1^A3`TBOS!8h_&R}0m`fbBB=~N zpn+ED94wd?kyRnTYH@NtbKM{YDlM_`Ex!hA>6Yjgc~5>!y;m%}iX1u(u1PlN+hrwL zQOB(k{DP}x4?r_Kmc`NeRB%q~Y|k)@6>X#DOVAFaE&p*?YWH$}KS`TRCf;~_EUJF6 zV1fBc3EK9r_+n|FBIxahE2SsYnfgb{6znqBT}wbtl;oI0L=ofs0lGUSeji~kSHz76 z681zWKOR^({ImdmuQs?(T6FQcaX7d3dVPfjOaQ`3UYqW@k6@hd8Q84LuJCcLb0lRG zilYXeqEQavVtyvM%_qQOTdFz(KSNY6_;V-n3~)Cfn|sF?xL{V_&^`UH?-ruDYiHa% za$eAIU{*Cukqz~|s!|Z=AI87O$N*NIv8$uyVn1=U(cuO+lcwoP^;i-7wuC+Q3U!{k z6{(c3)QHHbex~=5jGlHbazmt9DJs;_e zC84>Bs);j%XRDTsB+0jk#Zeyv*ArLBRK?4O12PV&(&Ym z*%DUae|C&uHz|%rP2hXi1M2UoLU6lzVjs9^x7@;5D9$!pFLzZTahO}WC91jGL}f!{ zfgrsw{Vs-|d?uJP$CovZUGU&9@y4`f%R-hR=^l0)ko2I2@lH0oZ29flkuWXP=O%55 z)M_*8`mr2=ctgp8%GQUqV^7#Bp(klB=4;A?JB$kQcGsyT9!2QuFH7}|yg}D@uK}=8 zQ}>JA=*;+zB;#pZa6{n;e|8s+$Rrhi0dA4>hPvAmQQhV<5RMH49nJdpLJ`8lRcp_` zVhmws;Wk2i(QWeAEobTNU#`}_)uHge(JB4|1k#A7{vqSUNJexe#A>}?4t%+EDyQ1v z)MuwXj!iKep(>bT6O5^yp7>#;(FU!qcYL(Y*y1zn&ht_4=^K-9Q1D?qW!gJLyBjb< zgsJW=oQPiH{z&wuHPr}v?yHYUt5cn2BUdo}>)Z%#fh>y~U9ywQcjeKXSq5nRaN-%o>*Z|^cKV9gZFTz{pi9_n+}u(K z6SDIuz2tI)*?ogaB%rx_Uy1bEOnq&QZ{V&_RKwzw3hPGeqiXJHQ@rZAK#RxUa^6Q+ zGc|bUiV?m<Exmf?=B(esabN!qvjK zl4ZqMoZ@Dj1kll)cEE-?N5Dlo2bwCH_JpsM@>1m8*mG-=WhEMEbGg29k>x=6x5Bxj zdahfxTss8s2_VZnP`|d}PlrTv0wxfSuD4sUDzu;X7gD`H%<05yPu^wNeUJ#wYN|G> z6cxy-A*5nJP}pL(l>%#ErF1OuJ1@!u?%+jACsI0ruQ^{Ft!dn5szr!7+=NYVv zQ3#VVG_U|z zUw`yu=^6ApSh5N^Q2V#Y?)nfO@VR4fCSMi!&W89~#_jjxH@s<$$Q&Uc<$JC+po!@S znH%|daH&nfYs-^mHLPj>pdB*d!-}{^E0HyofjBb0ArUcw(+`Wh{lb%%iqDKuh)h4i zv-}h?nuMOe?|NNIPtGQ>%4vjHfcqv}kxFagGyoUzC;kT|;eMJLS7R14wrs57F+a00 z`H~ZW@cU`C8~QSQ7~dKAhT5FbfrIVokt$wIlz1hEq>9gXT^UKPEe|deYWh}gn=AOP zG+$7VkA4U_*wTDrGbOc=sbaDb{FE0&zhgCa9)e07p|1_9N6(!e3LnHKwy?^Ilmn?s z;LVV*@@&7D>$03^MGsx@rzI&QJ^yA>`ZOlPv@uxy@na9bx7+p2y@IW!c(4{<|DB>8 zV&V3wg4smv2s`MFfT4;tJoZ6|@aJeaSFifdwtBmLZVD`tQ3<&7eNLb8ZPJkF@TNfY zZ+QwODsnb>E@tQWov8CA_d2&Uojc1ZG#BC~Q!jyV?1yr#iAeM~GnYxr*q+h$ox*Qa zE+Y@Z?=|#z<~`7AC)O1{#UdCTna{!YO_Ax42xV`9O<|b9b}(3%nS`~bwR?VUsl5e; zI=Yu5?Z^Tj>%f=eiRDk zW-48dj%zRyx1xSg4!40!fqZCTU(|K=_Aa6KkmVA51vNybPm+KN>6|eP^H(^f4d%=N5K%cxK z-b@zqd0a_j>9_Xgi`PYbbjRZ^G+clkS^Jzkuw?3B-`0+(LA#e@qqYgzuLPIK;yZEH zD~W-=Mrn?+%^Kqb-{C5O#G_1+uyd=Y>KaoJW+3goz#EE{^7oCRjkIq_wh7VW>Cvfp zh$V-Kx1CYU_r=NmNXGdk%+He$l88n9Aa^`j@pl8JW^LZQ$e#<6$ag+q^2o&njjVIy zQSs;z1H_O{#6!h&0QQY{I^6cb9$h@J5W{L>Q(bzLp-X5_hB+l2es4Xbdu-jNDEjlf z$sJwO4C!#SX?^QrheAi$fYYy(k-F12O1sZUl!M0_K=fs-21$xG95!g3ueAZ6@)CpD z<2E4d^$rLT{V2f6~}a}zsx&2Y4;`5er7^eWBBZoLNK%(-+Wn*nVc7BpTIYnf+$ z*SUlWw0t_1$$`Y98gcR=6U5~#ZcZ=$0(vt(y-vi5ub?wH=_*Xl!zii?>!@ep*QLbT zXPS_n`F^sUa9Hs|-rDCGDwOlpny4oDaMxDsujLx;i@(WFAak=l$%8^DYW2R+w!O0I zN)yqwk4Jps*Mx_U@3$Pp@(!8r8M(205a1B(9Y~D^M|mIT)s%JZ*agj>eE>BCaDs-++)MOVG)xu6E55fGn=st>oA$$vNghc zo1_QQVkpI>i`xgw1ufcoO3TSBS=D_UfcEFwH^hpzmNLOwV#804uITR{h!Gu1L}J9R zSNdL$LGSbc)#Bz?u`bljU4l9vXN0Y!todO(EK4L#7xt5ihREPBImmS50^W#_o1xWH zmo2Xy`sF`f7_O|n{i+GBr3rOy(uziB;kSmxrs6f_+iF34|JcKq zRR#Zc3Wab<4%>*dOu~Nr(}Im4#6P3`i?T?NE3PjCPfvLyxoCI?c~)E&NAO zn(6p)y?3;{sQ)OL24nvxvVBHVW&;7qkdlm1%O0)uX0TF|pi&wL3vp>9zNm)RAEGAQaDcB8(Z zE`A8IgjF8fG}mhk_KzUC2>7NbmCtyCtXQ(8T-@ok$ZNqGVx9g0$lrf6tbgg}b5r2<#l1YMt@%extIeHcJHRgklfTDxrdk(Cz1)JKd~pwf zr^+=EVK4M8hJH)W@YLW?70sjfXO7HZ{FbQr!8<~EdNjdlnF9?#9cRMO(RiFSw@Y3O zPdFV;X^*r!&sU}ozEU)y*>zDe*(P$|c71AUB)t~k$vjILRK6Nmnx^f(J)k?cbNXUj zN9)~?BNz5y2)?y_o~lNw7g32;M3xoSMp>h94%I@zFZx- z<$4j`pNr^;VyGLE9%&F6gA$khrdf^HL}e~sq%A=q;`KOBTLVwO&2ReBTWdCAY_(Y)SH5*g^N~1L>VTx z6BXsFQp-1STn4sMuoVrvwbFpc-6;n6T~L>XL?z?Y)8P&w8<>kHRqR1)A^C3U zZ&S2ZiFU>|#oiY^V7m5oigMomM=kJvg&$2Z0CY;=X-MvmM(GP6TfnnVF#RoAh)1Yc zU}yKE-3%RB)7+Rmr~IGYVC;QrZL+Ff-_QnL#uVzd<)6ZN6vg>NAv1r?wV}dV@Wj)i z$rH!-OcBQLnjf(UA+<&eY&oqSG;*$vLB2OTHLtR&Zvzz5&OUTVyCaGKhHZK7&-c&Q zl5r8dw5d#@TGPf;LuWg3%QKOJC;{gmgo%^bWW5@6HMPu5J{YQA!ERB4xNwAO>V!O1N6=`dl zB_XN>iIw)a0M*Q!W>_?CW(HO&aW*0KXJMMpW(n-H864i|u@ir++*QBPO8VX{tqmH; zH3;<`J!KAGqGU}zQR0Gv%aEIcN_s@7sP{ITdd9}6B;Hz=C?lX37Tx;}q4$#+Nmq@; zb#i4$VSYxc-ZX|aJY!+dZ}8*sW0uS$3fbns`8o&>)*d59Kr~|uEa2Lb*i$IsL)LHh zUDTJQ@Q+XO{3v5A^@g1o!H+qBxQv@noTD_E?R`caY?e6e!{0mPvBuA<8%-WXB$+GDjWSFdnh7P z0uj^I4OhrqOD;2alCy2Fh!(k7VeoEF`}t>FToK_M(iE$_G5MQXqq7q;L^2|58_LPL z_%z>#euz}Ot7ew6oM=AUdYf~ z6bHxKeUif2#-2C=M39;V)n;-pjWoTUy2?nfT(ptesZdH791O0X5R4C#?oaV#$TF;# zvC}D<(v&(q*`Laf;)pn5KH5tqEi2pkB=qEt>h_uZ&hHtO%tTZfx2A4h^dOTq_N5J#!34snwFwePpIfFehWe>xr>1oZP;j173@vu zu)l)Rv@H?jJx(Uhl1{k z#j?d`$M*Lz#lb(JZz%)C%&rAw^*F0liACUK&sgJdr`#i$Ju%O4`&RrBVXs(#ic&r- zp@F)9DUP=se8iWihCM8dV2BN`Fc7VaJ^%-II)DX+Sa{gcrz4k|K7ov|4NOCR$| z`x96O%S~A8?S76T7hv3>T1(LPos(=rS7#W*fKkdxeLBs<3qp}Ay5ZBXgVr$Uj`}Dr zUyZ3p!yw>N#LQ2uSi}r5gI9H;t~EHdKkRguJB!OxEz*z3n=&cE@ znBsE+O3m!;$`W*pLOM*G^U3-B7;L*F@uBQTvzGIEZb1TIgbT*N07b*)PDcU3P zbO#!dkq_z?60$7UIYNb6UsQ#K%~gYE^rT7S36HpI2cL}xD8!c^obo;nF-U|4^RKpP z+m0HtvJ}Byt$OE9DmS25pB{nE%8kmnhItcDAK(|VF5H7^!!C;!ENiPAqm3Zq#R~Jv zAQ7#Qw#NXep;$08%XZE?sXwWF5xOI_O7*s`#|#Pa;)>8r2}BR1rsJIWoIV&g*+|TG zqAjHQaq<|&-1miJQ0wHQkyow(DnEt^I-Ls>D&>bpnjSdK{+a8pkXU%@MsiQD#JchH zGXwJjE=v>*SW(6P2qPER z+W}$jxpLyP^nNd#=azz@E zM+1kH3!ZQT=-|IZ$;PX@`{hW^{rF=!_H`Pxdqn?&h8;ms_qPx;*;cB@^ z>#0Q{0;*=Y6_uDRdBOVK8{0GPu!-2n`rRB4=5ikm<)8I;{HpSt*V(KF>&X%d@j z!tx!9EfR7L!}I<>OC(Bl$t`o2Ua;N|i;E=-i@ei%^~WdN zZ>47%w%0RcSq`ARLDgsmCd0mF6b7XaoD(7~@2f%0jSO5r$!I1K6<3x-ad}X8>1~S1 zDDbc_e7>j5jSvJ!q4}qWlzbWZh5~O1*6foGH-bLR`3|>au|(58ZXMs4PM^@*qkov( zF6c_uHmjvKf&{nTvAm7~isiJH`f~&BaQEn1ZK2AtT|VIIHYdCR@Hs$~Q66Vp;%Xiy zV~#Kot2z+8IZZzqaQtf3gV%0udaqaCP=>dzPa6Ksqaz-d2LqQu-GZ9?pgbfPrRQfW zXCOJw7S}N0#Gc$d$&$0MU^dejIg%^H>q=y3*Kv)6*C2!OmD+53_%P^xbowu}N%>Iy*nI zCH;yQXVToBKxwPp)ofcJDm@+ad!TVdMySb+e&b^|8K^xNv;o zp_eLFgy%lekQuL#!mekr3QVY&8B)TnRV%yULb!C(PFW8jRkCH#if+PtQT)YH=vLhD zP}+dHHOW`)TBs8rh;}wpkp_Nmg)NYQatZ(7QD^DkCBbqpKqk`GU2YWs!%}?i+-s(QiUpuHWz$nhT@F@j@A`T)aq%S-mCS|%p-yiWb z*vtfFy!KTF50BOO1-;PVFz8MolJA!*A6>)}KKG7L;~k=pwq`fqGm8%vB3~=Kk)@d6 zb*)!fec)s#OHkRV;xIPYmmtv$x;d1(_&gIP9b?l~Z>rDoY3EZr9EZ7Gyv^05x8UW^ zzF<3~C)(km-78#fRT|vBy;gRvtAX_G`SAoN7`Ta0#jrYbV#%r2i0<*o>ZcLhlM?_^ z22*&nsg*p52mkvNuDm@re|(L$03@#! z6b?U}u7~2-_TLP&V}6Vjq8NJwKHk`Y`1><;KaG!;tlc~VoL~q8&zts;{LKG^k-S0= z^d_alghY?-VL)VD@UV)Zzu4&gG)Yk10=2?mza$lDk;f^hm3lY9yZs_7Yolk{xRY0V zca~NZwZ<;_fRvA$2L8$X&x1fUxt~!V_B#}fKi!mu{}k69V;>B_4!dz5tjbIi3Jw-` zmZ5VE=0i`!j`+|aHo!u;i^@pg!$%d4tVQfW)ev-|f~JZ(&V54d`c4lkd+%HXYYPo) zD5nxPBoOdGF41Cj-=BMKXpMRc13ScQMd>JsCAS<3KpA8?T^PvQ<8uS{N1wjkq0sE& zBFuD8%8!~gDD7^v&+0;;2xU64)U3#rAzo(!jbwiw5U5d9DrBte}N`XNpT>mBnQ z3;Q(y`40Jein}T`+8xBkvGexcUhvBNg1jk4;NwNFW*$a)Wum^3j!q>s>br{iZEy(k zGU6>vUklrVEOC7r7*+rNu3MAul{|3kl3t#nM3o=FiVYeP?!@U%O_j98l# zb}9pJmKJYa7YMc(ft|8@(iz1#(ZtpJ;JJ!hX>Pu0#5w4ycs87DZttN&n}%3Cn>jZcdhJ!U2h!B3V_dj(!6%Vv0!&|fCHAbF6> zEu70lC+I5nrYtA*C?Cw90xZac-ekcG=S)Z8vggklCj3Km{`D=T;uD7&` zp?4fX(1X~O)JF$ql8h8212ai{c6r)7<*$(8#jb9Ip%Ei!a+r+T-wNVI_)OYivoaNx z$GLcz2ElhjvL%A=14u;1e^sAtHKX>PZz$JmaV1LjbUrGdZ0b!x4~GxK&AppVM7OWz ztYID!hu@RjV9*Rd^>txRrujUG3fXXKK`_^=dYar~3PSzr8Vfe8T1xX7hcj4`NRl00 zg^a$VpwmSnzNWB?AibtcLs`kNtu$&#uY@gp!NT{=5`Wb(7(8==9sFlQ+R#IDfJyY< zsjxQK!0*p;BU2vUbF7DubsI?7FF`&)0R>&TF|{DG?@Z`{4%Q_$E{*J`qPwp9zRTwY zyvL=MI(QrWsT3JtMs(jZzOca1BoJ-5JO<`hEqA?E&dJc&BX-y0_YsW_Se{32}rxu6}$D+F;DO870bo zhJ!J$=qJ17F`t?q@j=kBEzQouup>p`G49(@bjkW&36+*M>GD z(zx53GF9k>u=%yjPf4YF(2}-9Gd?1Uv=_md&UFfqlJ6zBfJD#Njm+iEGg3{Dz>sLf zI-j5Ql?!gdW98%cb!Nwsmf!WI@7&E`v=@yKkO(7Hh%TCuDqE|`4b`;4?XBK-;y?{k znVk1z9??h)m0c7ROGcSWD{LEVkku{;WA&&J_fc`qWCv6n{Vl`7DyRg7L()&`s|;N{ zOu86S%0g{sz;>&nB_pDDSEkxD9~Jt>vYgWcBOtz`I{U^$#CMNMK1Tzz)Ju+}}(Tlsk&Z}s%6DtMY{zK1Sr zSE7hSTOfpt>1Hb$&9Hc6-?*!@i8G_A{}HVBVLq6waI@~sNd1$*;m-dht8%af36xM? zHilcP-sT9jp@XCxx-rOV-F}u}NZ;V)O1m;X5!Gcx%NtUSq9^K6sJq5vn2(7@99|kx zPPpLkpqIrlI+x&n`Bj1Rtler2@);;FU&Tq-y=2s=CgE(m|E|iiaqEy4(<#sz*}7dZG;2OwrlIC!O6POStr=lW=6FNvBOHvYKoF1X(y?~@fs^8b zX?Den?O4;u2M=wYh$NGM>5s~&b|RiZHQq-ZJ3x5i)bI}u(d)~VsVcl$(scxLyNXY+ zZtA(7I7aI-u<72YM`vN*Iy57pct&M`;J?y8@Y)__m5BI_zK)FBI8uS zi$`tgfov>22RMDRrUEyU1@!&Z^XB!##6?>8psB9dw9y@;i}CYmBAk+un@{LFHaHRr z*wrq-i_P5!Mbki6tyA?^Uh$O@45o}#IMn(aYct&AAUwXOJp#%amwdOvH0iVo+2Q~u zX*sUwTKDQo7dCETFZKO%T@=|^DE6);d!VDj>SW5Pfd1w1G17|A^_+8Tw>-nXC1iYn zrUp{Z#=FopMBXc+-A=AXX|dKg|1YlIDLk{S+Zs)U z72CFL+qP{~oK(z;?NqFa@y51oRczZn?^^rY&;I^%J1-{2>=?bZHhTB_yvYy-x7Zx82AJ4 zb^x<9F3!Ch??aTI{A^>I;1Zp+oyT3O935zECOYvaXcD;{@eZ4I3DQUmJZ{4HCK?4* zPY!ns%3N+GF!>Oj;vFJtetuiQ=W^fi)79G(*G0M~>&ayvr&tK%&V>I77mf>?)@Kt( zYcqYe7Q0d(54+sW?7m?ff0xX>`o>usgRa1qG5@Aa}e@GeC z(*|ET5Ib)UM^;E1Wkf6V8px z@I|A{21x+>Uy4mi{|b0YT(N-@i+K>m-OKqKf|Uaa<8M9d{ooyM<%uf4-Jc>6?qfps z?TrkEw8$nG;4WZn`I8cFW1~Wnlj+dSU{fqr;4d-4(%SIKl=dmP4{|oq(Y1;mw49rk z{VxDW6-P%O_##T1$bgSi^f^6}a5G@QFv7alzNhtz<14raW( zX87XajGKca^Myw6P;~*Lk4@(w))(frzyg4kl@{(yUf9RyMLWDvp0ln904tppUy-gogask+pVC9>+|m}_i106R8l^AV0Q$a6zFYEzS$0!j(_vMW_w*TQScpeJ zw4p}!P%1FNpo`A86RKsXh6A!@-R7}^3wCis5{KK$cJA<6J^@N1A+{%q%9gB!>3$7+ z@O)f>^N}V{^DD+fvcJVBHqbMC3dwnItxes?3R@lI5rfa?M z>)permar4|F5MvgdenUd`b}StVr_5~!%rY`SAp;cks9C0MtV^Gv zsl+?J*Q6#K|N2PhL3Y`N{lk=`E^8pI0t3;+#kCxwqSTOw2BD({6N#Bz&;!dNJ9ign z4UsLX76tUQ=t`^@W$!<56dc2N1KntodAfI$1=xUSu6G^g`{32zEA!CfJ~II=r_S7J z0MCcR)jKQ{s#B~?QK!JN7xoxfJHG^{pDP>838lM{_b~^?7SlQYpZgVQSN47n*K~{g zlT66&C*4njnbU&PfvHb>qs>IZZ(ZLT|=bG|7&sknASRRt;n&XE=)>h{@~+Ij0rufOR?42$LTDRrxx?xZX*GMJW+5;7fko z8e`brYbu}m)E8qw0VFB}WgU=!O{Y!yGSFc2^orAGuTX$Sm7t!WF`%t#OIwOe%}K{2 z%39i=HX<*-P{Y_*c!??r^FVD$+g<7$d$Aglaem*`|2E-C!wEixUyMcHS^)0hhp`0B z0O+c`H0x7{{nNCJ62))Krd$-*g0hwQoMA5{Pex@g-aIWb>+woY6TtrU1xluB658}A zUc#NKp}Uo;e>dBuNZV`F4bY-fkUJeD!=eT!#akLrMVB*rfRR2OBWt)j9sF*3(-npJ zU}7VxW-jZhmOtv%H%Jmc)@Y4PMaKYI_G?Y6(nTXsqvhcaUyaY1z1gIzbwMfzDrE5G zaE`pnjoY@1tZ8ui=T*Yzx5PH5zcv`N(K0S90u*HFVpUO}lThaLqVJ#ZdrWTX+b&g@ z+xsSYv7aJe=@8ny-B;I_qNh#_Rv=vN;Uq<9kSPzF(QycBIfLv(xg!0A!^XjrZT^tp zfvzN@;IjA{CC8=c1NWgmy2Z5?8{Dj}r&DT<{O+0_Per=&1Jq#>@K)En2?#G817rk4 z*6WtiTRaRz%lj#r5CysHNHdRCp{Cggb6x9wnJt;ycs-7o~TnY zqk$+|b2CQlZHo7d`=lCwl;m9xTG79w!Ghc!>hDoH5mCeh)BlB5m$K#lK^Gdu*dG+} z=ebRg&sQ)C{BLixm<#-`%!eyZz*nrnmYCOdIsDm4ENNf2d;P$j&_^7`Gu83~C z=O)Zp<^Vfg2Z#LRv~VC;#&A{%W0vXJ00u^A&+}Rv-PGNRPf?6?hYy)P><*j^XEG^X zicQgM&yh_r>FYafq30zSxL~*WI#uaSQzaCtePm0 zg#H+5fFTXA4xl(tp3{Aq46@vA5vLMT3NxdT5$CE;YK4!XQF0to2F*^C>REKqr9m@} zn)i`7|E{gmqfm&2v2cNb)(Ahefs6Fg<4PN2KWB8GmV3{|P+)KStCQw9WRnHyuyS}n zArE%f=M^$X;)*bXl@O)@?X_xwJn(CnS+`xRpQcwO)#@0;S#{UCa=1AFloF#8tGTOd z4Q=WWjfCzArrkPPSXr9>$zW%}!bwdD^`!&B=5-;2^@fp|-r}kCv+DJDTA>I&X=q8@ zT;Gmq3^3qa8WnQ_RS7x7AiN?%Oy)>AAa%P!E5?A&oQZUEM--=6G>vBMnH=cJ;-PQd zSRRO=>ubD40e#ttf^Kn{?rKI4zza)iNi{L)`@5s4)LO?~%5Eppmd<|CmQ<|L)0c&v zRdfBvE(D7zhuiX<|9cS58(fIQ4?207oDG0nRo~e9J~#c|fn{?MuKddD>JLNCCxXt( ze#gavH1bp(c7$}&;KGwgVVJBal*U(2v6O4`oyz>uhiOup2?=J+0u8~qQb^36)Y5Ag z&gG7BY*;5Q^?xs#WHizhH@?0ES_<;zP28?{747sw@Oo$eAtyJF@3hWI* zpn+$a+UR*4$eWBD0So=Kqa~lsD_*!Yzil1S2 z{P?nQjD0>NmnlbA-0I(Z%nE4y=~N&N>*Hd}{TZkZf&6I94a*k1I9y_6o2qvH@Z1bh zJjha4D|>qNRh^|maD9K-R=mpWwe5oa5$YFn5%~<`t&U!^ad-3BP?c?Bsb!ZExnsQk zR26Zt?IDWt)7I`XW^=8Gn4St6dURJ!Ob!l}(zR3+WZ&lfHn`7;`d-UgN6I}KzlBdS z-B}6>Mk%h!rwK&bhmnOBv>`23P$j?wNtIa0+-#oen~8@$mEH^TsM0>ENrf(lRuJgq ze4(VkG!pTIQ>_RYHqTGo<3!?gq*u8$mIh3E0hLe_J6&Q?-ER(0NyLFit<-`f*bzjx z(nb+I2_$IN?$KQU&rtAu{AzMVlm%1JTv}l+Lhg2aXr7;ld{n|^jm#-Tf3G~Uz-RL# zZ+`2+5rKlQ{asB!X<+uiDH&C&0q;EtLGQO(-X_PRb0fSsb@eD_deJ`SPqJdHw<)EQ zzL!uZm;J`2l}aWNb$04~gUJri_hR#(fvSiFb}Mx~m` z7Cv@*eq6FB??VM-4-Xx@Ps#n#0me8j`jmK z+X39Jf5|7?F=U%@>D=rEm5nthvG-;fUY*}BQP~UmMl$}0GWf)sGuI{k7G3bxC;-8$ z6mu;ltA!-YqM>$AYVaD7ZYuCx-aT%boJB&{DNVsqL%>A}Q)nylT;4u*4=(J7F+(D$ zw?w`=-THh4EjC&r%EB?_#c|!a<6T{XaYr&AZ?6NllYq=->qfDT0BSM~wVAQy9`lQ! zDT?PfND?lOM#aj1R=r?!iS4@@W7plZ&cf{)wEHtFt=J$B{W2Q-jN16l2FV4t{((B#4k_7;i-*7d zy|xBYj&D8F*UCrr73A&laN~euxFBCtx8t!ODolXP2(3D0QB(v3!B0vFH48=^)t&{d zcR$Y*z~?n9sUoYsWv)C9Ewu6Rw-nzrD^KWNCSv-=um9c zHXH=eqXnc2Yw^44!MO`aSyH}iscJ{J@<6b|8SAwF7=!D=@;5I~G=KEe`^$nf2rhQZ z!728?A&Pfq%sUpBTGn)sD_W)r2+0GBz2C-YO`R-Iaqsb(fq(knpGpjaHlhqsKJ*YC zOsPNDVe90&c6bbUnazNQpRg6< z>;vz~X*00w+KHP0l61NeF1XU3(AU*c9w~G}4Wp{-d(tFTFD;|mmJ7}GSS@F|ol<3A zF`@*XWV%HrFoH-63?>B6czb?x=n4o#`2Y2TKC3LKe*`XYNq2^8(=+B;4wlyGm?)xyfeq~f=g6E>-sx{k$+axF2P-a4lpuk-nP_MXX97U!v>qqygP(91GnttF~Iog#B- z{X8gQ`=I!sDBW2e;k~0WH@@R}*UN?i`>b@)m0L1x8LXb< zPb=XT9tCF5JqU<0%Y}V=lYNc9v-7_p672SU+CLyyMTqoUKupmW@(!gOU9}e4d^6DD zyBl~?d7TjD4xi>DJz!Jnw3Tb}0L6M9Xe{vby6#uh+qUJ-mwy-tDZqYIvg6r1e#9(% zCNS)NpNxW)_?612k2z&0)nzv^#`x}$SnfZP@MrZ|_WhSa^|G5HSiZ{!-Tul{?S+YA zSQI^H6l|DvpZco_ID*0hK#Qt-s%bz};KoY9`aL_OR|FtfV0sZ7v_WIiclo zh1xCt@!f>Yd*3+LGhcndD)Vc&X4yIK%y7%T`OMFJxc^(~?6EnVTE7$%?ncR?cHUyE z4J{0o0?fv?yg+RM1O4X${)>^97b-$Y(yg*OKq6(P*ZnRR*0WiCfv3$i^Oc%s9A%t~ zcJZjJG7s?(Fs=dJI&u;$4HCl-I@R_@L7f_HOQ|#|4Ki{4sMGghcTk-1Jd&~|4CW#7 zp;e}8T)Z6;Cy-S^OVa`iJJN{8%)-8an#KmhP~?x&8_5RkO=JIr-K_-_8D5yTldi*MWYU+T!Xev_?$ES8v&P ziRpBzoqZTmz*{GW5)`cK_HY>$o9Ju)!CG|ezDg~ovJG@ zGp=>@<6_LfQTKM7=+DM%0hE`wDdc2PD~xSKPc4ij(8BMesfwdG(Fa`XaWm9wnY{=~ zM^&!Ya8nV~xW4xf@6vhlbzB*AcM1_{CsJ%#DPKv?gYgf~9>I~w#~ej}n=7J>-5|fx z*~7#w_0K{QrDZ4o*ZZJ;Y~A-#{m3)>Z}+p?5}KZ9^8u>!^aLJ-7 z+~%h0YY3k(3Iuewj%_tnw+Kp^a3+^WUzf&~Tf4iY0Y$a1kNURnBD>6g;pNuzUoot6 z2>5TgrM9dj)Dk^dBp_q|cNw4%s$;_)jLT*rMp!1}8de zf?TM`LM~vtXvEC6fu4>!QoGDgqOi_%@T*bbU%iH?f%??|gr(}s_+T|TIUVe)-M22`B(4)ahK+b=gpdUI8qnCW{=BNrf zZ@$F~RNe^jRyx~32h1Y4UIMP(Mree|!4jB@#^(sC8l3|CFQ4T5(#2xpCI{10@N{uf zqI^|*`iI+SsrDH?=7Y8xLv@wy>y(uhqJ*g_jik95S%s&1KwBH>mnW0CIY5t=`W#k^ z0N85vna(Q(wT6vN{&L@56^hY*8xD7BPSgDDi2GE0>MHhn`s-Ft#sa}9U1rv~Eb#hc z7ak$BB35?MZ!^(|!3wH*-PuboD6PP3MJHx{e3)Fwn!R0QBwGFeiKNAJ9A=`=V#NEM z7}8*(Lrhi1Q6^I8J$xq&+A3yS^H*}P=j34cw_87BcBa&s?|1(kAb48c=Q0+_gT%&P zL6SK+%*WyU`g%EDJ!AYj^1nFCscnUFc6}kM?~-jelyxfurGij^B^nxo=!?N1C}6^2 z7v5wPMDq)w!b#g!!6-r*h{N(r4@jN9EhjpNE|a*A2ljc_5|N#tR5`%g%H;riQUo)E zMRt!_+4u`v2XZ9TR=($ki@vlKI1q{LO{tyj-W@rBV86@^V+zaHXDJ|Et^GqbYgx?9 zdw8THQDWN+RGjjfAmlm_(JHFek=ZGt_%F-M>j@3k1``$CeU9hlNvQXr|A=5F_pzNM zhV!zCJG~MQjs>q%)qDtiCfLv1ulRJ@%sHs}_eXcwKnR#Gr-#qsuV_jVIi~6hlbx{O zyOLaC*2}IJB(RZ?$RdIdPt%WrsJAzV%`ZGh;K<0A8epS_y|1_V#qQ#cEQG$3VE^_M z;1H(IOO7#cT~9Th-S_*RE#;u0L%!qm?fXN;1Z9NWjERsix7Qc%^~^5$RM=c=kZu^m zx8bWV{s^w-i&$<=AYXFh`%a|G>9h3(XUHoJVFim%-+1)$bpOrSn?U9ulS&KDTd5W! z!rwaH<31PHP@vda-#01ER%3Mbb6%q=f17{H@9Q%&xBH8DGSXv{FjT6y>qngQ+Suz;k<34$tqxO3A2dfJ3qUGUtiBV!|3!cfaUOj^W2^uKxuYHco#j7(+e^+N0bGr134 znZ{*rct_h~`QnM&Kk0$AqQdj1DoQo<`A(39^wbh?Jo`rDAzs|&66UI2l-EG}lI354 zcMS`{PYvx>>qkr{VBgpE?k|B9PZJ^=_eGD?OR^I91?7w+I=FZwu2-7+U~VQ775tw; zcD)0JIZiBq9pguvDFIBP*%CD0ptVMgB`8qh1D@jhfxx8o z>QODUri!&XHk~3k5Lnaw>eJ>oIfLnPvnB1o}E_c?B>VoPu$09 zIE3LNMuW=~y$c;_$e;l@jzW%OZ8~dlaIMPd0fJkP15piSo(9GZ?x^rMv86B9V;q6M zXP@(pR4BL$YbMetrCA5kqxE^`aQ;%xm#A{PEF~h^*zDvk{W3`)|v<)2<2U5x!n8L zVU5O{{TejychBh?HxJ=)?rcUCn(4rg9WHKd7)J`D$YVS_XrXyqon^N;L#E;F1Fhvc zl&>d!YWXJY*%iD3#3&jE(7b{%BVnVx(}#!xK?8=VKT=YMc51fgZ95(gI0CW-YmhC3 z4?n`O`iimNH5g0s`l1fe_X4q)e$9@W@!;g@sO7-VG-b#^e$n4h5hZCGc{1E@aiPEB z@}S2Yth;fe$2@HZ$%*$mw34Wnc_1_ZCJP!4)OrL_>xo@v0i1cEe?~!so)yI@f|-7d z+EMi=hP_A14F{}H`G}Fs3#Thb%MJHB&{NKrVIvL*d0$jUy5y_GIjPecWF8fGf3cYS5sUf8|liHu%2^N18$+Q!53GggTOQjAJ3ot_LOCl zL*~594K6ud`8p?`(2KY*=;}7-=IMmiL$ofAJw8TuQ$Jtk&7P^;`KCD=T|J$XUlf5YIS7b zfI$59^0aZ};F7o0m?oMrCDzGL$L`N&Y|9>>@F{O7Vhv`-U&^DgI1EgjiWW)zoj^GE zo0-YvXpZNG$)5c;R{vDdMB?u%3&&L#Q)P-rxX5Lnei(S>9?NZaodV^ESvs z)FBmg@wf7dE5$1j4}an{Vn|(MA;Er=30CT)>jF9KQ1J7Sby9|L~4d0 zJ>J^#V$w(9X*ZBL4=>S0;px|FwAV{s5h_e%{2>hu$5x)BvlwnrGq#IG)ctexo+;Qo zaDD`ZRxiRS*@jR0zDd`Bh1%7wsE5BvBn-uc0g;VfkbEC-`vQX$)8gx%Z1jhoekr0d zs(E$_R4nO-XaQfzES@d%zqH^aKhF=`*5PU4FtuJQOHhBbdbmk^*Gk7=Y@aoQmF7V! zzUf0Gmbiu>`7<|;kCtjB7ymSl2r`wfijo#|S9 z2IVS3jk%u(|5r-pUXIOf1WgtDXJ1cxykPKdw6)2zA-#msQE4{>cOUG&l(E|nCoW#` zUHRWMeBoxp$)O&&m_IP&$SXQx&|~n|yWY{DIncWTl&1F+p=lztcMFk>TG^PvQlH1u z(|KqwrmoXwbJAy{sqhXJ=Vdny#Y`ybw=D0 zs85vo6}S?znvi+0sju!Dk1lonf$@G!W32X1L&V$|6KnN*$=o_%EntaL(Jc*=``Pro z9iixU!+@T~ZQ-VgS-IXPIb7Hv)MR(U=@Yl6WiKq-Ivd4lp7ue}5AaBr=`E9wWpzdz zHj3GnorU4CoDs70PI$A7x|^UDAEF4w;M z?eX-?;f*oql9ae)FLdtCuF`bk`duCLtdHvJ@CV})N7gAGRZN#uc=~WD;{l4DSOQf? zVP5aet^n3sEb# z>!8U`V=6;#+`aAvli!yM0iL%R;+fOZnRugBl?TVI0)C%B(V?NB-`l|*l1PPhc@d|f zUgf~c>F>xPXglzQ;TVdkz2@m@`sOD83%lN`L3NDO+^+f#fAwa%rsFBb#?|^ZAXerk zE-64Zybz4Z0|sgwmKJciv-d?P9Gv_zmP_ejI}Y)0`M6LVq(wmC`OIr8B)6=g`8AIz%M zU1mZ>7pHGQR29CLkBGO3bu4nfECDRo)HSKnW&x2!C=@>1Uf9{?II({(1A5?Be5EF< zdYnZa!X#S>``!AbSqZ!9uIRcQVL_4|iprcKRoUT)y}b0jb#w9Jv6>_#2ZPQ$ANzAU z@Y?6esRVz%DB1S5bQ)W;WX;O?lBxwA1>dS$GX-)rNB8@#rv{fw$FH{BxNabvdDrdl z)A@e0@5aT0&tYY&{{HRm$=W_nS%ZgI=H2YfBZlF9uUTOA z$p*2CE~hb64Z|?b@OZfeWz7~?x5t&z$FDU5r{^ITIp8SOrDnnqrU!sjNJi<88>^Q8ANXaYkw{1?%#G_uw?xLdmwk}@YtWd_4x=SCth z(5{xU)|%qMx9pc>8#JG5A(EAd3`NrNP4zT;Dj{22sg zlsz>8)z->dV08KwDi-MBCa@|mzgt>s^ARcyUr0k!&R<3hsbC;5(7tkK*nR0Om zKA#?*!1Cn_AgaLGwhaU=2#>^V`T1R%-&*_jt(tOeGzsv>CsY|%ptNy0qMVohj>*q; zk(y?lI3L$p?O{ll^|tjyq|Jm*PuA}M|P)oYCexg+SmtF^T%ce&TW9=;}z_k^RAQ@;6lN&~=B7FfJFmi0Pc(mAO_pfDVyaLVmD#)?ud29N;#61SNB`H<+#jsZOfw`8yI2{ zi)Guw5$ksjo2sJHVzwg+r2Bdb7-FMqY~fMa0>pgCX8>CD8M_-9DQgt8Ps1f~xeE1=FtmUU%{(p8o}P+E{6oI~rOx4UbSM?B3s~K}g7ey#nvN^*wnH`5 zT5~Qusyr@SSD_Nj1rw}b7=@MHaJFH=Z)|1R;u+4ECw>?v}O&biYdCwgm7U^hz|Pqw1Nw z<+BK>DAJ4}H#-*C$l9<1g58kMYBY9)&B%g|0o%JXE8SxCruQL}${A8ioM$39K|P`W zK(^c-lLvtSP^u4qeKa!!=bqvhudYb?~> zUQt!$n12N_82^fKHI57n+Uvo?ur)BiXORO*vfIZuB=KA}I%=An5I?TEW@ z?(%zG%+dD}1lyXH8|$=ehl)%aE|^N4Hn*?>5+>|{r_sKS|6rO>m>3R2bKInHlTyGB z>^aJFNvd|_X&d%Kmb`@ z4Y0a~Ui&UE8c04p)md}FMdH*N-N=in=Ix-d7b_*_-Q3Ya7n_&R&WlfRUJSB3!nJC| z9v*H%S~x;7*v?MdEU$6tFN_|M09)=n0%5za2Kyg>#^dW_lVX4bxI!j2B4i4rv1HaQ zV@X+X$Z5ZFByYyKZ-$~wxf88E=l#W!3MC8+IXiZ7=tQJx0yk-*+9D7ZMbCsoZG^T% zsGOHThqJRkr(;*D1^dqvA*tMnB+%Qj{vQjKM8~DVs_;f{SAVFRmaHNXyO8)r)A01F9V%ocpJSU_>=r!eiml5h_Ttu+jcB(l3Jc}pLNq;zujuuopD zU)#1iJ|g;4)3{_VazvT~HXB~+oSJkTGS_3Q_%zj_xiBFQS}(ZuV9q(|l@`fl>?~Mr z@TJxhFUUT%obLl-{`MzjQ zvIV@`HpcLHvnBJD9r*OMw1*=b0sS34G_pA10MQctxpjh0Ah*+ABvGQ0;(+#tbObln z=%~GjA^RFAqTM2sIkCrsd=B)$VG^XO~cc&u<(0PECBj3Y?$v z$hC3b0^LF{^OeOlwFY%9?ux0gut@LQ26irS$}pNvqTx%5c4iH22;N%+Rh zWRk{1Dz`$i*ZYMvN1pYe!F+&Uo=A()P_T7R`Sq{wc$EvzDs8c+q@u`jfC+%;tI{&} z%)d;EOw}li<>Htr()K?*EpWs2!iTmpT*;h6kkrB1!?6*1LEUtwbY8WaDHb*jPjNhJ ztfhUpAB!NUX2fvRlTixuB)+YMe`v>|r@plJ#m;)f~~wZsp8=5K7o^SxlB*~qZ*r#uEy~5aB{DC_EBSyec=FR_|2_X z0B=p$5AjbRD2Gr*#mw_}yo$h;tJ2diAxV;OXJ?%l^`3v?Qplw6tK>4LwGhF71>SEL z{o|G~e_*ze=KC5N;(k~WVrst`m|Y~XRbSab9M1^oVQ^oC7z)b$ZO){FpHJ0>_nC&CPsWf;0(&K_nI0h+6sGCl9_+qOJM8 zcs1LzOm5Q26S`J_4J0t>=Q6_k*_yZuTj7Sm6*eB9~Tyc*yDNA+Jj-;Zg`S*YZii_VJf?kB!=fbtCYB6qV zI6xtDc`OfWef+f}0h%ROLVHAHeuM~a!lfMf1oIyin8NX(au4iUYw{X<&*lg<$Jv~{>Z!8%DoD5x*%G4onD zhIX{<7&dDBF)OEp>m4#qf3A-8i-FW1h%eL_d%-ISvQGlXW0M2lKc@J3r9Jk45+&6G zDQy-y(SOCFdczNk87d~PWs09&SB|*C6_lb2&0a<`r{Ad098289&x9^#KVUUxc`j)5 zn$AIxzw~b7sQe2Lw?Gbt=OWv@s{ZlZ%3aD~jfVd)t}1@ONc8dFk?1X#H97}w-dX?b zX25$$1ArTc_&jaM-~Q+(Ry}$cP#mb+xmUw86_%MX>`*P}ANf~sm@0rr^zhfC;dSc0 zYr+_m*8#}1o|JCRJ2Hpb6TV!Hnh%TIP#>dFXwFN*{%Agbuqj(kwT)VTPZR^p4y1fEtyLd^Nb244C)j`JIyFjLcz z{aqXa;>c(UI{+eI2`EGO4S?-VM_Ap7-qEs$p64g`dHQK|5>Q)O0)bgk$xtiFOiWL1z z%Euc34KYLbzjvn&sk%_WQDBkO;)Up?`cq!#&a=j8)40R7a`gW1j~fpUdzdv_lV_w| zJfVzQu%MWFOI0R>fHX*H@X-)wDIB>%m8k$yOj*U{$)izV4wK_<^;W`|5UDdg?>Q(X z!>a3g85sx0{1ItPvgYCHRz4%C{<4_gY~pTYH9~xZ%?^=!OHRl!yOX*usEb$nv1D{n zg5bBy-J_IsSSFQ^`%^QKa`KJ7dCN?5+f3e_CVHfU=PHMfK^48Q%Pv~Mz5l=?aaJYi z`Z9HOqYo3LW-Bw$m}Hz`)mrC*!R+75X6zT$nB8OgNS}etBnkR+rv-<*`MUkQMQu&r zbkIgoH(^kzFB=o>2|Abm{>4$?9!Y~0HKc^$&mKf#0b zw{}d7aKyhk8iA+g1g3;FDf<6*0`>l=*APZrpJ)x*TCIN}dItPHAL;Etua9gOKGSPh z=L_4r_NN@y4#+u`mtjN0c7pN+RTjoRsmi$O8I85A4?%G&(|v-JD~^--P=wKv%;GJNU6w5Ds6 z8fmQ*PczcgvStbQ;@6!JO>Vb=x3+*^^eemv{Z0WfzFbX4L~6vkW_i&^6vOv3 zOlMNJ`!j)q!g0f9=JUAr1pfsxnfBq63@C+$JbH1RfIa6BX`-xy z$l2Py^+|t!C*LH3&G9o1FSq6g7L1dC;p;dD<1?N@VeP9;2ock4Ctls<9C{a;ConoD z261d*0%OxBQn|{?f)OB0hWNSfQ@RZ7wU5UG;Ia}Vq0Qt7;S&MEM2`Q!M3IB6Po%92 zrQh&PX_B){9Xp^p?*JXR+z_(rd41F5&9rJWTIX}Bc|h4MFQmjGlj^@(Tb~TK5S=f+ zE774+XPt*>@1Mk>2Mu`DAC=KIS0d;43`HF7#0fw1o2QL1c}Qiey)oxj#x&2*MJ!#z z<*2=i8gyi4Z5ON8YIRg2395`A1E{^k(Q6MuH%cPN%QBNNO4Uq}YY z^>V%UJrX-P7^X)=E7|2rS4El@!Eu`Mm;Y0mxB9HuY+SnpQ)<90MQpbbB;P`xOU4!mmVJ^^1Fr4<_FnDK-a{u|VRv zD&qo*ftd|(EDRPsU_A~*UyRHGM23W}i@*jQVW&o{fzXAGgnec-p860CUB;jWzQc_H zbQP)3ljobR^O>$XGQGOXrINh64*PKTU$Vs_;xYL}pS)}8!k!Uxb2Zan@NRE#cyF<3 z%rQU{E1~>zn2#LuPjm;1GF=yFtDAiy`7d|nL(&eUsRmb39jgMP-RztcR&cXXSx{0s z$~qP5L$_3kJaIz)*|=du8K+@RQC>7S&4@`8az$)*(a#U zLs0f5stFiM;z+v{z+aZCuQ=D>Xp3-bO=+!I5cNuF5KgkMn)ZFI!uHu_HqX=l6~hm) z&1!lT)jqU6s4+oV6`C4_h^B~uhlS?~8Sf^K>jd-#357J3b-Wgn>u6LEc_wpRN{}<| zZ(7sPOh2{>4r0 zF$9IePR1nE|KHDd4U0=WlnF-LBli@I@Qg#bgC~#u%+%bi@f{#|zae{vmcjjKQCHxe z{W~sxI79F#|Hn6v=C0_#N8@i`)kVF;e&`i2C{AK8-TI0H{g@PI-7^(0T_@8yTUV>0QuRAZa_eG;3S8#DK{l+jFtTn48o>P!-h`u}`*nYN+V? z>YTto`T0OddcupDI?cmh?c+O#sj}2b(56&j9I~NFrWnmv6z;o}+EK1tHUgqO8>-O! z4|Y*#o(;LVs#Izo2(-Ce%aR2%p| zO~z^ZM|$e3*Y>q6ZTW|vX^MvqC)x<=ua^4AMWph*_p7TY(jZo8SOtvhwoEdhSUu4`Yt1V^Li+?$;_pl(pYNW-^7h=$XBw?0<0eJZeW_ox#IA#k-g>+rfi+EtO4g<4{d-%xj}^Kk>82Vv$b(9h8;m{Yst{9?1$4MXVGl9W7li zw?EH{P--;kw0x&??zKhj=zEP*oKE1t1UE~Dq_`N5uI&&qVOY!UAaj|GKl6RbhJWD{ zFJLgu@U^HwdQ*%^pgy3EvqCKb*(GlVIi~`Jp-fffrMbU(lS8|(s^Bz`x=J3unu)}; zCR)J@9R5_mY(cZm@wFM{6{SYGb)H%EboqQ%9xZicUFc{PDEz_RKo^3LTripX&e5Mw zZ9`;%)DI~qdxJXBArrO$6U#XGL%WEOa^18(HyzNFG*mSno zzjzS@VMVG*!M1ue^d|ibHPynrjGHAeZeRQ3>Vg4nr+J^h}9^xeEI%3jfHXQfw}Mx0I=mF-ufajJ>bIr-fpZ>bT&PP76K+!qT(;S6)5Rsq3uy{YoMNqq7{g2J#-2d%gnB~O$Qn1Y4tA%(m-t1K!z0HlK*0g|^@jM2tY-vX!Z*t2n?ubJ>ywFZa#4 z=<(?^pN&3maAoa(4O{(_qYn=UBS9N4CYCtu8#}eQNM0~@u^c=?qp9dl&Vj^o&Va*XPII z0J7a3@p7dDOY*$uhfzjS9lV|O8bkA%gPN`Rz1({Dig+ zTf^TTp}XVr$;2arWIOK#O{FT!so8nDu^uy`^N5M!X2{ANy?|Zn#3%#u20fv}9#;qy z&_r|QN=e_was+AKOtte+f^McNx{T`ua2>|o5;Pq5hJVgEy}GdzFt(MBy-lDGc)WB$hqte)O$QxqQu+2RMU&qsTUi8_Zbjo&TsT*FW4HWt4u&;CvvOMUfvrQ+%MzwL-&au=VBq zjZfXu_^8*QAur%_G0L>42VJ0ca(qxoB=K43auAjb9yUis%HxitJ4!0>vDSQG9|5eo zq)#KnLjUlfBC|wS!gpcAl77RN&1msgHrFlLgGw2GjTSqedwqMK=IWmc8?nBV_JeHA z7f_{gkU;t1C&rhb$kZr;O?J*h<=@_AaH7Fcwb$M=lZ>C&{+2F4w!16-k!-V*4lk$`#*{1C1J0 zB^`ewg)Hu99tjc~V`VO3;U*RdNEN-%12i^{ufF!-vw0O%&l^bCz6hAixmO=5Y4-b3 zEYR5`aX>82AF*VR@SzBz8p^^icv-cS&lC!Ew|lac5^RN_nY`I$$@-N0(D@uuU1}QC zCDbjaH^|F28(tuCU!QefLZ)34V|!n+d#Si-2&43E^!dr<8BUA3Ltj{AMM3X521DJi z8sKZ9g@k?T?i^1sJe`bl@kI%MPcBtwV5Ci~w-Dl)aFS6Zvo$~Wb=x0U-4P(tT>|x{ zyuj{zJFEP?9s6Ck9}n%@o*X{D)cp7tF81(wJwuq3KgTk96ps=XgaiE>&W1f6Q4uoq zhB-1S9&ATPd?6lqGl&=M;NXTJor0a-heCZ|wciX{hB3%~))3~sT?KD~UA(-n_0Gd0 zGckC|xkHc}t6Gjc=3#*N6X&L)+K%&$#3v%$=DN5_7Y_qgiyrQ8AHwx?^{t3jgXpZc zC#*ZZ79y}*?0Nvt;f@30ehH_Y(*>MQx;{$VS<`HIuO{@T!`oi4(2(x@Sg3_5y!&>n z+xe^Pe)xTz!?@3xJOS4=+a@(bpEKo5z6q=xe`-hAxr`V6Ku2?g0vQ)C| zA^ijC9q6B!bXn!w3Bb?9P0pXOL|pe=?~g1-{o)kAfL&!3o>(>WNyCvpBJxR|GiTQ- z&*%%j&uj>Mor)B8?K$Z;$jponizLRx#<9qVbq{uR`4Ynz#|WW+^i+K4!-rGi{Sl9g zHe`fUe`o_@y{5y{8T^!P`bUG^a!Osl*7+C-J6hN~d4GJL8yJb6fL)6+y~yxxvcUj-wowgJ1G1nO}9G@Zfr6u7$!$iO_+M+Y-YK`;p zt$&R0L&;FO3Ud&WLnB&BxRp|%tGc@HlvW%+aY;{U^oYeJf|_q63HwU`P1>px)>o^( zC{3}Cnu?JjgngWFOypQth+WycoCvM&vZ_#nteSl&-Xlr$^nRbggCYh=afqRVv#M5p zy{1)P%IbSDpbiJTW?y-ciIyROF56D0vhnTY@{R+~F+n%=`rDl&rkEtZCq=!De6yK0 zQJCCH<`13SW_x5ep6)%tRf=#wA zGyM9Lyu5260U7+h#b|Be%ve5;Mlek)qa7*SO<8*C%QQ#q)>{Td&DL{gNgGXi@KmDmOPtt3GN%3OzASI%NR zhq0(3@e^V@zUX=j>Cpl>DWJWd<{%QXzdncnRfj(PiU@mDIhpAhcnMF}8Ps=dzVC+Q zHHsCCL=!30?S!WMQK{Ehvr;~2b};-g0h&M$bMUe@=!tV3CGoa&h(*xaVE`9YqB}py z6ay9%AFYmu8;>AIDRCX>H zL3}Z}p{l7`Cs|!AR*lplcQQhjP0pBM9}C0+MQILUc&8LU^_jS-@t@u=0$xO9X8rU> zC6#1c3lZOIa%V9F-g(*|qK`W42ykQ))Rzi_mo(wSyQ;@HO|cv`h*=B zX4Y8QUq&Jm zH|GBg)k`;Ir*Vr8nTsr^%}UPR@3WgY2mzSe#hu{!%CPN2xrI<`W-}tSz1nqdmpx{5 z(aI}Q=)mUKRwa!i|93lWOK3^zi}2iZ8qH*2j~xg=EYD(GCv!*ViC*DsB)r+-m353Daa;(c}xW;ABa^;UO zjd#5=EEn;5Qq;7e$R8A(PNU zIyaOds_rC%8sq{dW?87`p3np>ezcw-Rhuuyv`-!x)K|;VJLG@w!(yu@_JG91N=G7_byWQc|DhKP z74D)i2~&4*o(C6!=_y)xMkaD?B9J!)efa6LCM z{IDVb)fA^={*Y`*C$X5oRmdpRve z>eELm8l^p}l9|>jEm0zkH#{KkW7f3k6YPs!6304_FZmsk^p>H+JRiX<>OIQ=iR+K+ zS3&)wF$nlBlNcqD99t=r{4JW_M0;Z$SA|m@*Iseoko2%HXw6Zr8aa9bZLevF0p0Ch zQH-hVqaKP%?S8gl1Tn6;Ahqur`+ok-fm6an8XAWX(&q}J9CB%KNl02R@$ggcWm4g`EVXOvLS!R>Awew>nX_G{-QPiE;=*O|8avC2wP49cebAPbY}J zW!>0|sH)XP89y_M=Yw1XllJ4t{*|sdB-3250NiY4NN)`83)Y?z$>{NNch(V1DNUAS zG$()Jllwceb_n@l(_CuRtCerc7Pmbwc3r+sEIH^{RFhE@ZC{id(tTG@K(%UN6!H5cx!7A4_d{-+N+4GpM!HAnHFTd6;RJKr;Vpv^}eUNG#uq z#)!$dZCcT)s34P*^4vFUE`4Am<)IiNVMEN%t+lk!pcxe3uC#`BLm+>V3ai*w3zSens7_CDasnScW zqWqEU9xdXDDgVAPj#W&#nQ3{HCd|p2PO^DfW6>QK4!wD5q+G*8ZNcX>a%a^TS#}UT&kKfkz9rCa!FJM(^oRmC2RBC$DlLW)m0X^dv4hE zS;|d#vayeKt1KswqrzsJE^@_>#;)hPbbDA@N?^Og~vP!BLPSg)E}&gct$A+sY1`IOvF*sUrb#Z8!WYV4|Y|@O_ zEWJa((`7$(KweW1&9z-BwE#1kb`Bqqr@OJD(%RAdA&w1^Fthym^sbGCQ~1=vG}0}H zmuV44xl@=|D~oFDMCAjPP$n%yel|(B&p22PY$k|ybUGg{cwY_@W-EWUWPDQ(v?IL} zZQFF?!i@&kytSD8Ua z1pDD4K9X6E%I~`nDUn&ei10(Y^oaD|3jU;XZ6~z(%z{w(P{9>@@u#ypS2LATF&DK2 zE-7B^`bnxVWk~6Bb54dlP4r+$yqq4*A|ts_7*!%ISboH@WFSC(s&5ErTjYrrb5Yk< z2fg8GNx&g*1(>A$LkP-9m4F8qn)aBuxj}q@e0}44G;3W&pjJtY1~;mb-S-x zh<AGf^(mS0F<;u8wHgqK+ z2#fV*x*SigkwvN6?>{EKplR{t<|dSKQFTxI{yRj> zdEiwwvq#i#Xg(%fV`2yX)Y;|l(aC&*`cl{JaIbO^_HhY~GkLYI2}*}DyjM`SRK4f_ zx$tW&U1uP{P`SL*Qe%bp>P374FJ^IWOr}Rpew(Ubl^JSHyGEISpJ?5_$x-*1Wa zwvk+kbc4I9hz2pGu%7qvlbM~YsK=rv*2N(G&^nFyK3TReL$vl;;sfA zM($hWd+}k9$$l5t$*+6o={+v;0M`-KS;-^!l77Ep9+z~Id$=~Au`W?xTyw$Zcq@fo zd5q_RikBwo!$(WB>~r)6TIv2`wC%UV^(lq%ipOwCh;&c_W4&rYV>1is=6T$p$nVd~ zzC#ibkqbJE{c`sh_lrp3I$sWcm^B;A>!zu@P-)fNdkGW|ZJJk-=yOQ4T)e%D~7K)0sRn*iX;%N+{jyWdl zsETX|8JR78l@8Tf^!3!{v)ZNyv;Kpm=K^L6j0MdL-cmmeqyh#lzdyH|lG!eMJx6o0 zC_J1kVQ%n9GFx)6RFM*|yi9L%p4F+0`p zH1A;M+}?|#^s%jDmPJ&Fe0lNkni>A3dSO#}4H9v0M6~qb=OV+Tz;tfBVIPX7h;qVV zrs0Gi2dQH|kQ|t_$gOzO2CzUqBJrEzf~n|sc!FRC#Gn;8{E}%rVI$CI4RO<;MuO4F z@72Y)6i6lP=Zf{et_E7cF;4`_nc;S&x@d6lUJ!@AFPdO5Y&pts8%pIR%%L`Z946dh}$PGM~?&bX&znR7@RzMo}es0ToT ziP`0m4xz5lqwgX8{3jWF$9SzJjj;IXlX*6ua?j(hwn}#8N2CWkXD?TshNlb8!5sl6 zGg2XwyK*j<4?6{Mg%PG*{gpfMnj}OI`z5{4w2AvAb)aApdn2ZZs782x)JF`#t8}d? z^1SLrThsCN?-T}u;xaYy9u6XJ8wx)hq>;!@+n#oPniAUQN!htYK!tGVwd*@}F!;^d zzT0|QxU_?5@E(`KV-yc(-o2o4dI3RGYy{C*Pw|pY+2v@CxKX>2YPcqjU7bE~)*?Q# z=~S_c(N77#?NB8$Di^jqcY!Ll_zfoavn}Y3&o4f>*^gg6vI~wy$My%IU0(Dfb(IF+ z{a)?Q?~LW!it2N$pYG$m8ZzBucy}-0o9D8=6RZrwp+K|yGN>zoG{NkUm2+=>He}Ju zp*lt#d0{UQN{lD`dZv&lCi~S-RS4xz?;%HetwmA9S*>X4v>Y=iB>AhR`gPy4xE07+ zaz6!(Qy#=pj$y%56YQe@;B}9%!H&PQG+2lD>hQeV1Kdx?9@pxi`nKl4|8dSyVzyRg zUJr=BnOgbB`LoXLgB6Kxe}$R_!KB5Ob54gxBmWabg1eY&W(GjY6 zQ+u$Y`L#X5FNshV0_%HF$+O@$V$Bmdk~+j652=oMqk1QG5R9EreGRupFNmt6*DgmF zi{D;vKcw0{V2bo(pH7h%mih2~v)v8*Y`q=7Ra)r8SRe1DNngh(8{5KmnRGk8yn^p; zI%woUxh`$Rat8N_VwzrJsUduCeUP^j*zrq?@e6d}jr6Mhh94O`o^L{pRWl>Sgx5=9 znlbqnjvfj57AhWHuc1kdF?uZ&&A%q4gFU=i?2D+n>71R4sMwnx6YNyE^q8tNq70^= zaZO4KMSaVjl$K+ke`83YjYOTpTv>V4S5%`)k@{NDvGw<+ygAgk^kwsQgV?vr=tTi!<)FuJsbxZW!epoVc7peaY4{p?(zM|Aa0Zl_A>Kn)KCmFD4ze`l!@` z=!f?f3sifSB4Ql+YEe0@rF8AOlsN5ZZy1v~NGGxOMws)q5KlEIP$$(go;P8HwDjkG zAR?P^JNv;6{icV}+aG9etQ|^!&I(ChdOCC{Tyq~!Bl^?OhC~b7up4+q#F!*$c2TPV z46zbvIc%O#Yar^I!d-Ew+{Ld8pJ0E+X*;K>&!cp#UGBhGzMncQU zs547uRE&>Wwugnf$W=AiQbZ})6xpSU9PZ*WNe;ipuF#H4CI9%I?&!6i?DG_gVwrZO ztAGivOM(0|?U*j}89i`7^vCfM^QepEhuK%8 zeUeVG#|bvDohNB;BbsZDYJrBuzo`Cfhza>&LLM4JUxN|ZP!^rQ7Rj0OI^A`74s&~x zKY@{XQJk{&6`QKI!H0aCW1mM_E_!9+m11u&M?9H|!eUHeh?WAXURBz|*<+Cn64R%r zB%De?ekAIMZbdZpZu)7jyE>d=s~ubWhE}oz7Mg!t&YJh94ho*7Q$?dJadr2(sJE4# z@HJ3=v))IVi^gPPizMe0;1Qt4|ij#yt)}sy=cZNM_jZDpm=nWDPN$9<>jiV*) zaNV5t-c-%7^4qJzOvYc8LeL5h`B*Xckz?Da2z*9UfhueHJh=|=`7O%~@Pz1;6?iG> zD^UM4{Qy0jq+PY$o(L>K${cYMc-i7E~b`XG4KKWL%}W?7AK~9NSE3v*%lkj znobwdIKza#Ra{Zp4ii>sOp^7vdg)+pf_%zozx6YU(dQM1_)p)zRVVT8=PxNgkb+m9 zRHv=9v9btCFu;^lr;TU}u7boY0K3D&8w1009S5lH3lR8#Ww<=yP zFZJH{l^@5`a?~89QA`@@y?b8}U7gkK5mQ6gw}_dhRQp~FJ=cEu*x@P7K<#*(m9(9z zg;daMJwe8VtdFw(yzT5~>mI>r1JXKxRBv}Xr$1dQ#aDL@FRt292yDXmmYb=BmB2Ff zB6H;rS-4m#q@Rbm)PL0+E3uj7)XnN|?Nal2{~!%iRe_g`ANrwUqGB5x<&A|-bM=){ zA!FQlOqT5@b<;7OXk`K`DREAFO%l#5eB0TWAom;+hOUxo{N&!e_Z1WA?-62R?vF>( z>Z%aWV^|bKrn)SA87p9n1=kl;hY*??k|ygk)N6>pH#eljKb@JTtXov|(hZ6?lP>8q zZP@fI<(162_i-qeSElBrteP*^8z$0O$x=AZ#d)Q|?-gB^SPW2mW(xSn`VR3C+O35G zInASNJl_VKo5NF*-h}p7d`^EJbfhGz1`Vg}7>f~Fz_OA|cs#p_`no2{n$&08G*MQE z9xS@$*{0hHb6nYtsc&@Txw7z!C(z&xzj{>67X5VG2lo?(d5&B(*SgV{3ML%`HkK|O zKH5~>nJPt&P_Zhvk6MqV$I$XOTw-SWJX6Gj6!aOOGHF3CivCg$pZZ$S@+mU~LP?dveDmpyIoNad z3zMbYAiDAdC$}#kNcfdTvtN zqi9ma=kQsk3gMzXkeGXOGJTI>*wmJI&f;lzL-h~7ZwxeCT?EbfM{97-JxU)5e#Fdc z@X85F9~$*>?wjLS3#iFv?4LZxrpt&-V@pHPOE>T%;3hcD{4kB6{5aDcaSi-Z5dJYgo1DBma%9&> z#q>jb1y2&?LA~PcO$oWtpO`HHLK)w8pP|QnivLNK%`#!Z7g73(?kPR(Anpt-WCWK@ zO5XdQE4@j8*y2r8gx{mz)ZinB%4-5g zLw47Fu6q2^a_Ol&VB9z^e=}|roUbQ|RPpv8+Z(3}h0Q~3#;LyU&3g1dQ}I^oo{9Xn z<^C)_nYpyjirU7sGyZg`x!RuXu;-$@YJdlaKO1}hV@#6qG7k>rG=k!!v03=LeEJvZ z_(<8`;h5-_!hsl~AWq$lW<3XZ^BhbcO*mdXdMVl~M2Dj6+7nUtQI6E~Y!FtO_ zgeq95lmUg43JpcNzB9#}JY^Igi+54B9~W__^51u_eTN|^$g zS%A#me`U6oiQ4!l^TsYf0W?lv{5RzrDU^M-|baFeE zj@cD5{+0gfgW4i)D~(W%q!9~dD=G-KvCxHJEgUC;>zfqdMbgj=!a_VQwk1#hoh=hZC*%JQKw z)t8?PT`THNs#{&ljuD)ucrWUdcI#svX0Q~^)5jXWA9i&6fUNSeje=-U)K@ckjR$F9 zQmQR7$w^TOqLO|}^Nt^%qmM`C9_$Ot53X^8&nk4QxbyUIr8PQZk;4;16I!}#8&6*u zywYrWFcxW?J^LIrR*l`t?dh@RxC2;r{|(Qw2-m)s^!4 z^_raTG)&R#9z3yk_;oxI`0IV(udiYOSEnW)@~exRZ7nZGTeDEw6{8JUZiVv`*Bf$D2;TMU&9Xpg z?Vp~GmL0!>F(iXW#)K$=xlC>g)RW* z0^c483v)j3b+H0-N;o+=dtjk+YI&M_+$Jd7I@tr~lFn|HR&HR!hrqEcm<#w{3Ty}g zLx3CHBxzb%cz_LgdBHsVykHm?n3oHBlPm$|2Qp}4p^J+C2NZI1(Osf)^MIi+7?_ub z8w}+a_zM@p^#@??I|k900Q=wJ2XaC0m|QR(0Psd)z?^ts z+`obUKrZMVlM5oi1?GnFf*}IDU~c}uf&V}*?mH$IlnZtX30#1$i;of2(|AAb9o!@C&4F&A@7MKV6U%-DL7m)96fq4PI8;N=O{|opJGxX?XzmgZHoIgXa&_0-BjSm6-dc-MRq=+@Jpd|AAUOcT6pAK0wts>J|X3 zS%B-e#DAa`?;TSMa>K2g1{2u0`G5N#yni4U(30P&sv&?|2eemU2n6UHxqh=6u4mw0`UTto*xwTWfn0!Q?i830@bmyHhHwFX59Dv$KX8lpj=2Q^tmqaP z5a>U^f8ZAEj=9AR_&D6aO}PPwi<|%VC;~YCR}}-bai^Mw0c7R@ygj}fZt?wYKY-Tr z-@tdwEk2;#;^PJL^8x<+-}3%}S+F~1)=ftUcv3h01J7?u0tQk4miCT`B>;4TfUkUO z$$$4tKo|KhT)sQz6%QaQlnbcZo6#coZ$0zw9Cy+yKFV0{qoI0A0qvf$x}Ew-Vo2(T&7Vp5MTK;1=H|AAb9|9Php z^8pSzgr6VG2Mkex0o!j?|AAb9H+HAMya2gwB?bufkHo-`^ZE`a%W3oHP%SOB?TT!6~|u492ekW1i>$#oO^xCI8r68{1I1G#|U%$-UM z1A-~Hz}!H~^^e4VAQuEs$=xCYjqoipV7&hzLx6_#U-W`--8H|sfMEpCEdy>3FnIdi zB}2IWK(HJ4_fDneh5qIJ@B)#Q|APJl#UMZ-?-m+pF>j>?e9ixY{sYM%fV*>(|55m#Xm-~@dOpCMZ-$M0zy{&}-9z3uf&Zo%YmTn^?2Wa8!eJ6aBK z?hnv+Ofv`&_~5xQFu>v95%?Whgh2j8Ga%Y}r*(ZZM1}y(7&kC3=l>IlGY=~;FgYhD zt)Sv;X{BQ3ZV$dO56!<*RGr-%%^bkDjJla*NXzuhRa{s{noc zx78_IIazzy0EP;I-pF9<-~miKa>_aYijcOl0Ce!z)ql@q`s99isNzid3a=gGQ(%_G z8g%xGF|nE6zWu=9OLC)YkiZ%)7!}rkb&<3^+L}|<&!XBwGGmH2JzZgzEOR)4Vsh>3 zchtXIHd4?x|FhG(bAG|!zr9_fZR&b%AD_=y1m`C4f1PbCvJXY@l-N$eyh_7 z_;T7e?*p+P{W~A_ug+CtG_I`9E=K4DAJsS0UOyaFFw$IpbP@U?#ml;%AMw?hL55VT zUyL9#)`qv`Kp;(D72~f04JRhY>BI!6%-C~N72^(j!9jNi$e5f$a2$>HC#g>y77r33 zuVJ!q7Q+i!tw|WMaW?uT^4GYRTy_Q5ebypRti!(8a-0cn)N+h?4omxx$@ z;m~Ft+Na5SB`WWnscNnKe#5B$AcM!O%w2?nwNcsKA+UZhyc%)qn~*T4{g_$3YJT&8 zY9N>X=WXREztNa>jRZ)p$)H4o!vdrl^ipk01wC8AfHpDQ`} zjif$F7ByIp4tNk~UHH>gZwRh!A-iMpMzn6j^SUT<%+|=5a+;EfdQ(qKUo4h-@5dYT zU*2&z5bZb>h{Agp6C$;#d*EC9<(#@+&WO(v@Vd4yy!&K@IY7PWkXE!v5~I4D`<6rH z1!`la4AmT5l!vUj7KoIAx3svru@oT=owu2tw!3`7k5l#R;#_*@8ELL#V%O9&+BW_# z)XB9P%VcsH%l_O@ANF?&guqf%qHF#9N@x#7t&Lh>Nuji~6yDi-X;~s{kMuE2W0B}U z=Sr8IN8jGfREQ6?RghYN0q5n@^)pB2Z-Z#@$!!57V#UHFfeZRyMDEQP$=q1J z7uH%M8x((t@rqh==O^i~xvC~lVOK7tx^g0+t)~v45UYe`*HZE2b#auVULp$X`_$Bn zHKNb-^3@4HOO7Z!wUC#ma~Z%LYmZVcO*o5=LxCe(q*A9$BvkObx!T0RV1pTF6N)03 zF?HXmt@jX`>mGGNF6xZRcCXEf7`6A-N=Em8_DzpZz>lc+160f$*H1 z>J>(N<^o|$x(7?NIEOnqrs5Wz%4yr%+;95zk&4-vpa~q0PpTQ49!6%x8);K;NIMTs zxL9JQ6GXSnj*WGoE3QfVNRC88ozBZ29rTduKvvqCVbz2NG}^;H}!N$P~@#%EshJ#pY5&ATp3nS-n+ z6W5RqU2FNCl?-+hA?z2jOSYkwQVyKTFl@g=uW8Z)iK@q@6E3}5UW($6t$t^&3(}N% zV@A}4_e}n49eO%^`4?G9qG=v{?WE^2Y z4d3;W_q0?kTf~>Qm}#R-%E#1ci|9%5s#x$5Wrbzc+kzaDNM71xPX_a9O6k4jaeCBK zx;WJ}|50qMfwqh!8|^LIu^{(D|1QEqQ(ZIXcAoe9evSNvzIEk|QZ^|P8~`=+wYQQU ztKcCwdYFgFJH#;KaOZG>*fq!os|JFr&M~?a@AJBCT5YrDvbyJJ_$ zzekg7E0-Vd+6nJ<+_26&ialUnb-~`k(k3Xk6Q2yjmvU zXFmFD`*Q_OlNHnj&m47T@d7lrq%Oe=@1jMERFo?TXKqs7m5DB%L#CUIC^J=8#rlhggMIq-IT@bRt>iAAVI=SAj!SNQQry06K}ML#ojHv=K?0hAuBA zU8z^_$ODdGNOukLkT1;m!H8)l2{F+NdbLn`W)nF4F|@)rmD_tlXqBN+H7$$hZ2fAP z{EI&vU&U@zz-Mso$esHwcJ*i@tP7!R5sAODDS4I;KZdj-{?*zPyMZn&go}c~VDwQ2 zI7OjCaHMZDLRvt&#FQNeIju%&oLn(06l$R^ApoBiCW-FP8>0I4cmnk`c0W1&rxzH^ zCiB=HOw4n+CqFK+`|X^cigFS@*ZkxyICSX69Z+V0^wOaWN9TYs?^_poMbNm{g(;P* zSAL@Q@S_cf-j^Y1ucftgl9Z+292Eb0P@3ayeSd`a7&&&Ajj|F6X=5zn4aYaX3-bOs ziO#gOwR?=`hi4m~a6VX)y?T*wCH3p4Rk8g|`b&SjwhAC2gHuxX-H4d-^6JR=dE`37 zg-GP(6J2ZH((Z@VkMZ$l$~4y8HQz-nj^}2$OIp(>`IAMlBqaqMrmKyfqcS@y78H%+ zsV`*s#e9_QIv;(3Kvwq623BYQG!Yx+P*-%PRb*SHLxrEMHfH zhSD&)Mx>Q7^nN}mK!|Wd@UWzP-fqMJzPDzHG*Lg996f+u;od|?kW3V}N(ubPh*V18 zWl4KD@$J21oUt7p(u9Cy8Ev^7LSNaL$TRwD*~)r9vMPgR1~QlA9g6b$BusedLOet=%| zSXF}6{CHP45wz}U)%ac~zGaT);gnn7`XM=a`@=ZZio#K`cQ*Ru)2S>=_e2T~pJt5tLLewN) zf^;l7*ghK2K5c5`w9nR=Ov$NwG-q1J{JRQatd@ML{PjR5iQm zo6B5WP_mS!o{W_U$eXUFJ0!8Tm4(KkUAdCaBV{99*-MHu@Sy}X-?3&N(E~@R*k|$G z39v@~QPMC=so02Z=+CK7v_H+09I&wLs&{;<`AamVLKW?V(97%-o%B+u zcI?#~@87r9(bHM`E--gM^mMx+@{p56UxethLw2`xoxb-#5%OT?b>xmYJ(teWvmWnsvvX=i*Fa zr{L3EEue}y{si6%o&TlHfV(F`aw=)t>0M4Unc9?bU)u%zP22@e#FLeN zZ5{Y{3qKK{#_3=2r{F4|9#5)eJ+79_Qce!YlL2a zQdcT;#%_mO37cc$6S&x5zH!JbnVfu1qw=+E;%UGJ-yk85sda>mWl4#=VCGqUy zNnBr@;T&%|%ay#_9IB@caAiTrTP+_tocgW}cwi(Hgr@_poxFYrI4DQ;DDnpC0aU`E}2nd7hDe3&akb zW0eLfNBqizCWE&Lm5c#IOci$9y$9Kj%i5HRRo@qfq%VHO;&xxw@hf{?)D6pzAr)|x zq~hfqu+(3aDPg!W@wP{?Jdlh1@ueY3_kgwj@h}^KM2o^yi;$vvCu?#koQn;&v z$`PmR8^26GeY_2$$bQj`^vMaSez;(_h`x93KHDpf!P1>k60-TfjzvkGT`Jc1rzeWW zL#Ts3BB|g=Qb+c8wDkPIl)bvYdR1b?BK$Ce*wAnNv8mc>@!C zr&PXu0-c%07k0DnrX%v}&VoHtPQ-H)qe9DVct%Kn&abbPWv(1J_ZLfZWl2aqz`}e$ z`^e81Zjy?Bcswm&+Y>UC#icG$ELuYVjz74Ji(VjWh)*8Pybyl>T2D!-?K6I&& zNI-3kx?0e0piC~<#Q7GrU@V$&#>2e!iCjDMHRi+4z&;Lp+Ds>MA~G!3fs_i3QKwzh zZ?=qM_sD&pY?|9-yI()3$0&a_9Fu45A!n7ngnF5<~1eaZ!5!M{Ad4!X=7Gn0=Sn6IryOWr3! z@jS^?k9|I#9~m~K@u1qDTIHhoWvXyIM!xZ`XzGbGGMU@NlL;XaQRbri4NW;ZeLPJCHQhoyw*&sKFFCx>*K?QD7ql&kE{Dq#!aj@FisO4#SdH6ae>`)()mp%|Tk_}9kYpWD6E5K-+E0ZkNI>3mg$6BTb)~_cSU@{p zcVss8EY}%S*opmEsDN`#CC4pu8E2kyv15-PLND8&W9D#ZK*D$AW^UUoB}b}4@Q zsC|OMQ`%(RqHq3vF7Q>=GDvaGwkFO@vxtA3-Sj(h(&A6vFW$&ajeqFX7}r%R(=J6z ziIpeJsNr)6`_dXQBLY6nvT0o?fQ_juV)8!`QDWwHO8Lhl*Evz)=wSau})1Z zcV|yG3oCaZ(E0bm22Lp;01DjD9c=hJvZ#48RjXoUX=^6w>;pEunR4I*W-(#E7u(!C z@Bn1~>tP6>1h+FEH~ZT-E3p3^BfSmK-=yC}%YprE==x^=JKya(?3?qOK>p4CcfQ+2 z!@&9N8s3}z@B7`ZaJ@PIo$q%2CvbkdAoFJbJKybc#hdfr`ED2U0q3`C>u&bH^8php zx45?}!GQGJg;_WI-{k|AH{JezyN>84{rCND7uo>lx9eVR_P_J-{l4GrA`Kw@cFn}i z{`dWER}|cw|IT+i-wvGLPJiF*f9JcM9KJdKo$q$)6gdBDCiC{-ch0|N`EFBw=lyF2 z>?Y-(TKT71{;8LLD(3H+f&5)Hf5rHL%K--bkMK4GSQ7KU>G(S~4shk4XI~T?|Dvdr zvxBpnmW!DM@PN!elms$L+IqOFTe(R&JGwYK-H@0cNYu5pyop~6K!9U;D_d(D4`4Fn z=H%~KwzSlPza!b4zoXp{Za!}4{|szjPhT&Ba1~`0WI=FnAP^kz4|F{Xk^&(kA|WFo zA|oRqqo5$8qT`~YqoJV_V&h=qk`R)Tk`NLTlT$I=Bd4IFBqj#4gXtKVSXf!e?s0H& zFmo|5voPP>1P%oS1sxTg03DrxnVguM`TzIdbr%Q^6?6%&h5$zkg2#hHz=ON)1>FP6 zi3E512m1X72af=h7X=j!9RtYFgbRX)LqLE>L_k79LXQc}~>GcvQXpB5FDls+#je^K$Wp|PpC zrS;Y8p0~a4`uYb3hsMS~PfSit&wN>0Uir5AeQkYX^WgC4_~i8L$N9yLTyP+Szr+Im z|4Xp{B^Mqb7d#>&0wT(dTyXH-z=nW_h(rTH#+T4QF>@uLg$AP%N+uW9ccam9Ywi=7 zyN#j~)AKAb9NdU@E7|{VlqzwEB%CG z>mjVqZ(eel&0ZdNkbSI9TZT%3cmJ%vGu|LF-qWy}Q@rCT4tgPad6c<*kziwPimnI> z0_ng9qo3uXES)h|vKPqVWQ zeOh+3SDN<=f&v?Ow(7BKs|e7;$vlGst4!SwPcRBj6GY@1%M7kgem=X>=Zx)O*&?BK z8??5jsc)Q~F}V+wmAm}#s&nx{(#-c`4H*a$p@#VXE8D%&Kmy+8{jYDo;@KU@(>|T- z(+U4c&lYwK>W`WF{(?S5fj(b>_e^fbwOqk!-))n08qUubsqL~xIqPbLXupXbM)?1l zM0QWUutL&G>~s`6XLxP$Gs65DG)ge_t}$s^Lx!*yC_d=_ zl`Ww3()JoO$T4;e+U6$t6_ww?@qbqC3JhEnE!``z;)Sh?iHy|JK8E%;>1N>=NJ!CL z-}c#dzJ`gx@!Ug_BHC@CB=2kQKC(1=i*_8ZW^xuaf1nGxO!d+*aNEo3hy;+jm`aA3_p zFK~6m3;~|sel0s(hBP1?{8{(y#D(<%k<^vwfgqpk*lzGOs8huxyNXNx8DdckGpHtU zX)-LI;b1bnSfzmW^pM#KycovLXYrM+#;v{cRD4ud>qlc|ZHrU3Eyn;#Zhf!CHAt4= zhdRpW*ZmO_%+7T~=PR67*PxZOz_%h-kZVw(W9Po;+BGOaw{ldRTH_jodA8sGE4=v{ z)OA_#OF;YNUQhuhd*fy0^Zjw65XQ8`mbpVhf@_e7NafVl$7_&{h;1Whm?-V5L{ZDS zfNa!lOB(l!Pbh2EEAJTQ_MGpfBM6a>)9)DVLwy$?k2hZGc62s3#!_1zRw)(efN|Ee zw?@URckn!~L9rdw&1sKF%Py7TPUDF0l@r1p``>%n5)y}(-NcE9h8{obMAPT`QOr~A z8Wf?kFZL7hN)Avq7ogpWvrT4%uE3@AH#pZI2{F8D(4w-~m0jWwD`$ZIpVWE-e-Hq_ zkk>vb-?dKo@QoHL@-Q#vn2NC!9Whiu+}~B8F0*7}}op4NlT9jI+s`m~y5N z$s*vRP*uiPn-Bu;2JT>(@U%}nX=%|k;;VnebTO%Y=XUdd#s5{!VfeUImD-X(OXrAB z_TE!ZSSNQ<>?s~jp4KbA(x<1xoI3$g2B?e$O8_<(~ucUPUk#GvW{9$HK zff=UehBN#%Xhq<3i1`_O3`_Y2n1M_W{=woJq9-9}6X=W}Z){>YLz|}OtPFZQ>8AT8 z&J&q?6Hs2%et!6fMl>;ifGMjMF-D7QKAn!}+}pMH5a%@U=o#vIQ4EM}t9Ck33eQHA zZYu9V)4Lvh+4;}1ZL|BL=7C>%4>_KMJoz9%ky z|6}jXfj3>5Rht4TMV_jg zti-^hGCK_~PiKlRrmJ-+;!B7HYa4hJu6w+>0?t3RuJhekSZq*H^i`~4Z8LV}BgLHi zf#;T9Mp1vHdx|NR9AbY>>nKZ>908RYpN5upz9*$%rdFT3x7Wo_-}z3ax~#gH1Ukz9 zQ+wx{WHxQuPC@5nHN8-qTqDy0W6${d=QvQU^;5_FxRLRu?z!H}%8~QCJCVCVec#79 z_y!WeN4+3Fm$6u2r~cWk|HrPRv9X06bG9s&e!;bvs}=|fg$skGdd+S99KX(Y%==qK z+I+bW{;6xwM1_47D?Z}|GmN^pd$&A}659cC)qS3&8udf1FuH-wJW#L#1RU%j9pfZ} zkjfM&`JwUCbRRi~?cWcN-6EFldq?s32RXjvz(s^)DAv{*wb)pCYSj1W{x2dDCn^?9*>dsV zigKHJG^C8}m^i<2e(QG~V0tDLiDxMKjgOmO;_Azu-w`b?7WlT7ZzZL(CDeZkdJVpe zu=IK~+ou0!yJ0l?xO7Az=cELD)Lp!YbE+oXZ$UCd6=tg$KlNSi?gjan0vLq?6iEAB z^4QXgZssR#3u7BN3Z7%I+*cLFUg{TJZ)EMPn%_kxQ3EM+AI>ovC!hn-H7d?RF-qe`yKfCGECYD!L zo?taIQ1iS3F8mfhzVak`NUd+F{4RgouYof+Z-2YlEdVlD7ibke=l1|J-Zo_mlJyAP zb3vwbE~5OBh$nbNCM49)A;V66Y-dNRzvQ;~iNX3uovge3E;kJaALT~}Fa`$j{Mmyq zJfq26cxaa=dpSO%Rij(@LzZD}!kx6_RJH&jtQ07M!HCKI`N%unx0BANGi%%>xRF5p zN1OBh4n<(2CWm{XH`@EiO1=>eNS7(GH(DI%L8pk5RU%*Wd7^UOIoVpi3iq&(qX`G- zNH}pijmeJm3C?3DFOR*E2W&&0f?w+i9&=kpyt3bW-~RaEa|X5!#@ir*Q3n)>ry$B= z2)+*Z<`WYAmKo*9p{F)jyM7`o+Cv2ra~pB%ggrnuk<2+epF;w@0!rH^k}LvL=zsa) z!~C0+%gs|4=WPOH=`p`opAEU$T^(6Tm4VqYEcG#m{dziP!StgL!gVa)geFx>ZkKp@ zDnviJf2r}a4D->2Q_$Lv<3|B z+?(+?Cpc`@JNU_@tF<ssBJZ!W55qG2VRu%BR0WnJ0xV^P?u*!&^Yu~QH$iRC9+r_-VLp_Qi)MMukJ2!OtA zGDL|}P}=!sJdX>o1qXo%*~JW#1H=H>;NEo#x@1wnOde$Z)J7dGhlStwojkw5@OQ{#ZB#SQ=x;V293qpmUa1Scw}3mk9YJ$riAqS z?oK6HwyTJ+CJb0-C_vs2Zv-GGC^MRNDBZ;W-o5tmBT#7Egr_x*H&cpxeB?JXDT&CO zX_A9$@RXjJrOrxKP?xXr9 z@_^(j{KPQ`c!8p$%hIZ)3gGxcy3+Hse1Qzt-4SdOUJVfJ<#uD!nrZ6Ftq6`z`4>y@;M&Lkrz+tsn2ZtH zalW!L>TAvCc9)FE1Pf;n8-p)uD`n0AD}Xe3QK!%45vuS1ZPD)(wAYI`&klLwnZ{H= zzJQmMJvYa5U-_5uvO#a{>m|-F)TLX}OxduqKULX+P2B>-9qX%O=84_!WX6lnXXkm) zeW}m7mjK+z7S1le^QhJUc}Y9~_o=Zt?Y&P=ej!UuP-P|`q%&OVu@4|o{&^S?h|oOE zyWs~N;jYKyt9SWhwVp%2Lg>Bd+G~8=+=IgHs>8tcS05 za#JxME?TOEyY$^dZ?raTqCY__G-SJgzK;wi{Kd=EU;29*|V^^NdKQ96lg_n2djtKeBe5|-fZm|a}TDiNsU zU8+EnHHoOY6lz|9H)s4pH7Hvbzi?Iiq0Gfqfqgm%7d|7qraozoLVSlZ<{KNL)#pXs zY}i4O*e`2X{ik`IouAYoc%UESpos!rXTDyLW>+)+C-Epwl=#WOUB~z#Pf_7LOyIRJ zb_uFg(0RH903~E=-gsLywlfTT37sAlpD~;sJ*aj_=}LKE zZEhz0KvsV|>d<<;!Mw=67zFF7wYlPU`BPF*>xpjNYM4aht!a|`_D_%XLu*Q)eOnX# z*2q}_ewWHo=DPpoq4V#~XI5SF&EWT*?mQKOPEM@M=T*7h=_JolynUukq0HKyWoYhg zC8hN2r#}c7#wiHKVCU`>FjQw14qr>#a}UoC|X(lM`uBk3lE!@IQUyt*Wn{yr>*gGfi^- zZ-LL`@NCryC$;>{wV(qja(tWK_M3wZ<5AMSdrivnDX8gFQs&?3 z1plY50=6wWtwmOM1W=y&r{)8tL#)I9%DFK{ajEJm-`;Wtaq^F^g#g9wen1nC;d@!yVB2dKf?ntquCVXs?GtVH#y5vyks+sp|&20|Z(C5`08|l*=u|<4ftCv2cUGeh)Y5(mWnI75KREK?937hX{+>q`}n-_kaW|w?2 z=S)*8MY#$6JVnmAS6OV&_4RxEcwEB{1^=0!PtSUP>ji0}hnuMtgd2F$TeChS+=)zW zb~aeiEK95jQ`L8d7?U0jeCW!sTbt4UeaD5omPS7Uv=nT|_1O6H2zJ?*=la}D5{OHd z&@8><9&Deez`}0Cr3ZcKLT-l^h$4`4MH-6&CI68ADJY;KOmdfNE$IcHsJkaOB6uD( z6aabHbiuX@Xl2hgJjj8Zd@meCkyeh88>8bxxAJf5Qs|xsodvP}X&IHhUD;Byj_!-F z(CTExATha|0(-0!7_Du^qT)(ygu#WXwbze~&>RnxkGn`X2AcanO6 z_@<||XqKbv#vp6Q#h#K~;AkRayWM8VNt^C^qPOw4;2w+PevOT3sB?t`M7@(Dr%5V9!~lJ19KdfGm~c0H6He<=qNynVLx&~XcJPx!M(AjJ9ba?BJa^1 z#j=rkGMD?S7BaDDel*ZhSO{}QlKIDeUC57_%;CQGbY*qgp6o_(=vO z{Xw8(H@J%RG=VY_C9&*ThC*Goo4hJ-w(jK;d)*J`nyXaGsvzf!4hGtKN1T{FR#Wm4 z{#F(cJ|X8tkU^3I zA<`#58eq65gD4IBLp#}g%8g4bGnCODOIP|ydkATq@!$Ey%uW&7A(IgL;Ln#uQwm-b zURT@X^4n4+(h96X8OMj9Rh<>p@)D_!nIA1pE&%0`5qBiKW0o+KUjnR2)mSRuPo=OUuv!IuZpwq(C*@>yp{XSBC;8 z8zIVMziG8UZE9c4&sg#5-xlg=XUB(|OW7lLi|}zK{O^KiZhs?VJ$@rZZ^Pa9+5CqI z*KBvQ{jP>@=z%s2VrK-qWX|$|$ahPLwvk$fW?MN2H_>-yS8D`VG?^wXPeI;& zv&%^b#>e%z@v&!2bhbXyrTdP>NggjwL3ASG$CV&I@4rVqt2WIPvLGpBLFl&b@Lg`Tc72QyO47 z8k2i}(eQ}v!oGvp1sEhQ(z%QP2&7^+5PadH zcBP%)gExFE>6W!#oSeH*__WHks_;8^n9nS(-Fo~F5)IuCp5mo&!X|dmW_@t<+$RqO zlPgbnpdk3j-P;guS*6@NOdnP^UPhuu25909D&XBd;v1+-4vrp+fr(7@%Ar*Uvmn`U-i$uG(%wbjZNw2!C@kv6#P}4qZCrV ztYjGFFzQ610iji`X#*n@C#tn6g|5%uUN&=k?2>#rwFsaQx`$RJrAl~?HQn{HXPbA} zQJ!WIyL&t8%mu0rZ=aIsUzqVVymkIw70mG*53eefB_^s_8bqM`Q#sR{YNLPr zSlF-(O^f>Kx|Jz#tUJ1T3gSKdI6!9cieCN{5<4;76%<)c%sd9z_0>>xUjcgK{;I(C zeHIOXFSUS41AHU8q4^a9&jBi^O6)t_;n9LggC(`fBLEhE*atu}^VJ01sE4=PLDcYM zFVV*iOs!luKF%v8=xcu?_^|6zAXgYbum7GxortQ0l0>-7P(@95Z&d2~Swz@G%n1e5 z+F(_y%m0<+Y=k^teOSb!>Km*N`X2c;4+ThZ5xQ_s2fsYV%UMc%X3EtP{!QCSA!D#l z%d`lkRf*z{;C@+NN(b7}gn#k6{FvN^u@3nfd#<89oJFDYaoX8{`+ruF&?0&oYHWhy zSo4v-0PnCJZemi2DGkD30XmfkXeziuq@-@P6LRr|DpEuUSys%by7N&*Ye5&)86dmS z$cOV9{9=M{o?m;k6MZgfB-w^82-45Ca(IB;(#e$UijZtH|9Grll|d~<7I?k5XAB}R z{<-&=HAylsZ<~}cDT`-2+k?92W9=W$!ymwe(*3Su zan?CtIa)3N&>J54(PX92w;1y#^pt6sNM*)2pXI(ebFxxx`$zH3m)^(@Fc`<+;BqSJGYIOwLF| zUG1;!)lXx}f>`)-?#P-K!>Aty5B*dC7Mu#O;8f71LM;eO2ev|aPE&iabo~)0qYsO_ zDgiekM`KvLLE|4VuT2vHADjBIjyfkItY~5SXhDk2H8NM`%P}4PSyKkUe8tBCBudh) zJHjmLZgad}LUo8ye)S4;XVob4(8J&mV;L{RH#m66N;A&bu#LOmZTlA$GHTnpSq^?_ zt#<(&n#w)YT51xp_U;QnCf%`-!f9*56aKz41(X>+QTM|h%zCvX>_{ZVI;L8VC(HsO zT!~x1az+beurl7!YXv(6U6fVN&7_Go>C%0vPOZE3OnfUN;K4uja`_?PtJ6VC3F`

_FIKDp@ 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°R4Tw^Q@IH`^!r}d>W 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 literal 0 HcmV?d00001 diff --git a/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/Makefile b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/Makefile new file mode 100644 index 0000000..fca8e2c --- /dev/null +++ b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/configurations.xml b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/configurations.xml new file mode 100644 index 0000000..70b25b0 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/configurations.xml @@ -0,0 +1,1022 @@ + + + + + + + + + + + ../src/system_config/IoT-Ethernet/framework/driver/adc/drv_adc_static.h + + + ../src/system_config/IoT-Ethernet/framework/driver/cmp/drv_cmp_static.h + + + + + ../src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.h + + + + + ../src/system_config/IoT-Ethernet/framework/system/clk/sys_clk_static.h + + + + ../src/system_config/IoT-Ethernet/FreeRTOSConfig.h + ../src/system_config/IoT-Ethernet/config.h + ../src/system_config/IoT-Ethernet/system_config.h + ../src/system_config/IoT-Ethernet/system_definitions.h + + + ../src/app.h + ../src/ca-certs.h + ../src/app_nvm_support.h + ../src/bsp_config.h + ../src/app1.h + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/ecc.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/arc4.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/pwdbased.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/tfm.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/asn.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/des3.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/rsa.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/aes.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/md5.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/sha.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/sha256.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/sha512.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/hmac.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/hash.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/compress.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/random.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/coding.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/error-crypt.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/integer.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/internal.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/logging.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/memory.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/misc.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/port.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/settings.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/types.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/version.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/visibility.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/crypto.h + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethmac/drv_ethmac.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethmac/src/drv_ethmac_local.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethmac/src/dynamic/_eth_dcpt_lists.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethmac/src/dynamic/drv_ethmac_lib.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethphy/drv_ethphy.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethphy/src/drv_ethphy_local.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethphy/src/dynamic/drv_extphy_regs.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethphy/src/dynamic/drv_extphy_smsc8740.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/nvm/drv_nvm.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/tmr/drv_tmr.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/usb/drv_usb.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/driver.h + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/src/net_pres_local.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/net_pres.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/net_pres_certstore.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/net_pres_encryptionproviderapi.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/net_pres_socketapi.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/net_pres_transportapi.h + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/command/sys_command.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/common/sys_common.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/common/sys_module.h + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/console/src/sys_console_local.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/console/src/sys_console_usb_cdc_local.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/console/sys_console.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/debug/sys_debug.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/devcon/sys_devcon.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/devcon/src/sys_devcon_cache.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/fs/sys_fs.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/fs/sys_fs_media_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/fs/mpfs/mpfs.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/int/sys_int.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/ports/sys_ports.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/random/sys_random.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/reset/sys_reset.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/tmr/sys_tmr.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/system.h + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/common/sys_fs_wrapper.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/common/helpers.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/common/lfsr.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcp_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcp_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/udp_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/udp_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_heap_alloc.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/arp_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/arp_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/dhcp_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/dhcp_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/dns_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/dns_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/http_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/http_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/nbns_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/sntp_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/zero_conf_helper.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/zero_conf_link_local_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/zero_conf_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_announce_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/hash_fnv.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/link_list.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/oahash.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_helpers_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_manager_control.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_module_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_notify.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_packet.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_private.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_types.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/ipv4_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/ipv4_private.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcp.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/udp.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_heap.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/arp.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tls.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/dhcp.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/dns.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/http.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/nbns.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/sntp.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/zero_conf_link_local.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/zero_conf_multicast_dns.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_helpers.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_manager.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_common_ports.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/ipv4.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_mac.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_mac_object.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/tcpip_ethernet.h + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/usb/usb_device.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/usb/usb_cdc.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/usb/usb_device_cdc.h + + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/portable/MPLAB/PIC32MZ/ISR_Support.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/portable/MPLAB/PIC32MZ/portmacro.h + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/croutine.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/event_groups.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/FreeRTOS.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/list.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/mpu_wrappers.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/portable.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/projdefs.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/queue.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/semphr.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/StackMacros.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/task.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/include/timers.h + + + ../src/parson.h + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/asn_public.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/blake2-impl.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/blake2-int.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/blake2.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/camellia.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/chacha.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/chacha20_poly1305.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/curve25519.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/dh.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/dsa.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/ed25519.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/error-crypt.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/fe_operations.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/fips_test.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/ge_operations.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/hc128.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/md2.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/md4.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/mpi_class.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/mpi_superclass.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/pkcs7.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/poly1305.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/rabbit.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/wolfcrypt/ripemd.h + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/callbacks.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/certs_test.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/crl.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/error-ssl.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/ocsp.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/options.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/sniffer.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/sniffer_error.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/ssl.h + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfssl/test.h + + + + + ../src/wolfmqttsdk/wolfmqtt/mqtt_client.h + ../src/wolfmqttsdk/wolfmqtt/mqtt_packet.h + ../src/wolfmqttsdk/wolfmqtt/mqtt_socket.h + ../src/wolfmqttsdk/wolfmqtt/mqtt_types.h + ../src/wolfmqttsdk/wolfmqtt/version.h + ../src/wolfmqttsdk/wolfmqtt/visibility.h + + + + + + + + + + + + + + ../src/system_config/IoT-Ethernet/framework/driver/adc/src/drv_adc_static.c + + + + + ../src/system_config/IoT-Ethernet/framework/driver/cmp/src/drv_cmp_static.c + + + + + + ../src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.c + ../src/system_config/IoT-Ethernet/framework/net/pres/net_pres_cert_store.c + + + + + + ../src/system_config/IoT-Ethernet/framework/system/clk/src/sys_clk_static.c + + + + + ../src/system_config/IoT-Ethernet/framework/system/ports/src/sys_ports_static.c + + + + + ../src/system_config/IoT-Ethernet/system_init.c + ../src/system_config/IoT-Ethernet/system_interrupt.c + ../src/system_config/IoT-Ethernet/system_exceptions.c + ../src/system_config/IoT-Ethernet/system_tasks.c + ../src/system_config/IoT-Ethernet/system_interrupt_a.S + ../src/system_config/IoT-Ethernet/rtos_hooks.c + + + ../src/app.c + ../src/main.c + ../src/configuration_http.c + ../src/app_nvm_support.c + ../src/http_print.c + ../src/bsp_sys_init.c + ../src/mpfs_img2.c + ../src/app1.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/ecc.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/arc4.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/pwdbased.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/tfm.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/asn.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/des3.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/rsa.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/aes.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/md5.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/sha.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/sha256.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/sha512.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/hmac.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/hash.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/compress.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/random.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/crypto.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/coding.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/error.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/integer.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/logging.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/memory.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/misc.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/crypto/src/port.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethmac/src/dynamic/drv_ethmac.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethmac/src/dynamic/drv_ethmac_lib.c + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethphy/src/dynamic/drv_ethphy.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/ethphy/src/dynamic/drv_extphy_smsc8740.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/nvm/src/dynamic/drv_nvm.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/nvm/src/dynamic/drv_nvm_erasewrite.c + + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/tmr/src/dynamic/drv_tmr.c + + + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/usb/usbhs/src/dynamic/drv_usbhs.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/driver/usb/usbhs/src/dynamic/drv_usbhs_device.c + + + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/net/pres/src/net_pres.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/osal/src/osal_freertos.c + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/command/src/sys_command.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/console/src/sys_console.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/console/src/sys_console_usb_cdc.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/debug/src/sys_debug.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/devcon/src/sys_devcon.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/devcon/src/sys_devcon_pic32mz.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/devcon/src/sys_devcon_cache_pic32mz.S + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/fs/src/dynamic/sys_fs.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/fs/src/dynamic/sys_fs_media_manager.c + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/fs/mpfs/src/mpfs.c + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/int/src/sys_int_pic32.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/ports/src/sys_ports.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/random/src/sys_random.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/reset/src/sys_reset.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/system/tmr/src/sys_tmr.c + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/common/sys_fs_wrapper.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/common/helpers.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/common/lfsr.c + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/udp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_heap_alloc.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_heap_internal.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/arp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/dhcp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/dns.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/http.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/nbns.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/sntp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/zero_conf_helper.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/zero_conf_link_local.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/zero_conf_multicast_dns.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_announce.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/hash_fnv.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/oahash.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_helpers.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_helper_c32.S + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_manager.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_notify.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/tcpip_packet.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/tcpip/src/ipv4.c + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/usb/src/dynamic/usb_device.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/usb/src/dynamic/usb_device_cdc.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/framework/usb/src/dynamic/usb_device_cdc_acm.c + + + + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/portable/MemMang/heap_2.c + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port_asm.S + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/croutine.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/list.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/queue.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/tasks.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/timers.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/rtos/FreeRTOS/Source/event_groups.c + + + ../src/parson.c + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/asm.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/blake2b.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/camellia.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/chacha.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/chacha20_poly1305.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/curve25519.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/dh.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/dsa.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/ecc_fp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/ed25519.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/fe_low_mem.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/fe_operations.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/ge_low_mem.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/ge_operations.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/hc128.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/md2.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/md4.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/pkcs7.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/poly1305.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/rabbit.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/wolfcrypt/src/ripemd.c + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/crl.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/internal.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/io.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/keys.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/ocsp.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/sniffer.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/ssl.c + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/third_party/tcpip/wolfssl/src/tls.c + + + + + ../src/wolfmqttsdk/src/mqtt_client.c + ../src/wolfmqttsdk/src/mqtt_packet.c + ../src/wolfmqttsdk/src/mqtt_socket.c + + + + + Makefile + + + + ../src + ../src/IoT-Ethernet + ../src/system_config/IoT-Ethernet + ../../../../../microchip/harmony/v1_07_01_ORIGINAL + + Makefile + + + + localhost + PIC32MZ2048EFM064 + + + RealICEPlatformTool + XC32 + 1.40 + 4 + + + + + ../../../../../../../microchip/harmony/v1_07_01_ORIGINAL/bin/framework/peripheral/PIC32MZ2048EFM064_peripherals.a + + + + + + false + false + + + + + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/project.xml b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/project.xml new file mode 100644 index 0000000..7a2a679 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.X/nbproject/project.xml @@ -0,0 +1,18 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + + aws-iot-ethernet + e54023e9-3948-44ef-bf6f-29d8b223e555 + 0 + c + + h + + ISO-8859-1 + + + + diff --git a/software/aws-iot-ethernet/firmware/aws-iot-ethernet.hconfig b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.hconfig new file mode 100644 index 0000000..a49ccec --- /dev/null +++ b/software/aws-iot-ethernet/firmware/aws-iot-ethernet.hconfig @@ -0,0 +1,60 @@ +# +# Application configuration file generated by +# Microchip Harmony Configurator (MHC) from Harmony version: 1.04 +# + +mainmenu "MPLAB Harmony & Application Configuration" + +menu "Application Configuration" + +config APP_INSTANCES + int "Number of Applications" + default 1 + range 1 10 # Must limit to 10 or application templates will need to be updated. + +config APP_AUTO_GENERATE_CODE # Used by MHC internally to selectively auto-generate app.h, app.c, and main.c + bool + default n + +source "$HARMONY_VERSION_PATH/utilities/mhc/config/gencode/framework/global_event/config/global_event_gencode.hconfig" +source "$HARMONY_VERSION_PATH/utilities/mhc/config/app_name_idx_gencode.ftl" 10 instances + +menu "Exception Handling" + +config USE_EXCEPTION_HANDLER + bool "Use MPLAB Harmony Exception Handler Template?" + default y + ---help--- + Enter 'Y' if you want to include an exception handler template + (system_exceptions.c) in this system configuration. Enter 'N' if + you do not. + ---endhelp--- + +config EXCEPTION_USE_SYS_DEBUG + bool "Use debug services in exception handler?" + depends on USE_EXCEPTION_HANDLER + default y + ---help--- + Enter 'Y' if you want the exception handler to use the SYS_DEBUG service to + report exception information. Enter 'N' if you do not. + ---endhelp--- + +config EXCEPTION_BREAKPOINT + bool "Hit breakpoint when an exception occurs?" + depends on USE_EXCEPTION_HANDLER && EXCEPTION_USE_SYS_DEBUG + default y + ---help--- + Enter 'Y' if you want the exception handler to hit a breakpoint when + an exception occurs. Enter 'N' if you do not. + Note: Only works if debugging is enabled. + ---endhelp--- + +endmenu # Exception Handling + +#insert application specific configuration here + +endmenu # Application Configuration + +source "$HARMONY_VERSION_PATH/config/harmony.hconfig" + + diff --git a/software/aws-iot-ethernet/firmware/src/app.c b/software/aws-iot-ethernet/firmware/src/app.c new file mode 100644 index 0000000..92e7181 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/app.c @@ -0,0 +1,1021 @@ +/******************************************************************************* + MPLAB Harmony Application Source File + + Company: + Microchip Technology Inc. + + File Name: + app.c + + Summary: + This file contains the source code for the MPLAB Harmony application. + + Description: + This file contains the source code for the MPLAB Harmony application. It + implements the logic of the application's state machine and it may call + API routines of other MPLAB Harmony modules in the system, such as drivers, + system services, and middleware. However, it does not call any of the + system interfaces (such as the "Initialize" and "Tasks" functions) of any of + the modules in the system or make any assumptions about when those functions + are called. That is the responsibility of the configuration-specific system + files. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include "app.h" +#include "app1.h" +#include "parson.h" +#include "bsp_config.h" +#include "app_nvm_support.h" +#include "wolfmqttsdk/wolfmqtt/mqtt_client.h" + +// ***************************************************************************** +// ***************************************************************************** +// Section: Global Data Definitions +// ***************************************************************************** +// ***************************************************************************** + +// ***************************************************************************** +/* Application Data + + Summary: + Holds application data + + Description: + This structure holds the application's data. + + Remarks: + This structure should be initialized by the APP_Initialize function. + + Application strings and buffers are be defined outside this structure. +*/ + +APP_DATA appData; +extern APP1_DATA app1Data; + +char topic_awsUpdate[128]; +char topic_awsUpdateDelta[128]; + +#define MQTT_DEFAULT_CMD_TIMEOUT_MS 10000 +#define MAX_BUFFER_SIZE 1024 +#define MAX_PACKET_ID 65536 +#define KEEP_ALIVE 900 + + +byte txBuffer[MAX_BUFFER_SIZE]; +byte rxBuffer[MAX_BUFFER_SIZE]; + +static int mPacketIdLast; + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Callback Functions +// ***************************************************************************** +// ***************************************************************************** + +// WolfMQTT Callbacks for network connectivity +int APP_tcpipConnect_cb(void *context, const char* host, word16 port, int timeout_ms) +{ + + uint32_t timeout = 0; + timeout = SYS_TMR_TickCountGet(); + SYS_CONSOLE_PRINT("App: DNS: Resolving host '%s'\r\n", &appData.host); + TCPIP_DNS_RESULT dnsResult; + + dnsResult = TCPIP_DNS_Resolve((const char *)appData.host, TCPIP_DNS_TYPE_A); + if(dnsResult < 0) + { + SYS_CONSOLE_MESSAGE("App: DNS: Failed to begin\r\n"); + return APP_CODE_ERROR_FAILED_TO_BEGIN_DNS_RESOLUTION; + } + + while((dnsResult = TCPIP_DNS_IsResolved((const char *)appData.host, &appData.host_ipv4, IP_ADDRESS_TYPE_IPV4)) == TCPIP_DNS_RES_PENDING) + { + if(APP_TIMER_Expired_ms(&timeout, timeout_ms)) + { + return APP_CODE_ERROR_CMD_TIMEOUT; + } + } + if(dnsResult != (TCPIP_DNS_RES_OK)) + { + SYS_CONSOLE_PRINT("App: DNS: Resolution failed - Aborting\r\n"); + return APP_CODE_ERROR_DNS_FAILED; + } + else if(dnsResult == TCPIP_DNS_RES_OK) + { + SYS_CONSOLE_PRINT("App: DNS: Resolved IPv4 Address: %d.%d.%d.%d for host '%s'\r\n", + appData.host_ipv4.v4Add.v[0],appData.host_ipv4.v4Add.v[1],appData.host_ipv4.v4Add.v[2], + appData.host_ipv4.v4Add.v[3],appData.host); + } + SYS_CONSOLE_PRINT("App: TCPIP: Opening socket to '%d.%d.%d.%d:%d'\r\n", + appData.host_ipv4.v4Add.v[0], appData.host_ipv4.v4Add.v[1], appData.host_ipv4.v4Add.v[2], + appData.host_ipv4.v4Add.v[3], appData.port); + + uint32_t timeSocketbefore = SYS_TMR_TickCountGet(); + appData.socket = NET_PRES_SocketOpen(0, NET_PRES_SKT_ENCRYPTED_STREAM_CLIENT, IP_ADDRESS_TYPE_IPV4, (NET_PRES_SKT_PORT_T)port, (NET_PRES_ADDRESS *)&appData.host_ipv4, (NET_PRES_SKT_ERROR_T*)&appData.error); + NET_PRES_SocketWasReset(appData.socket); + + if(appData.socket == INVALID_SOCKET) + { + SYS_CONSOLE_MESSAGE("App: TCPIP: Invalid socket error\r\n"); + NET_PRES_SocketClose(appData.socket); + return APP_CODE_ERROR_INVALID_SOCKET; + } + + while(!NET_PRES_SKT_IsConnected(appData.socket)) + { + if(APP_TIMER_Expired_ms(&timeout, timeout_ms)) + { + return APP_CODE_ERROR_CMD_TIMEOUT; + } + } + while(NET_PRES_SKT_IsNegotiatingEncryption(appData.socket)) + { + if(APP_TIMER_Expired_ms(&timeout, timeout_ms)) + { + return APP_CODE_ERROR_CMD_TIMEOUT; + } + } + + if (!NET_PRES_SKT_IsSecure(appData.socket)) + { + SYS_CONSOLE_MESSAGE("App: TCPIP: SSL failed to negotiate\r\n"); + NET_PRES_SocketClose(appData.socket); + return APP_CODE_ERROR_FAILED_SSL_NEGOTIATION; + } + uint32_t timeSocketafter = SYS_TMR_TickCountGet(); + SYS_CONSOLE_PRINT("App: Socket Opened - Time to open %d ticks\r\n", timeSocketafter-timeSocketbefore); + + return 0; //Success +} + +int APP_tcpipWrite_cb(void *context, const byte* buf, int buf_len, int timeout_ms) +{ + int ret = 0; + uint32_t timeout; + + APP_TIMER_Set(&timeout); + //wait for data to be read, or error, or timeout + while(NET_PRES_SocketWriteIsReady(appData.socket, buf_len, 0) == 0) + { + if(NET_PRES_SocketWasReset(appData.socket)) + { + ret = APP_CODE_ERROR_SSL_FATAL; + return ret; + } + if(APP_TIMER_Expired_ms(&timeout, (uint32_t)timeout_ms)) + { + ret = APP_CODE_ERROR_CMD_TIMEOUT; + return ret; + } + } + ret = NET_PRES_SocketWrite(appData.socket, (uint8_t*)buf, buf_len); + return ret; +} + +int APP_tcpipRead_cb(void *context, byte* buf, int buf_len, int timeout_ms) +{ + int ret = 0; + uint32_t timeout; + + APP_TIMER_Set(&timeout); + // Wait for data to be read, or error, or timeout + while(NET_PRES_SocketReadIsReady(appData.socket) == 0) + { + if(NET_PRES_SocketWasReset(appData.socket)) + { + ret = APP_CODE_ERROR_SSL_FATAL; + return ret; + } + if(APP_TIMER_Expired_ms(&timeout, (uint32_t)timeout_ms)) + { + ret = APP_CODE_ERROR_CMD_TIMEOUT; + return ret; + } + } + ret = NET_PRES_SocketRead(appData.socket, (uint8_t*)buf, buf_len); + return ret; +} + +int APP_tcpipDisconnect_cb(void *context) +{ + int ret = 0; + NET_PRES_SKT_Close(appData.socket); + appData.state = APP_TCPIP_MQTT_NET_CONNECT; + return ret; +} + +static word16 mqttclient_get_packetid(void) +{ + mPacketIdLast = (mPacketIdLast >= MAX_PACKET_ID) ? + 1 : mPacketIdLast + 1; + return (word16)mPacketIdLast; +} + +const char* APP_Switch_Publish_Helper(BSP_SWITCH_ENUM sw) +{ + switch (sw) + { + case BSP_SWITCH_1: + return "state.reported.button1"; + case BSP_SWITCH_2: + return "state.reported.button2"; + case BSP_SWITCH_3: + return "state.reported.button3"; + case BSP_SWITCH_4: + return "state.reported.button4"; + default: + return 0; + break; + } +} + +int mqttclient_message_cb(MqttClient *client, MqttMessage *msg, byte msg_new, byte msg_done) +{ + char payload[MAX_BUFFER_SIZE]; + memcpy(payload, msg->buffer, msg->total_len); + payload[msg->total_len] = '\0'; + SYS_CONSOLE_PRINT("\r\nApp: MQTT.Message Received: %s -- Topic %*.*s\r\n\r\n", payload, msg->topic_name_len, msg->topic_name_len, msg->topic_name); + + appData.lightShowVal = BSP_LED_RX; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + + // If the topic matches our AWS IoT delta topic + // "$aws/things//shadow/update/delta" + if(strncmp(topic_awsUpdateDelta, msg->topic_name, strlen(topic_awsUpdateDelta)) == 0) + { + JSON_Value *root_value = json_parse_string(payload); + if (json_value_get_type(root_value) != JSONObject) + return -1; + JSON_Object * tObject = json_value_get_object(root_value); + + if(json_object_dotget_string(tObject, "state.led1") != NULL) + { + appData.led1 = true; + if(strcmp(json_object_dotget_string(tObject, "state.led1"), "on") == 0) + { + BSP_LEDOn(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + appData.led1val = true; + } + else if (strcmp(json_object_dotget_string(tObject, "state.led1"), "off") == 0) + { + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + appData.led1val = false; + } + } + if(json_object_dotget_string(tObject, "state.led2") != NULL) + { + appData.led2 = true; + if(strcmp(json_object_dotget_string(tObject, "state.led2"), "on") == 0) + { + BSP_LEDOn(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + appData.led2val = true; + } + else if (strcmp(json_object_dotget_string(tObject, "state.led2"), "off") == 0) + { + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + appData.led2val = false; + } + } + if(json_object_dotget_string(tObject, "state.led3") != NULL) + { + appData.led3 = true; + if(strcmp(json_object_dotget_string(tObject, "state.led3"), "on") == 0) + { + BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + appData.led3val = true; + } + else if (strcmp(json_object_dotget_string(tObject, "state.led3"), "off") == 0) + { + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + appData.led3val = false; + } + } + if(json_object_dotget_string(tObject, "state.led4") != NULL) + { + appData.led4 = true; + if(strcmp(json_object_dotget_string(tObject, "state.led4"), "on") == 0) + { + BSP_LEDOn(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + appData.led4val = true; + } + else if (strcmp(json_object_dotget_string(tObject, "state.led4"), "off") == 0) + { + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + appData.led4val = false; + } + } + + //Got LED Values now we send our reported LED values + JSON_Value *root_value_publish = json_value_init_object(); + JSON_Object *root_object_publish = json_value_get_object(root_value_publish); + char *serialized_string = NULL; + + if(appData.led1) + { + json_object_dotset_string(root_object_publish, "state.reported.led1", appData.led1val ? "on" : "off"); + } + if(appData.led2) + { + json_object_dotset_string(root_object_publish, "state.reported.led2", appData.led2val ? "on" : "off"); + } + if(appData.led3) + { + json_object_dotset_string(root_object_publish, "state.reported.led3", appData.led3val ? "on" : "off"); + } + if(appData.led4) + { + json_object_dotset_string(root_object_publish, "state.reported.led4", appData.led4val ? "on" : "off"); + } + appData.led1 = appData.led2 = appData.led3 = appData.led4 = false; + + // We build our PUBLISH payload + char reportedPayload[1024]; + + serialized_string = json_serialize_to_string(root_value_publish); + strcpy(reportedPayload, serialized_string); + json_free_serialized_string(serialized_string); + + /* Publish Topic */ + MqttPublish publish; + int rc; + XMEMSET(&publish, 0, sizeof(MqttPublish)); + publish.retain = 0; + publish.qos = 0; + publish.duplicate = 0; + publish.topic_name = topic_awsUpdate; + publish.packet_id = mqttclient_get_packetid(); + publish.buffer = (byte *)reportedPayload; + publish.total_len = strlen((char *)publish.buffer); + rc = MqttClient_Publish(&appData.myClient, &publish); + SYS_CONSOLE_PRINT("App: MQTT.Publish: Topic %s, %s (%d)\r\n Payload: %s\r\n", + publish.topic_name, MqttClient_ReturnCodeToString(rc), rc, publish.buffer); + if (rc != MQTT_CODE_SUCCESS) { + while(1); + } + appData.lightShowVal = BSP_LED_TX; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + + json_value_free(root_value); + json_value_free(root_value_publish); + } + return 0; +} + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Local Functions +// ***************************************************************************** +// ***************************************************************************** + + +bool APP_TIMER_Expired(uint32_t * timer, uint32_t seconds) +{ + if((SYS_TMR_TickCountGet() - *timer) > (seconds * 1000)) + { + return true; + } + else + { + return false; + } + return false; +} + +bool APP_TIMER_Expired_ms(uint32_t * timer, uint32_t mseconds) +{ + if((SYS_TMR_TickCountGet() - *timer) > (mseconds)) + { + return true; + } + else + { + return false; + } + return false; +} + +bool APP_TIMER_Set(uint32_t * timer) +{ + *timer = SYS_TMR_TickCountGet(); + return true; +} + +const char* APP_ReturnCodeToString(int return_code) +{ + switch(return_code) + { + case APP_CODE_SUCCESS: + return "Success"; + case APP_CODE_ERROR_BAD_ARG: + return "Error (Bad argument)"; + case APP_CODE_ERROR_OUT_OF_BUFFER: + return "Error (Out of buffer)"; + case APP_CODE_ERROR_SSL_FATAL: + return "Error (SSL Fatal)"; + case APP_CODE_ERROR_INVALID_SOCKET: + return "Error (Invalid Socket)"; + case APP_CODE_ERROR_FAILED_TO_BEGIN_DNS_RESOLUTION: + return "Error (Failed to Begin DNS)"; + case APP_CODE_ERROR_DNS_FAILED: + return "Error (DNS Failed)"; + case APP_CODE_ERROR_FAILED_SSL_NEGOTIATION: + return "Error (Failed SSL Negotiation)"; + case APP_CODE_ERROR_TIMEOUT: + return "Error (Timeout)"; + case APP_CODE_ERROR_CMD_TIMEOUT: + return "Error (Command Timeout)"; + } + return "Unknown"; +} + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Initialization and State Machine Functions +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void APP_Initialize ( void ) + + Remarks: + See prototype in app.h. + */ + +void APP_Initialize ( void ) +{ + /* Place the App state machine in its initial state. */ + appData.state = APP_STATE_INIT; + memset(appData.host, '\0', sizeof(appData.host)); + appData.port = AWS_IOT_PORT; + + // Initialize MQTT net callbacks + appData.myNet.connect = APP_tcpipConnect_cb; + appData.myNet.disconnect = APP_tcpipDisconnect_cb; + appData.myNet.read = APP_tcpipRead_cb; + appData.myNet.write = APP_tcpipWrite_cb; + + // Init LED publish bools + appData.led1 = false; + appData.led2 = false; + appData.led3 = false; + appData.led4 = false; + + appData.led1val = false; + appData.led2val = false; + appData.led3val = false; + appData.led4val = false; +} + + +/****************************************************************************** + Function: + void APP_Tasks ( void ) + + Remarks: + See prototype in app.h. + */ + +void APP_Tasks ( void ) +{ + static int validConfig = 0; + + /* Check the application's current state. */ + switch ( appData.state ) + { + /* Application's initial state. */ + case APP_STATE_INIT: + { + bool appInitialized = true; + if (appInitialized) + { + SYS_CONSOLE_MESSAGE("App: Initialized\r\n"); + appData.state = APP_NVM_MOUNT_DISK; + } + break; + } + + // Mount the file system where the webpages are loaded + case APP_NVM_MOUNT_DISK: + { + if(SYS_FS_Mount(SYS_FS_NVM_VOL, LOCAL_WEBSITE_PATH_FS, MPFS2, 0, NULL) == 0) + { + SYS_CONSOLE_PRINT("App: The %s File System is mounted.\r\n", SYS_FS_MPFS_STRING); + appData.state = APP_NVM_ERASE_CONFIGURATION; + } + else + { // Timeout 5 seconds + if(APP_TIMER_Expired(&appData.genericUseTimer, 5)) + { + SYS_CONSOLE_PRINT("App: The %s File System failed to mount. Critical Error, reset board\r\n", SYS_FS_MPFS_STRING); + appData.lightShowVal = BSP_LED_NVM_FAILED_MOUNT; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + while(1); + } + } + break; + } + + // If user presses switch 2 and 3 on powerup, the configuration will be erased + case APP_NVM_ERASE_CONFIGURATION: + { + if((BSP_SWITCH_StateGet(BSP_SWITCH_3_CHANNEL, BSP_SWITCH_3_PORT) == BSP_SWITCH_STATE_ASSERTED) + && (BSP_SWITCH_StateGet(BSP_SWITCH_2_CHANNEL, BSP_SWITCH_2_PORT) == BSP_SWITCH_STATE_ASSERTED)) + { + memset(appData.host, 0, sizeof(appData.host)); + APP_NVM_Write(NVM_HOST_ADDRESS_SPACE, appData.host); + APP_NVM_Erase(NVM_CLIENT_CERTIFICATE_SPACE); + APP_NVM_Erase(NVM_CLIENT_KEY_SPACE); + SYS_CONSOLE_MESSAGE("************************************\r\n" + "App: Erasing host and certificates!\r\n" + "************************************\r\n"); + appData.state = APP_TCPIP_WAIT_INIT; + break; + } + appData.state = APP_NVM_LOAD_CONFIGURATION; + break; + } + + // Load the configuration stored in NVM on powerup + case APP_NVM_LOAD_CONFIGURATION: + { + SYS_CONSOLE_MESSAGE("App: Loading host and certificates from NVM\r\n"); + APP_NVM_Read(NVM_HOST_ADDRESS_SPACE, appData.host, sizeof(appData.host)); + APP_NVM_Read(NVM_CLIENT_CERTIFICATE_SPACE, appData.clientCert, sizeof(appData.clientCert)); + APP_NVM_Read(NVM_CLIENT_KEY_SPACE, appData.clientKey, sizeof(appData.clientKey)); + if(appData.host[0] != '\0') + { // Set this flag so we know we loaded a valid config from NVM + validConfig = 1; + } + appData.state = APP_TCPIP_WAIT_INIT; + break; + } + + // Wait for the TCPIP stack to initialize, store the boards MAC address and initialize mDNS service + case APP_TCPIP_WAIT_INIT: + { + SYS_STATUS tcpipStat; + TCPIP_NET_HANDLE netH; + int i, nNets; + + tcpipStat = TCPIP_STACK_Status(sysObj.tcpip); + if(tcpipStat < 0) + { // some error occurred + break; + } + else if(tcpipStat == SYS_STATUS_READY) + { + // now that the stack is ready we can check the + // available interfaces + nNets = TCPIP_STACK_NumberOfNetworksGet(); + for(i = 0; i < nNets; i++) + { + netH = TCPIP_STACK_IndexToNet(i); + TCPIP_STACK_NetNameGet(netH); + TCPIP_STACK_NetBIOSName(netH); + + // Retrieve MAC Address for UUID + TCPIP_NET_HANDLE netH = TCPIP_STACK_NetHandleGet("PIC32INT"); + TCPIP_MAC_ADDR* pAdd = 0; + pAdd = (TCPIP_MAC_ADDR *)TCPIP_STACK_NetAddressMac(netH); + + // Store UUID for application + appData.macAddress.v[5] = pAdd->v[5]; + appData.macAddress.v[4] = pAdd->v[4]; + appData.macAddress.v[3] = pAdd->v[3]; + appData.macAddress.v[2] = pAdd->v[2]; + appData.macAddress.v[1] = pAdd->v[1]; + appData.macAddress.v[0] = pAdd->v[0]; + + // Convert to string + sprintf(appData.uuid, "%02x%02x%02x%02x%02x%02x", + appData.macAddress.v[0], appData.macAddress.v[1], appData.macAddress.v[2], + appData.macAddress.v[3], appData.macAddress.v[4], appData.macAddress.v[5]); + + char mDNSServiceName[16]; // base name of the service Must not exceed 16 bytes long + strcpy(mDNSServiceName, &appData.uuid[6]); //Copy over UUID last 6 characters, + strcat(mDNSServiceName, "_IoT-E"); + SYS_CONSOLE_PRINT("App: Registering mDNS service as '%s'\r\n", mDNSServiceName); + // mDNS name will be xxxxxx_IoT-E where "xxxxxx" is the last three bytes of MAC address + mDNSServiceName[sizeof(mDNSServiceName) - 2] = '1' + i; + TCPIP_MDNS_ServiceRegister( netH + , mDNSServiceName // name of the service + ,"_http._tcp.local" // type of the service + ,80 // TCP or UDP port, at which this service is available + ,((const uint8_t *)"path=/index.htm") // TXT info + ,1 // auto rename the service when if needed + ,NULL // no callback function + ,NULL); + } + + // Here we build our Update and Delta topic strings using the boards unique MAC address + sprintf(topic_awsUpdateDelta, "$aws/things/%02x%02x%02x%02x%02x%02x/shadow/update/delta", + appData.macAddress.v[0], appData.macAddress.v[1], appData.macAddress.v[2], + appData.macAddress.v[3], appData.macAddress.v[4], appData.macAddress.v[5]); + sprintf(topic_awsUpdate, "$aws/things/%02x%02x%02x%02x%02x%02x/shadow/update", + appData.macAddress.v[0], appData.macAddress.v[1], appData.macAddress.v[2], + appData.macAddress.v[3], appData.macAddress.v[4], appData.macAddress.v[5]); + APP_TIMER_Set(&appData.genericUseTimer); + appData.state = APP_TCPIP_WAIT_FOR_IP; + } + break; + } + + case APP_TCPIP_WAIT_FOR_IP: + { + IPV4_ADDR ipAddr; + TCPIP_NET_HANDLE netH; + int i, nNets; + + if(APP_TIMER_Expired(&appData.genericUseTimer, 5)) + { + SYS_CONSOLE_MESSAGE("App: Not getting IP Addr, check connections. Retrying...\r\n"); + APP_TIMER_Set(&appData.genericUseTimer); + } + + nNets = TCPIP_STACK_NumberOfNetworksGet(); + for (i = 0; i < nNets; i++) + { + netH = TCPIP_STACK_IndexToNet(i); + ipAddr.Val = TCPIP_STACK_NetAddress(netH); + if( 0 != ipAddr.Val) + { + if (ipAddr.v[0] != 0 && ipAddr.v[0] != 169) // Wait for a Valid IP + { + uint32_t lightShowVal = BSP_LED_EASY_CONFIGURATION; + xQueueSendToFront(app1Data.lightShowQueue, &lightShowVal, 1); + SYS_CONSOLE_PRINT("App: Board online. mDNS online. IP addr %d.%d.%d.%d online. All systems nominal.\r\n", + ipAddr.v[0],ipAddr.v[1],ipAddr.v[2],ipAddr.v[3]); + SYS_CONSOLE_PRINT("App: MAC Address '%s'\r\n", appData.uuid); + SYS_CONSOLE_MESSAGE("App: Waiting for configuration...\r\n"); + appData.state = APP_TCPIP_WAIT_CONFIGURATION; + } + } + } + break; + } + + case APP_TCPIP_WAIT_CONFIGURATION: + { + // We check if "host" is null, if it has a value, we assume we have a configuration + if(appData.host[0] == '\0') + { + break; + } + else + { // If validConfig flag is set, then we know the config came from reading NVM so we can skip this step + if(validConfig == 0) + { + SYS_CONSOLE_MESSAGE("App: Received configuration from webpage, writing to NVM...\r\n"); + if(APP_NVM_Write(NVM_HOST_ADDRESS_SPACE, appData.host) && + APP_NVM_Write(NVM_CLIENT_CERTIFICATE_SPACE, appData.clientCert) && + APP_NVM_Write(NVM_CLIENT_KEY_SPACE, appData.clientKey)) + { + SYS_CONSOLE_MESSAGE("App: Writing configuration to NVM - success\r\n"); + } + else + { + SYS_CONSOLE_MESSAGE("App: Writing configuration to NVM - failed\r\n"); + while(1); + } + SYS_CONSOLE_PRINT("App: Configured host '%s'\r\n", appData.host); + } + else if(validConfig) + { + SYS_CONSOLE_PRINT("App: Found configuration - host '%s'\r\n", appData.host); + } + appData.lightShowVal = BSP_LED_INTIAL_CONNECT; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + TCPIP_NET_HANDLE netH; + int i, nNets; + + //Disable ZeroConf and HTTP server since we have server + nNets = TCPIP_STACK_NumberOfNetworksGet(); + for (i = 0; i < nNets; i++) + { + netH = TCPIP_STACK_IndexToNet(i); + TCPIP_ZCLL_Disable(netH); + } + } + appData.state = APP_TCPIP_MQTT_INIT; + break; + } + + + + case APP_TCPIP_MQTT_INIT: + { + SYS_CONSOLE_MESSAGE("App: Beginning MQTT Client application\r\n"); + int rc = MqttClient_Init(&appData.myClient, &appData.myNet, mqttclient_message_cb, txBuffer, MAX_BUFFER_SIZE, rxBuffer, MAX_BUFFER_SIZE, MQTT_DEFAULT_CMD_TIMEOUT_MS); + SYS_CONSOLE_PRINT("App: MQTT.Client_Init: %s (%d)\r\n", MqttClient_ReturnCodeToString(rc), rc); + if(rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_MESSAGE("App: MQTT.Client_Init: Failed (catastrophic)\r\n"); + while(1); + } + APP_TIMER_Set(&appData.genericUseTimer); + appData.state = APP_TCPIP_MQTT_NET_CONNECT; + break; + } + + case APP_TCPIP_MQTT_NET_CONNECT: + { + SYS_CONSOLE_MESSAGE("App: MQTT.Net_Connect\r\n"); + int rc = MqttClient_NetConnect(&appData.myClient, (const char *)&appData.host, AWS_IOT_PORT, MQTT_DEFAULT_CMD_TIMEOUT_MS, NULL, NULL); + SYS_CONSOLE_PRINT("App: MQTT.Net_Connect: %s (%d)\r\n", MqttClient_ReturnCodeToString(rc), rc); + if(rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_PRINT("App: %s (%d)\r\n", APP_ReturnCodeToString(rc), rc); + SYS_CONSOLE_PRINT("App: Closing Socket %d\r\n\r\n", appData.socket); + NET_PRES_SocketClose(appData.socket); + appData.lightShowVal = BSP_LED_SERVER_CONNECT_FAILED; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + while(!APP_TIMER_Expired(&appData.genericUseTimer, 5)); + APP_TIMER_Set(&appData.genericUseTimer); + break; + } + appData.lightShowVal = BSP_LED_ALL_GOOD; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + appData.state = APP_TCPIP_MQTT_PROTOCOL_CONNECT; + break; + } + + case APP_TCPIP_MQTT_PROTOCOL_CONNECT: + { + MqttConnect connect; + MqttMessage lwt_msg; + XMEMSET(&connect, 0, sizeof(MqttConnect)); + connect.keep_alive_sec = KEEP_ALIVE; + connect.clean_session = 1; + char clientIdString[13]; + sprintf(clientIdString, appData.uuid, "%02x%02x%02x%02x%02x%02x\0", + appData.macAddress.v[0], appData.macAddress.v[1], appData.macAddress.v[2], + appData.macAddress.v[3], appData.macAddress.v[4], appData.macAddress.v[5]); + connect.client_id = clientIdString; + XMEMSET(&lwt_msg, 0, sizeof(lwt_msg)); + connect.lwt_msg = &lwt_msg; + connect.enable_lwt = 0; + + /* Send Connect and wait for Connect Ack */ + int rc = MqttClient_Connect(&appData.myClient, &connect); + SYS_CONSOLE_PRINT("App: MQTT.Client_Connect: %s (%d)\r\n", MqttClient_ReturnCodeToString(rc), rc); + if(rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_MESSAGE("App: MQTT.Client_Connect: failed\r\n"); + APP_TIMER_Set(&appData.genericUseTimer); + while(!APP_TIMER_Expired(&appData.genericUseTimer, 5)); + appData.state = APP_TCPIP_ERROR; + break; + } + /* Validate Connect Ack info */ + SYS_CONSOLE_PRINT("App: MQTT.Connect Ack: Return Code %u, Session Present %d, keep alive: %d\r\n", + connect.ack.return_code, + (connect.ack.flags & MQTT_CONNECT_ACK_FLAG_SESSION_PRESENT) ? + 1 : 0, connect.keep_alive_sec); + APP_TIMER_Set(&appData.mqttKeepAlive); + appData.state = APP_TCPIP_MQTT_SUBSCRIBE; + break; + } + + case APP_TCPIP_MQTT_SUBSCRIBE: + { + MqttSubscribe subscribe; + MqttTopic topics[1], *topic; + MqttPublish publish; + int i, rc; + + /* Build list of topics */ + topics[0].topic_filter = topic_awsUpdateDelta; + topics[0].qos = 0; + + /* Subscribe Topic */ + XMEMSET(&subscribe, 0, sizeof(MqttSubscribe)); + subscribe.packet_id = mqttclient_get_packetid(); + subscribe.topic_count = sizeof(topics)/sizeof(MqttTopic); + subscribe.topics = topics; + rc = MqttClient_Subscribe(&appData.myClient, &subscribe); + SYS_CONSOLE_PRINT("App: MQTT.Subscribe: %s (%d)\r\n", + MqttClient_ReturnCodeToString(rc), rc); + if(rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_MESSAGE("App: MQTT.Subscribe: failed\r\n"); + APP_TIMER_Set(&appData.genericUseTimer); + while(!APP_TIMER_Expired(&appData.genericUseTimer, 5)); + appData.state = APP_TCPIP_ERROR; + break; + } + for (i = 0; i < subscribe.topic_count; i++) + { + topic = &subscribe.topics[i]; + SYS_CONSOLE_PRINT("App: MQTT.Topic List: %s, Qos %u, Return Code %u\r\n", + topic->topic_filter, topic->qos, topic->return_code); + } + + /* Publish Topic */ + XMEMSET(&publish, 0, sizeof(MqttPublish)); + publish.retain = 0; + publish.qos = 0; + publish.duplicate = 0; + publish.topic_name = topic_awsUpdate; + publish.packet_id = mqttclient_get_packetid(); + char publishPayload [MAX_BUFFER_SIZE]; + sprintf(publishPayload, "{\"state\":{\"reported\":{\"led1\":\"%s\",\"led2\":\"%s\",\"led4\":\"%s\",\"led3\":\"%s\"}}}", + appData.led1val ? "on" : "off", appData.led2val ? "on" : "off", appData.led3val ? "on" : "off", appData.led4val ? "on" : "off"); + publish.buffer = (byte *)publishPayload; + appData.led1val ? BSP_LEDOn(BSP_LED_1_CHANNEL, BSP_LED_1_PORT) : BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + appData.led2val ? BSP_LEDOn(BSP_LED_2_CHANNEL, BSP_LED_2_PORT) : BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + appData.led3val ? BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT) : BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + appData.led4val ? BSP_LEDOn(BSP_LED_4_CHANNEL, BSP_LED_4_PORT) : BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + publish.total_len = strlen((char *)publish.buffer); + rc = MqttClient_Publish(&appData.myClient, &publish); + SYS_CONSOLE_PRINT("App: MQTT.Publish: Topic %s, %s (%d)\r\n Payload: %s\r\n", + publish.topic_name, MqttClient_ReturnCodeToString(rc), rc, publish.buffer); + if(rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_MESSAGE("App: MQTT.Publish: failed\r\n"); + appData.state = APP_TCPIP_ERROR; + break; + } + appData.state = APP_TCPIP_MQTT_LOOP; + break; + } + + case APP_TCPIP_MQTT_LOOP: + { + int rc = 0; + if(APP_TIMER_Expired(&appData.mqttKeepAlive, KEEP_ALIVE)) + { + /* Keep Alive */ + rc = MqttClient_Ping(&appData.myClient); + // Reset keep alive timer + APP_TIMER_Set(&appData.mqttKeepAlive); + if (rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_PRINT("App: MQTT.Ping: Keep Alive Error: %s (%d)\r\n", + MqttClient_ReturnCodeToString(rc), rc); + appData.state = APP_TCPIP_ERROR; + break; + } + else + { + SYS_CONSOLE_PRINT("App: MQTT.Ping: %s (%d)\r\n", + MqttClient_ReturnCodeToString(rc), rc); + appData.lightShowVal = BSP_LED_TX; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + } + } + + // Check for incoming messages + rc = MqttClient_WaitMessage(&appData.myClient, 50); + + if (rc == MQTT_CODE_ERROR_TIMEOUT) + { + /* Keep Alive */ + rc = MqttClient_Ping(&appData.myClient); + if (rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_PRINT("App: MQTT.Ping: Keep Alive Error: %s (%d)\r\n", + MqttClient_ReturnCodeToString(rc), rc); + appData.state = APP_TCPIP_ERROR; + break; + } + } + else if (rc == MQTT_CODE_ERROR_NETWORK) + { + SYS_CONSOLE_PRINT("App: MQTT.WaitMessage: Network Error: %s (%d)\r\n", + MqttClient_ReturnCodeToString(rc), rc); + appData.state = APP_TCPIP_ERROR; + break; + } + else if (rc == APP_CODE_ERROR_CMD_TIMEOUT) + { + bool switchPublish, potPublish; + switchPublish = potPublish = false; + uint32_t potVal; + struct switchMessage test; + + /* There was no received messages check for publishes */ + if( uxQueueMessagesWaiting( app1Data.potentiometerQueue ) > 0 ) + { + xQueueReceive( app1Data.potentiometerQueue, &potVal, 1 ); + potPublish = true; + } + if( uxQueueMessagesWaiting( app1Data.switchQueue ) > 0 ) + { + xQueueReceive( app1Data.switchQueue, &test, 1 ); + switchPublish = true; + } + if(switchPublish || potPublish) + { + //Got switch change, send a publish + JSON_Value *rootValue = json_value_init_object(); + JSON_Object *rootObj = json_value_get_object(rootValue); + char *serialized_string = NULL; + char reportedPayload[MAX_BUFFER_SIZE]; + if(switchPublish) + { + json_object_dotset_string(rootObj, APP_Switch_Publish_Helper(test.switchNum), (test.switchVal ? "up" : "down")); + } + if(potPublish) + { + char potString[5] = {'\0'}; + sprintf(potString, "%d", potVal); + json_object_dotset_string(rootObj, "state.reported.potentiometer", potString); + } + serialized_string = json_serialize_to_string(rootValue); + strcpy(reportedPayload, serialized_string); + json_free_serialized_string(serialized_string); + + /* Publish Topic */ + MqttPublish publish; + int rc; + XMEMSET(&publish, 0, sizeof(MqttPublish)); + publish.retain = 0; + publish.qos = 0; + publish.duplicate = 0; + /* Build list of topics */ + publish.topic_name = topic_awsUpdate; + publish.packet_id = mqttclient_get_packetid(); + publish.buffer = (byte *)reportedPayload; + publish.total_len = strlen((char *)publish.buffer); + rc = MqttClient_Publish(&appData.myClient, &publish); + SYS_CONSOLE_PRINT("App: MQTT.Publish: Topic %s, %s (%d)\r\n Payload: %s\r\n", + publish.topic_name, MqttClient_ReturnCodeToString(rc), rc, publish.buffer); + if (rc != MQTT_CODE_SUCCESS) + { + SYS_CONSOLE_MESSAGE("App: MQTT.Publish: failed, closing socket and reconnecting\r\n\r\n"); + appData.state = APP_TCPIP_ERROR; + } + appData.lightShowVal = BSP_LED_TX; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + json_value_free(rootValue); + // Reset keep alive timer since we sent a publish + APP_TIMER_Set(&appData.mqttKeepAlive); + } + + break; + } + else if( rc != MQTT_CODE_SUCCESS) + { + appData.lightShowVal = BSP_LED_SERVER_CONNECT_FAILED; + xQueueSendToFront(app1Data.lightShowQueue, &appData.lightShowVal, 1); + SYS_CONSOLE_PRINT("App: MQTT.WaitMessage: Error: %s (%d)\r\n", MqttClient_ReturnCodeToString(rc), rc); + appData.state = APP_TCPIP_ERROR; + } + break; + } + + case APP_TCPIP_ERROR: + { + SYS_CONSOLE_PRINT("App: Closing Socket %d\r\n\r\n", appData.socket); + NET_PRES_SocketClose(appData.socket); + appData.state = APP_TCPIP_MQTT_NET_CONNECT; + break; + } + + /* The default state should never be executed. */ + default: + { + /* TODO: Handle error in application's state machine. */ + break; + } + } +} + + + +/******************************************************************************* + End of File + */ diff --git a/software/aws-iot-ethernet/firmware/src/app.h b/software/aws-iot-ethernet/firmware/src/app.h new file mode 100644 index 0000000..cfcba1a --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/app.h @@ -0,0 +1,296 @@ +/******************************************************************************* + MPLAB Harmony Application Header File + + Company: + Microchip Technology Inc. + + File Name: + app.h + + Summary: + This header file provides prototypes and definitions for the application. + + Description: + This header file provides function prototypes and data type definitions for + the application. Some of these are required by the system (such as the + "APP_Initialize" and "APP_Tasks" prototypes) and some of them are only used + internally by the application (such as the "APP_STATES" definition). Both + are defined here for convenience. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +//DOM-IGNORE-END + +#ifndef _APP_H +#define _APP_H + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include +#include +#include +#include +#include "system_config.h" +#include "system_definitions.h" + +#include "wolfmqttsdk/wolfmqtt/mqtt_client.h" + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + +extern "C" { + +#endif +// DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: Type Definitions +// ***************************************************************************** +// ***************************************************************************** +#define AWS_IOT_PORT 8883 + +#define NVM_CLIENT_CERTIFICATE_SPACE (32 * 1024) +#define NVM_CLIENT_KEY_SPACE (16 * 1024) +#define NVM_HOST_ADDRESS_SPACE (64 * 1024) + +/* Application Codes */ +enum AppCodes { + APP_CODE_SUCCESS = 0, + APP_CODE_ERROR_BAD_ARG = -1, + APP_CODE_ERROR_OUT_OF_BUFFER = -2, + APP_CODE_ERROR_SSL_FATAL = -3, + APP_CODE_ERROR_INVALID_SOCKET = -4, + APP_CODE_ERROR_FAILED_TO_BEGIN_DNS_RESOLUTION = -5, + APP_CODE_ERROR_DNS_FAILED = -6, + APP_CODE_ERROR_FAILED_SSL_NEGOTIATION = -7, + APP_CODE_ERROR_TIMEOUT = -8, + APP_CODE_ERROR_CMD_TIMEOUT = -9, +}; +// ***************************************************************************** +/* Application states + + Summary: + Application states enumeration + + Description: + This enumeration defines the valid application states. These states + determine the behavior of the application at various times. +*/ + +typedef enum +{ + /* Application's state machine's initial state. */ + APP_STATE_INIT=0, + APP_NVM_MOUNT_DISK, + APP_NVM_ERASE_CONFIGURATION, + APP_NVM_LOAD_CONFIGURATION, + APP_TCPIP_WAIT_INIT, + APP_TCPIP_WAIT_FOR_IP, + APP_TCPIP_WAIT_CONFIGURATION, + APP_TCPIP_MQTT_INIT, + APP_TCPIP_MQTT_NET_CONNECT, + APP_TCPIP_MQTT_PROTOCOL_CONNECT, + APP_TCPIP_MQTT_SUBSCRIBE, + APP_TCPIP_MQTT_LOOP, + APP_TCPIP_ERROR, + +} APP_STATES; + + +// ***************************************************************************** +/* Application Data + + Summary: + Holds application data + + Description: + This structure holds the application's data. + + Remarks: + Application strings and buffers are be defined outside this structure. + */ + +typedef struct +{ + /* The application's current state */ + APP_STATES state; + + // Last twelve characters of MAC address + char uuid[12 + 1]; + + // Client certificate location + __attribute__ ((aligned(4))) unsigned char clientCert[2048]; + + // Client key location + __attribute__ ((aligned(4))) unsigned char clientKey[2048]; + + // Network handles + NET_PRES_SKT_HANDLE_T socket; + TCP_PORT port; + NET_PRES_SKT_ERROR_T error; + void* ctx; + void* ssl; + + // The AWS endpoint to access the AWS IoT Service + unsigned char host[256]; + + // The AWS endpoint IP address location + IP_MULTI_ADDRESS host_ipv4; + + TCPIP_MAC_ADDR macAddress; + + // NVM Driver + DRV_HANDLE nvmHandle; + DRV_NVM_COMMAND_HANDLE nvmCommandHandle; + SYS_FS_MEDIA_GEOMETRY *gAppNVMMediaGeometry; + DRV_NVM_COMMAND_STATUS nvmStatus; + + // Timers + uint32_t genericUseTimer; + uint32_t timerTCPIP; + uint32_t mqttKeepAlive; + + // Mqtt Client + MqttNet myNet; + MqttClient myClient; + + // Value for light show + uint32_t lightShowVal; + + // LED Values + bool led1; + bool led2; + bool led3; + bool led4; + + bool led1val; + bool led2val; + bool led3val; + bool led4val; + +} APP_DATA; + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Callback Routines +// ***************************************************************************** +// ***************************************************************************** +/* These routines are called by drivers when certain events occur. +*/ + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Initialization and State Machine Functions +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void APP_Initialize ( void ) + + Summary: + MPLAB Harmony application initialization routine. + + Description: + This function initializes the Harmony application. It places the + application in its initial state and prepares it to run so that its + APP_Tasks function can be called. + + Precondition: + All other system initialization routines should be called before calling + this routine (in "SYS_Initialize"). + + Parameters: + None. + + Returns: + None. + + Example: + + APP_Initialize(); + + + Remarks: + This routine must be called from the SYS_Initialize function. +*/ + +void APP_Initialize ( void ); + + +/******************************************************************************* + Function: + void APP_Tasks ( void ) + + Summary: + MPLAB Harmony Demo application tasks function + + Description: + This routine is the Harmony Demo application's tasks function. It + defines the application's state machine and core logic. + + Precondition: + The system and application initialization ("SYS_Initialize") should be + called before calling this. + + Parameters: + None. + + Returns: + None. + + Example: + + APP_Tasks(); + + + Remarks: + This routine must be called from SYS_Tasks() routine. + */ + +void APP_Tasks( void ); + +bool APP_TIMER_Expired(uint32_t * timer, uint32_t seconds); +bool APP_TIMER_Expired_ms(uint32_t * timer, uint32_t mseconds); +bool APP_TIMER_Set(uint32_t * timer); + +#endif /* _APP_H */ + +//DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +//DOM-IGNORE-END + +/******************************************************************************* + End of File + */ + diff --git a/software/aws-iot-ethernet/firmware/src/app1.c b/software/aws-iot-ethernet/firmware/src/app1.c new file mode 100644 index 0000000..ab38a4d --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/app1.c @@ -0,0 +1,260 @@ +/******************************************************************************* + MPLAB Harmony Application Source File + + Company: + Microchip Technology Inc. + + File Name: + app1.c + + Summary: + This file contains the source code for the MPLAB Harmony application. + + Description: + This file contains the source code for the MPLAB Harmony application. It + implements the logic of the application's state machine and it may call + API routines of other MPLAB Harmony modules in the system, such as drivers, + system services, and middleware. However, it does not call any of the + system interfaces (such as the "Initialize" and "Tasks" functions) of any of + the modules in the system or make any assumptions about when those functions + are called. That is the responsibility of the configuration-specific system + files. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include "app1.h" +#include "peripheral/cmp/plib_cmp.h" + +// ***************************************************************************** +// ***************************************************************************** +// Section: Global Data Definitions +// ***************************************************************************** +// ***************************************************************************** +struct switchMessage mySwitchMessage; +#define APP_LOW_VOLTAGE 630 +#define APP_GOOD_VOLTAGE 650 + +// ***************************************************************************** +/* Application Data + + Summary: + Holds application data + + Description: + This structure holds the application's data. + + Remarks: + This structure should be initialized by the APP_Initialize function. + + Application strings and buffers are be defined outside this structure. +*/ + +APP1_DATA app1Data; +extern APP_DATA appData; +extern BSP_DATA bspData; + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Callback Functions +// ***************************************************************************** +// ***************************************************************************** + +/* TODO: Add any necessary callback functions. +*/ + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Local Functions +// ***************************************************************************** +// ***************************************************************************** + + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Initialization and State Machine Functions +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void APP1_Initialize ( void ) + + Remarks: + See prototype in app1.h. + */ + +void APP1_Initialize ( void ) +{ + /* Place the App state machine in its initial state. */ + app1Data.state = APP1_STATE_INIT; + BSP_Initialize(); + BSP_LED_LightShowSet(BSP_LED_CONNECTING_TO_AP); + app1Data.newPotSamp = 0; + app1Data.potTimer = 0; + app1Data.newVoltageSamp = 0; + app1Data.currIsLVD = true; + + // Queue for switch data + app1Data.switchQueue = xQueueCreate( 20, sizeof(mySwitchMessage) ); + if(app1Data.switchQueue == NULL) { + ; // Handle this + } + // Queue for LED light show data + // This will hold the requested Light Show state only + app1Data.lightShowQueue = xQueueCreate( 1, 4 ); + if(app1Data.lightShowQueue == NULL) { + ; // Handle this + } + // Queue for potentiometer data + // This will hold the latest potentionmeter data + app1Data.potentiometerQueue = xQueueCreate( 20, sizeof(app1Data.potValue) ); + if(app1Data.potentiometerQueue == NULL) { + ; // Handle this + } + xQueueReset(app1Data.switchQueue); + xQueueReset(app1Data.lightShowQueue); + xQueueReset(app1Data.potentiometerQueue); +} + + +/****************************************************************************** + Function: + void APP1_Tasks ( void ) + + Remarks: + See prototype in app1.h. + */ + +void APP1_Tasks ( void ) +{ + /* Check the application's current state. */ + switch ( app1Data.state ) + { + /* Application's initial state. */ + case APP1_STATE_INIT: + { + bool appInitialized = true; + + + if (appInitialized) + { + // Open the ADC drivers + DRV_ADC0_Open(); + // DRV_ADC1_Open(); + DRV_ADC_DigitalFilter0_Open(); + // DRV_ADC_DigitalFilter1_Open(); + DRV_ADC_Start(); + app1Data.state = APP1_STATE_SERVICE_TASKS; + } + break; + } + + case APP1_STATE_SERVICE_TASKS: + { + // BSP tasks that control switch and led functions + BSP_SYS_Tasks(); + + // Check if switches are pressed and send a message to the queue + if(BSP_SWITCH_SwitchGetState(BSP_SWITCH_1_PORT) != bspData.previousStateS1){ + BSP_SWITCH_SwitchSetPreviousState(BSP_SWITCH_1_PORT, BSP_SWITCH_SwitchGetState(BSP_SWITCH_1_PORT)); + mySwitchMessage.switchNum = BSP_SWITCH_1; + mySwitchMessage.switchVal = bspData.previousStateS1; + xQueueSendToBack( app1Data.switchQueue, &mySwitchMessage, 1 ); + } + if(BSP_SWITCH_SwitchGetState(BSP_SWITCH_2_PORT) != bspData.previousStateS2){ + BSP_SWITCH_SwitchSetPreviousState(BSP_SWITCH_2_PORT, BSP_SWITCH_SwitchGetState(BSP_SWITCH_2_PORT)); + mySwitchMessage.switchNum = BSP_SWITCH_2; + mySwitchMessage.switchVal = bspData.previousStateS2; + xQueueSendToBack( app1Data.switchQueue, &mySwitchMessage, 1 ); + } + if(BSP_SWITCH_SwitchGetState(BSP_SWITCH_3_PORT) != bspData.previousStateS3){ + BSP_SWITCH_SwitchSetPreviousState(BSP_SWITCH_3_PORT, BSP_SWITCH_SwitchGetState(BSP_SWITCH_3_PORT)); + mySwitchMessage.switchNum = BSP_SWITCH_3; + mySwitchMessage.switchVal = bspData.previousStateS3; + xQueueSendToBack( app1Data.switchQueue, &mySwitchMessage, 1 ); + } + if(BSP_SWITCH_SwitchGetState(BSP_SWITCH_4_PORT) != bspData.previousStateS4){ + BSP_SWITCH_SwitchSetPreviousState(BSP_SWITCH_4_PORT, BSP_SWITCH_SwitchGetState(BSP_SWITCH_4_PORT)); + mySwitchMessage.switchNum = BSP_SWITCH_4; + mySwitchMessage.switchVal = bspData.previousStateS4; + xQueueSendToBack( app1Data.switchQueue, &mySwitchMessage, 1 ); + } + + // Trigger an ADC reading every one second for the pot + if((SYS_TMR_TickCountGet() - app1Data.potTimer) > (1000)){ + app1Data.potTimer = SYS_TMR_TickCountGet(); + DRV_ADC_Start(); + } + + // If the ADC reading is ready, see if value changed and send a message to queue + if(DRV_ADC_DigitalFilter0_DataIsReady()) { + app1Data.newPotSamp = (uint16_t)DRV_ADC_DigitalFilter0_DataRead(); + uint32_t adcVal; + adcVal = app1Data.newPotSamp >> 6; + if(adcVal != app1Data.potValue) { + app1Data.potValue = adcVal; + app1Data.potChanged = true; + } + + if(app1Data.potChanged){ + xQueueSendToBack( app1Data.potentiometerQueue, &app1Data.potValue, 1 ); + app1Data.potChanged = false; + } + } + + // Check light show queue for a state, if exists, set state + if( uxQueueMessagesWaiting( app1Data.lightShowQueue ) > 0 ){ + uint32_t lightShowVar; + xQueueReceive( app1Data.lightShowQueue, &lightShowVar, 1 ); + BSP_LED_LightShowSet(lightShowVar); + } + + break; + } + + /* The default state should never be executed. */ + default: + { + /* TODO: Handle error in application's state machine. */ + break; + } + } +} + + + +/******************************************************************************* + End of File + */ diff --git a/software/aws-iot-ethernet/firmware/src/app1.h b/software/aws-iot-ethernet/firmware/src/app1.h new file mode 100644 index 0000000..af61a15 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/app1.h @@ -0,0 +1,233 @@ +/******************************************************************************* + MPLAB Harmony Application Header File + + Company: + Microchip Technology Inc. + + File Name: + app1.h + + Summary: + This header file provides prototypes and definitions for the application. + + Description: + This header file provides function prototypes and data type definitions for + the application. Some of these are required by the system (such as the + "APP_Initialize" and "APP_Tasks" prototypes) and some of them are only used + internally by the application (such as the "APP_STATES" definition). Both + are defined here for convenience. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +//DOM-IGNORE-END + +#ifndef _APP1_H +#define _APP1_H + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include +#include +#include +#include +#include "system_config.h" +#include "system_definitions.h" + +#include "bsp_config.h" + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + +extern "C" { + +#endif +// DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: Type Definitions +// ***************************************************************************** +// ***************************************************************************** +struct switchMessage { + BSP_SWITCH_ENUM switchNum; + BSP_SWITCH_STATE switchVal; +}; + +// ***************************************************************************** +/* Application states + + Summary: + Application states enumeration + + Description: + This enumeration defines the valid application states. These states + determine the behavior of the application at various times. +*/ + +typedef enum +{ + /* Application's state machine's initial state. */ + APP1_STATE_INIT=0, + APP1_STATE_SERVICE_TASKS, + + /* TODO: Define states used by the application state machine. */ + +} APP1_STATES; + + +// ***************************************************************************** +/* Application Data + + Summary: + Holds application data + + Description: + This structure holds the application's data. + + Remarks: + Application strings and buffers are be defined outside this structure. + */ + +typedef struct +{ + /* The application's current state */ + APP1_STATES state; + + QueueHandle_t switchQueue; + QueueHandle_t lightShowQueue; + QueueHandle_t potentiometerQueue; + + uint32_t newPotSamp; + uint32_t potValue; + bool potChanged; + + uint32_t newVoltageSamp; + uint32_t voltageValue; + bool compTrip; + bool currIsLVD; + + + uint32_t potTimer; + +} APP1_DATA; + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Callback Routines +// ***************************************************************************** +// ***************************************************************************** +/* These routines are called by drivers when certain events occur. +*/ + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Initialization and State Machine Functions +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void APP1_Initialize ( void ) + + Summary: + MPLAB Harmony application initialization routine. + + Description: + This function initializes the Harmony application. It places the + application in its initial state and prepares it to run so that its + APP_Tasks function can be called. + + Precondition: + All other system initialization routines should be called before calling + this routine (in "SYS_Initialize"). + + Parameters: + None. + + Returns: + None. + + Example: + + APP1_Initialize(); + + + Remarks: + This routine must be called from the SYS_Initialize function. +*/ + +void APP1_Initialize ( void ); + + +/******************************************************************************* + Function: + void APP1_Tasks ( void ) + + Summary: + MPLAB Harmony Demo application tasks function + + Description: + This routine is the Harmony Demo application's tasks function. It + defines the application's state machine and core logic. + + Precondition: + The system and application initialization ("SYS_Initialize") should be + called before calling this. + + Parameters: + None. + + Returns: + None. + + Example: + + APP1_Tasks(); + + + Remarks: + This routine must be called from SYS_Tasks() routine. + */ + +void APP1_Tasks( void ); + + +#endif /* _APP1_H */ + +//DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +//DOM-IGNORE-END + +/******************************************************************************* + End of File + */ + diff --git a/software/aws-iot-ethernet/firmware/src/app_nvm_support.c b/software/aws-iot-ethernet/firmware/src/app_nvm_support.c new file mode 100644 index 0000000..61924f6 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/app_nvm_support.c @@ -0,0 +1,159 @@ +/******************************************************************************* + MPLAB Harmony Application Source File + + Company: + Microchip Technology Inc. + + File Name: + app_nvm_support.c + + Summary: + This file contains the source code for the MPLAB Harmony application. + + Description: + Contains support functions for writing application data to NVM. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + +#include "app_nvm_support.h" + + +extern APP_DATA appData; + +bool APP_NVM_Erase(uint32_t nvm_dest_address) +{ + int tmp; + + appData.nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE); + if(DRV_HANDLE_INVALID == appData.nvmHandle) + { + return false; + } + + appData.gAppNVMMediaGeometry = DRV_NVM_GeometryGet(appData.nvmHandle); + if(NULL ==appData. gAppNVMMediaGeometry) + { + return false; + } + + tmp = nvm_dest_address * (appData.gAppNVMMediaGeometry->geometryTable[2].numBlocks) / (DRV_NVM_MEDIA_SIZE * 1024); + + DRV_NVM_Erase(appData.nvmHandle, &appData.nvmCommandHandle, tmp, 1); + if(appData.nvmCommandHandle == DRV_NVM_COMMAND_HANDLE_INVALID) + { + return false; + } + + while(DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(appData.nvmHandle, appData.nvmCommandHandle)) + { + ; + } + + DRV_NVM_Close(appData.nvmHandle); + return true; +} + +bool APP_NVM_Write(uint32_t nvm_dest_address, uint8_t * data) +{ + int i, tmp; + uint8_t NVM_DATA_READ_BUFF_local[DRV_NVM_ROW_SIZE]; + uint8_t NVM_DATA_BUFF_local[DRV_NVM_ROW_SIZE]; + + for (i = 0; i < DRV_NVM_ROW_SIZE; i++) + NVM_DATA_BUFF_local[i] = data[i]; + + appData.nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE); + if(DRV_HANDLE_INVALID == appData.nvmHandle){ + return false; + } + + appData.gAppNVMMediaGeometry = DRV_NVM_GeometryGet(appData.nvmHandle); + if(NULL == appData. gAppNVMMediaGeometry){ + return false; + } + + DRV_NVM_Read (appData.nvmHandle, &appData.nvmCommandHandle, NVM_DATA_READ_BUFF_local, nvm_dest_address, DRV_NVM_ROW_SIZE); + if (DRV_NVM_COMMAND_HANDLE_INVALID == appData.nvmCommandHandle) { + return false;; + } + + tmp = nvm_dest_address * (appData.gAppNVMMediaGeometry->geometryTable[2].numBlocks) / (DRV_NVM_MEDIA_SIZE * 1024); + DRV_NVM_Erase(appData.nvmHandle, &appData.nvmCommandHandle, tmp, 1); + if(appData.nvmCommandHandle == DRV_NVM_COMMAND_HANDLE_INVALID){ + return false; + } + + + while(DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(appData.nvmHandle, appData.nvmCommandHandle)) + { + ; + } + + tmp = nvm_dest_address * (appData.gAppNVMMediaGeometry->geometryTable[1].numBlocks) / (DRV_NVM_MEDIA_SIZE * 1024); + DRV_NVM_Write(appData.nvmHandle, &appData.nvmCommandHandle, (uint8_t *)NVM_DATA_BUFF_local, tmp, 1); + if(DRV_NVM_COMMAND_HANDLE_INVALID == appData.nvmCommandHandle) + { + return false; + } + + while(DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(appData.nvmHandle, appData.nvmCommandHandle)) + { + ; + } + DRV_NVM_Close(appData.nvmHandle); + return true; +} + +bool APP_NVM_Read(uint32_t nvm_dest_address, uint8_t * buffer, uint32_t bufferLength) +{ + appData.nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE); + if(DRV_HANDLE_INVALID == appData.nvmHandle) + { + return false; + } + + appData.gAppNVMMediaGeometry = DRV_NVM_GeometryGet(appData.nvmHandle); + if(NULL == appData.gAppNVMMediaGeometry) + { + return false; + } + + DRV_NVM_Read(appData.nvmHandle, &appData.nvmCommandHandle, buffer, nvm_dest_address, bufferLength); + if(DRV_NVM_COMMAND_HANDLE_INVALID == appData.nvmCommandHandle) + { + return false; + } + + while(DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(appData.nvmHandle, appData.nvmCommandHandle)) + { + ; + } + + DRV_NVM_Close(appData.nvmHandle); + return true; + +} \ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/app_nvm_support.h b/software/aws-iot-ethernet/firmware/src/app_nvm_support.h new file mode 100644 index 0000000..5e17613 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/app_nvm_support.h @@ -0,0 +1,53 @@ +/******************************************************************************* + MPLAB Harmony Application Source File + + Company: + Microchip Technology Inc. + + File Name: + app_nvm_support.h + + Summary: + This file contains the source code for the MPLAB Harmony application. + + Description: + Contains function support for writing application data to NVM + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + + +#ifndef APP_NVM_SUPPORT_H +#define APP_NVM_SUPPORT_H + +#include "app.h" + +bool APP_NVM_Erase(uint32_t nvm_dest_address); +bool APP_NVM_Write(uint32_t nvm_dest_address, uint8_t * data); +bool APP_NVM_Read(uint32_t nvm_dest_address, uint8_t * buffer, uint32_t bufferLength); + +#endif /* APP_NVM_SUPPORT_H */ + diff --git a/software/aws-iot-ethernet/firmware/src/bsp_config.h b/software/aws-iot-ethernet/firmware/src/bsp_config.h new file mode 100755 index 0000000..36df275 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/bsp_config.h @@ -0,0 +1,612 @@ +/******************************************************************************* + Board Support Package Header File. + + Company: + Microchip Technology Inc. + + File Name: + bsp_config.h + + Summary: + Board Support Package Header file for IoT Wi-Fi n AWS IoT St. + + Description: + This file contains constants, macros, type defintions and function + declarations required by the IoT Wi-Fi G AWS IoT Starter Kit + +*******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _BSP_CONFIG_H +#define _BSP_CONFIG_H + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include +#include +#include +#include +#include +#include "peripheral/ports/plib_ports.h" + +// ***************************************************************************** +// ***************************************************************************** +// Section: Constants and Type Definitions. +// ***************************************************************************** +// ***************************************************************************** + +// ***************************************************************************** +/* Oscillator Frequency + + Summary: + Defines frequency value of crystal/oscillator used on the board + + Description: + Defines frequency value of crystal/oscillator used on the board +*/ + +#define BSP_OSC_FREQUENCY 24000000 + + +#define BSP_POTENTIOMETER PORTS_BIT_POS_3 + +typedef enum +{ + BSP_LED_EASY_CONFIGURATION, + BSP_LED_CONNECTING_TO_AP, + BSP_LED_CONNECTION_FAILED, + BSP_LED_SERVER_CONNECT_FAILED, + BSP_LED_AP_CONNECTED, + BSP_LED_ALL_GOOD, + BSP_LED_TX, + BSP_LED_RX, + BSP_LED_DNS_FAILED, + BSP_LED_TCPIP_STACK_INIT_FAILURE, + BSP_LED_NVM_FAILED_MOUNT, + BSP_LED_INTIAL_CONNECT, + BSP_LED_ALL_OFF +} BSP_LED_LIGHT_SHOW; + +// ********************** ******************************************************* +/* BSP Switch. + + Summary: + Defines the switches available on this board. + + Description: + This enumeration defines the switches available on this board. + + Remarks: + None. +*/ + +typedef enum +{ + + /* SWITCH 1 */ + BSP_SWITCH_1_PORT = /*DOM-IGNORE-BEGIN*/PORTS_BIT_POS_10/*DOM-IGNORE-END*/, + + /* SWITCH 2 */ + BSP_SWITCH_2_PORT = /*DOM-IGNORE-BEGIN*/PORTS_BIT_POS_8/*DOM-IGNORE-END*/, + + /* SWITCH 3 */ + BSP_SWITCH_3_PORT = /*DOM-IGNORE-BEGIN*/PORTS_BIT_POS_0/*DOM-IGNORE-END*/, + + /* SWITCH 4 */ + BSP_SWITCH_4_PORT = /*DOM-IGNORE-BEGIN*/PORTS_BIT_POS_5/*DOM-IGNORE-END*/, + +} BSP_SWITCH_PORT; + +typedef enum +{ + + /* SWITCH 1 */ + BSP_SWITCH_1_CHANNEL = /*DOM-IGNORE-BEGIN*/PORT_CHANNEL_B/*DOM-IGNORE-END*/, + + /* SWITCH 2 */ + BSP_SWITCH_2_CHANNEL = /*DOM-IGNORE-BEGIN*/PORT_CHANNEL_B/*DOM-IGNORE-END*/, + + /* SWITCH 3 */ + BSP_SWITCH_3_CHANNEL = /*DOM-IGNORE-BEGIN*/PORT_CHANNEL_F/*DOM-IGNORE-END*/, + + /* SWITCH 4 */ + BSP_SWITCH_4_CHANNEL = /*DOM-IGNORE-BEGIN*/PORT_CHANNEL_D/*DOM-IGNORE-END*/, + +} BSP_SWITCH_CHANNEL; + +typedef enum +{ + + BSP_SWITCH_1 = 1, + BSP_SWITCH_2 = 2, + BSP_SWITCH_3 = 3, + BSP_SWITCH_4 = 4, + +} BSP_SWITCH_ENUM; + +// ***************************************************************************** +/* BSP Switch state. + + Summary: + Defines possible states of the switches on this board. + + Description: + This enumeration defines the possible states of the switches on this board. + + Remarks: + None. +*/ + +typedef enum +{ + /* Switch pressed */ + BSP_SWITCH_STATE_ASSERTED = /*DOM-IGNORE-BEGIN*/0/*DOM-IGNORE-END*/, + + /* Switch not pressed */ + BSP_SWITCH_STATE_DEASSERTED = /*DOM-IGNORE-BEGIN*/1/*DOM-IGNORE-END*/ + +} BSP_SWITCH_STATE; + +#define BSP_SWITCH_BUSY -1 + +//DGC_FINISH Comment these +typedef struct +{ + int32_t prevValue; + int32_t timerActive; + int32_t duration; // In milliseconds + uint32_t startTick; + uint32_t endTick; + +}BSP_SWITCH_DEBOUNCE_T; + +#define BSP_MAX_SWITCHES 4 +#define BSP_SWITCH_DEBOUNCE_TIME 60 + +typedef struct +{ + BSP_LED_LIGHT_SHOW light_show; + BSP_SWITCH_STATE s1, s2, s3, s4; + BSP_SWITCH_STATE previousStateS1; + BSP_SWITCH_STATE previousStateS2; + BSP_SWITCH_STATE previousStateS3; + BSP_SWITCH_STATE previousStateS4; + BSP_SWITCH_DEBOUNCE_T switches[BSP_MAX_SWITCHES]; +} BSP_DATA; + +// ***************************************************************************** +/* LED Number. + + Summary: + Defines the LEDs available on this board. + + Description: + This enumeration defines the LEDs available on this board. + + Remarks: + None. +*/ + +typedef enum +{ + /* LED 1 */ + BSP_LED_1_PORT = PORTS_BIT_POS_13, + + /* LED 2 */ + BSP_LED_2_PORT = PORTS_BIT_POS_12, + + /* LED 3 */ + BSP_LED_3_PORT = PORTS_BIT_POS_1, + + /* LED 4 */ + BSP_LED_4_PORT = PORTS_BIT_POS_15, + + /* LED 5 */ + BSP_LED_5_PORT = PORTS_BIT_POS_6, + + /* LED 6 */ + BSP_LED_6_PORT = PORTS_BIT_POS_7, + + /* LED 7 */ + BSP_LED_7_PORT = PORTS_BIT_POS_9, + +} BSP_LED_PORT; + +typedef enum +{ + /* LED 1 */ + BSP_LED_1_CHANNEL = PORT_CHANNEL_B, + + /* LED 2 */ + BSP_LED_2_CHANNEL = PORT_CHANNEL_B, + + /* LED 3 */ + BSP_LED_3_CHANNEL = PORT_CHANNEL_F, + + /* LED 4 */ + BSP_LED_4_CHANNEL = PORT_CHANNEL_C, + + /* LED 5 */ + BSP_LED_5_CHANNEL = PORT_CHANNEL_B, + + /* LED 6 */ + BSP_LED_6_CHANNEL = PORT_CHANNEL_B, + + /* LED 7 */ + BSP_LED_7_CHANNEL = PORT_CHANNEL_B, + +} BSP_LED_CHANNEL; + +// ***************************************************************************** +/* LED State + + Summary: + Enumerates the supported LED states. + + Description: + This enumeration defines the supported LED states. + + Remarks: + None. +*/ + +typedef enum +{ + /* LED State is on */ + BSP_LED_STATE_OFF = 0, + /* LED State is off */ + BSP_LED_STATE_ON = 1, +} BSP_LED_STATE; + +// ***************************************************************************** +// ***************************************************************************** +// ***************************************************************************** +// Section: Interface Routines +// ***************************************************************************** +// ***************************************************************************** + +// ***************************************************************************** +/* Function: + void BSP_Initialize(void) + + Summary: + Performs the necessary actions to initialize a board + + Description: + This function initializes the LED and Switch ports on the board. This + function must be called by the user before using any APIs present on this + BSP. + + Precondition: + None. + + Parameters: + None + + Returns: + None. + + Example: + + //Initialize the BSP + BSP_Initialize(); + + + Remarks: + None +*/ + +void BSP_Initialize(void); + +// ***************************************************************************** +/* Function: + void BSP_LEDStateSet(BSP_LED led, BSP_LED_STATE state); + + Summary: + Controls the state of the LED. + + Description: + This function allows the application to specify the state of the LED. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + led - The LED to operate on. + state - The state to be set. + + Returns: + None. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Switch on LED3 on the board + BSP_LEDStateSet(BSP_LED_3, BSP_LED_STATE_ON); + + // Switch off LED4 on the board + BSP_LEDStateSet(BSP_LED_4, BSP_LED_STATE_OFF); + + + + Remarks: + None +*/ + +void BSP_LEDStateSet(BSP_LED_PORT led_port, BSP_LED_CHANNEL led_channel, BSP_LED_STATE led_state); + +// ***************************************************************************** +/* Function: + BSP_LED_STATE BSP_LEDStateGet(BSP_LED led); + + Summary: + Returns the present state of the LED. + + Description: + This function returns the present state of the LED. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + led - The LED to whose status needs to be obtained. + + Returns: + The ON/OFF state of the LED. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Check if LED3 is off + if(BSP_LED_STATE_OFF == BSP_LEDStateGet(BSP_LED_3) + { + // Switch on the LED. + BSP_LEDStateSet(BSP_LED_3, BSP_LED_STATE_ON); + } + + + + Remarks: + None +*/ + +BSP_LED_STATE BSP_LEDStateGet(BSP_LED_CHANNEL led_channel, BSP_LED_PORT led_port); + +// ***************************************************************************** +/* Function: + void BSP_LEDToggle(BSP_LED led); + + Summary: + Toggles the state of the LED between BSP_LED_STATE_ON and BSP_LED_STATE_OFF. + + Description: + This function toggles the state of the LED between BSP_LED_STATE_ON and + BSP_LED_STATE_OFF. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + led - The LED to toggle. + + Returns: + None. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Switch on LED3 on the board + BSP_LEDStateSet(BSP_LED_3, BSP_LED_STATE_ON); + + // Switch off LED4 on the board + BSP_LEDStateSet(BSP_LED_4, BSP_LED_STATE_OFF); + + // Toggle state of LED3 + BSP_LEDToggle(BSP_LED_3); + + + Remarks: + None +*/ + +void BSP_LEDToggle(BSP_LED_CHANNEL led_channel, BSP_LED_PORT led_port); + +// ***************************************************************************** +/* Function: + void BSP_LEDOn(BSP_LED led); + + Summary: + Switches ON the specified LED. + + Description: + This function switches ON the specified LED. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + led - The LED to switch on. + + Returns: + None. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Switch on LED D3 on the board + BSP_LEDOn(BSP_LED_3); + + + + Remarks: + None +*/ + +void BSP_LEDOn(BSP_LED_CHANNEL led_channel, BSP_LED_PORT led_port); + +// ***************************************************************************** +/* Function: + void BSP_LEDOff(BSP_LED led); + + Summary: + Switches OFF the specified LED. + + Description: + This function switches OFF the specified LED. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + led - The LED to switch off. + + Returns: + None. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Switch off LED D3 on the board + BSP_LEDOff(BSP_LED_3); + + + + Remarks: + None +*/ + +void BSP_LEDOff(BSP_LED_CHANNEL led_channel, BSP_LED_PORT led_port); + +// ***************************************************************************** +/* Function: + void BSP_LEDAllOff(); + + Summary: + Switches OFF all LEDs. + + Description: + This function switches OFF all LEDs. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + None. + + Returns: + None. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Switch off all LEDs + BSP_LEDAllOff(); + + + + Remarks: + None +*/ + +void BSP_LEDAllOff(); + +// ***************************************************************************** +/* Function: + BSP_SWITCH_STATE BSP_SwitchStateGet(BSP_SWITCH switch); + + Summary: + Returns the present state (pressed or not pressed) of the specified switch. + + Description: + This function returns the present state (pressed or not pressed) of the + specified switch. + + Precondition: + BSP_Initialize() should have been called. + + Parameters: + switch - The switch whose state needs to be obtained. + + Returns: + The pressed released state of the switch. + + Example: + + + // Initialize the BSP + BSP_Initialize(); + + // Check the state of the switch. + if(BSP_SWITCH_STATE_PRESSED == BSP_SwitchStateGet(BSP_SWITCH_3)) + { + // This means that Switch 3 on the board is pressed. + } + + + + Remarks: + None +*/ + +BSP_SWITCH_STATE BSP_SWITCH_StateGet(BSP_SWITCH_CHANNEL bspSwitchChannel, BSP_SWITCH_PORT bspSwitchPort); + +//DGC_FINISH Comment this function prototype +void BSP_LED_LightShow(BSP_LED_LIGHT_SHOW lightShow); +void BSP_LED_LightShowSet(BSP_LED_LIGHT_SHOW lightshow); +void BSP_SYS_Tasks (); +int32_t BSP_SWITCH_DeviceDebounce(BSP_SWITCH_DEBOUNCE_T *handle, uint32_t curVal); +BSP_SWITCH_STATE BSP_SWITCH_SwitchGetState(BSP_SWITCH_PORT switchId); +void BSP_SWITCH_Tasks(void); +void BSP_SWITCH_SwitchSetPreviousState(BSP_SWITCH_PORT switchId, BSP_SWITCH_STATE var); + +#endif //_BSP_CONFIG_H + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/bsp_sys_init.c b/software/aws-iot-ethernet/firmware/src/bsp_sys_init.c new file mode 100755 index 0000000..a621f7c --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/bsp_sys_init.c @@ -0,0 +1,572 @@ +/******************************************************************************* + Board Support Package Implementation. + + Company: + Microchip Technology Inc. + + File Name: + bsp_sys_init.c + + Summary: + Board Support Package Implementation for IoT Wi-Fi n AWS IoT board. + + Description: + This file contains the implementation of the Board Support Package for the + IoT Wi-Fi n AWS IoT board to help interface with the board. +*******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2012 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +// DOM-IGNORE-END + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include "bsp_config.h" +#include "app.h" + +#define BSP_SWITCH_MS_ELLAPSED_TIME_TO_HZ(x) (1250/(x)) // convert time to frequency + +BSP_DATA bspData; + +// ***************************************************************************** +// ***************************************************************************** +// ***************************************************************************** +// Section: Interface Routines +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: void BSP_Initialize(void) + + Summary: + Performs the neccassary actions to initialize a board + + Description: + This routine performs the neccassary actions to initialize a board + + Remarks: + Refer to bsp_config.h for usage information. + +*/ + +void BSP_Initialize(void ) +{ + /* Initialize the LED light show value and switch states*/ + bspData.light_show = BSP_LED_EASY_CONFIGURATION; + bspData.previousStateS1 = BSP_SWITCH_STATE_DEASSERTED; + bspData.previousStateS2 = BSP_SWITCH_STATE_DEASSERTED; + bspData.previousStateS3 = BSP_SWITCH_STATE_DEASSERTED; + bspData.previousStateS4 = BSP_SWITCH_STATE_DEASSERTED; + bspData.s1 = BSP_SWITCH_STATE_DEASSERTED; + bspData.s2 = BSP_SWITCH_STATE_DEASSERTED; + bspData.s3 = BSP_SWITCH_STATE_DEASSERTED; + bspData.s4 = BSP_SWITCH_STATE_DEASSERTED; + + /* Initialize switch state machine values for each switch object */ + int i; + for(i=0 ; i= 625) + { + ledTick = SYS_TMR_TickCountGet(); + BSP_LEDToggle(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOff(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + } + break; + + case BSP_LED_CONNECTING_TO_AP: + if(SYS_TMR_TickCountGet() - connectionTimeout >= (1250 * 10)) + { + connectionTimeout = SYS_TMR_TickCountGet(); + BSP_LED_LightShowSet(BSP_LED_CONNECTION_FAILED); + } + if (SYS_TMR_TickCountGet() - ledTick >= 150) + { + ledTick = SYS_TMR_TickCountGet(); + BSP_LEDOff(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + switch (count) + { + case (0): + BSP_LEDOn(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + count++; + break; + case (1): + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOn(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + count++; + break; + case (2): + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOn(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + count++; + break; + case (3): + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + count = 0; + break; + default: + count = 0; + break; + } + + } + break; + //Not implemented + case BSP_LED_CONNECTION_FAILED: + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOn(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + + if(SYS_TMR_TickCountGet() - connectionTimeout >= 4750) + { + connectionTimeout = SYS_TMR_TickCountGet(); + ledTick = SYS_TMR_TickCountGet(); + BSP_LED_LightShowSet(BSP_LED_CONNECTING_TO_AP); + } + break; + case BSP_LED_AP_CONNECTED: + if(SYS_TMR_TickCountGet() - ledTick >= 625) + { + count2++; + ledTick = SYS_TMR_TickCountGet(); + BSP_LEDStateSet(BSP_LED_5_CHANNEL, BSP_LED_5_PORT, BSP_LEDStateGet(BSP_LED_6_CHANNEL, BSP_LED_6_PORT)); + BSP_LEDToggle(BSP_LED_5_CHANNEL, BSP_LED_6_PORT); + BSP_LEDToggle(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + } + break; + + case BSP_LED_SERVER_CONNECT_FAILED: + BSP_LEDOn(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOff(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + break; + + case BSP_LED_ALL_GOOD: + BSP_LEDOff(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOff(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + ledTick = SYS_TMR_TickCountGet(); + // Idle state + break; + + case BSP_LED_TX: + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + if(SYS_TMR_TickCountGet() - ledTick >= 30) + BSP_LED_LightShowSet(BSP_LED_ALL_GOOD); + break; + + case BSP_LED_RX: + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + if(SYS_TMR_TickCountGet() - ledTick >= 30) + BSP_LED_LightShowSet(BSP_LED_ALL_GOOD); + break; + + case BSP_LED_DNS_FAILED: + BSP_LEDOn(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + break; + + case BSP_LED_TCPIP_STACK_INIT_FAILURE: + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOn(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + break; + + case BSP_LED_NVM_FAILED_MOUNT: + BSP_LEDOff(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOff(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOff(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + break; + + case BSP_LED_INTIAL_CONNECT: + BSP_LEDOn(BSP_LED_1_CHANNEL, BSP_LED_1_PORT); + BSP_LEDOn(BSP_LED_2_CHANNEL, BSP_LED_2_PORT); + BSP_LEDOn(BSP_LED_3_CHANNEL, BSP_LED_3_PORT); + BSP_LEDOn(BSP_LED_4_CHANNEL, BSP_LED_4_PORT); + BSP_LEDOn(BSP_LED_5_CHANNEL, BSP_LED_5_PORT); + BSP_LEDOn(BSP_LED_6_CHANNEL, BSP_LED_6_PORT); + + default: + break; + } +} + +BSP_SWITCH_STATE BSP_SWITCH_SwitchGetState(BSP_SWITCH_PORT switchId) +{ + switch(switchId) + { + case BSP_SWITCH_1_PORT: + return (BSP_SWITCH_STATE)bspData.s1; + break; + case BSP_SWITCH_2_PORT: + return (BSP_SWITCH_STATE)bspData.s2; + break; + case BSP_SWITCH_3_PORT: + return (BSP_SWITCH_STATE)bspData.s3; + break; + case BSP_SWITCH_4_PORT: + return (BSP_SWITCH_STATE)bspData.s4; + break; + default: + return BSP_SWITCH_STATE_DEASSERTED; + } +} + +void BSP_SWITCH_SwitchSetPreviousState(BSP_SWITCH_PORT switchId, BSP_SWITCH_STATE var) +{ + switch(switchId) + { + case BSP_SWITCH_1_PORT: + bspData.previousStateS1 = var; + break; + case BSP_SWITCH_2_PORT: + bspData.previousStateS2 = var; + break; + case BSP_SWITCH_3_PORT: + bspData.previousStateS3 = var; + break; + case BSP_SWITCH_4_PORT: + bspData.previousStateS4 = var; + break; + default: + ; + } +} + +int32_t BSP_SWITCH_DeviceDebounce(BSP_SWITCH_DEBOUNCE_T *handle, uint32_t curVal) +{ + if(handle->timerActive==false) + { + handle->timerActive = true; + handle->prevValue = curVal; + handle->startTick = SYS_TMR_TickCountGet(); + } + + if ((SYS_TMR_TickCountGet() - handle->startTick) >= (1250 + / BSP_SWITCH_MS_ELLAPSED_TIME_TO_HZ(handle->duration)) ) + { + handle->timerActive=false; + if(handle->prevValue == curVal) + return handle->prevValue; + else + return curVal; // Return the assert value + } + return BSP_SWITCH_BUSY; // Busy +} + +void BSP_SWITCH_Tasks(void) +{ + int32_t val; + val = BSP_SWITCH_DeviceDebounce(&bspData.switches[0], + BSP_SWITCH_StateGet( BSP_SWITCH_1_CHANNEL, BSP_SWITCH_1_PORT)); + if(val != BSP_SWITCH_BUSY) + { + bspData.s1 = val; + } + + val = BSP_SWITCH_DeviceDebounce(&bspData.switches[1], + BSP_SWITCH_StateGet( BSP_SWITCH_2_CHANNEL, BSP_SWITCH_2_PORT)); + if(val != BSP_SWITCH_BUSY) + { + bspData.s2 = val; + } + + val = BSP_SWITCH_DeviceDebounce(&bspData.switches[2], + BSP_SWITCH_StateGet( BSP_SWITCH_3_CHANNEL, BSP_SWITCH_3_PORT)); + if(val != BSP_SWITCH_BUSY) + { + bspData.s3 = val; + } + + val = BSP_SWITCH_DeviceDebounce(&bspData.switches[3], + BSP_SWITCH_StateGet( BSP_SWITCH_4_CHANNEL, BSP_SWITCH_4_PORT)); + if(val != BSP_SWITCH_BUSY) + { + bspData.s4 = val; + } +} + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/ca-certs.h b/software/aws-iot-ethernet/firmware/src/ca-certs.h new file mode 100644 index 0000000..7de62e2 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/ca-certs.h @@ -0,0 +1,360 @@ +/* certs.h */ + +#ifndef CERTS_H +#define CERTS_H + +#ifdef USE_CERT_BUFFERS_2048 + +/* ./clientKey.der, 2048-bit */ +static const unsigned char clientKey[] = +{ + 0x30, 0x82, 0x04, 0xA5, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xD8, 0x66, 0xA8, 0xB2, 0x19, 0xB8, 0xA3, 0xD7, + 0x91, 0x5F, 0x54, 0x99, 0xB3, 0x9A, 0xB4, 0xF6, 0x6E, 0xB5, + 0xAA, 0xFA, 0x2B, 0x46, 0xC4, 0x68, 0xBF, 0x7A, 0x6B, 0x45, + 0xD6, 0x6C, 0xAA, 0x32, 0x5E, 0x66, 0x6F, 0xA6, 0xA9, 0x0A, + 0x30, 0xBE, 0x89, 0x3B, 0x94, 0xED, 0xAB, 0x78, 0xF4, 0x42, + 0xB2, 0x4B, 0x92, 0x38, 0x30, 0x0D, 0xC1, 0x70, 0x83, 0x71, + 0x7B, 0xC4, 0xCC, 0xB3, 0x7B, 0xDE, 0x27, 0xDF, 0xD2, 0x0A, + 0x21, 0x3A, 0x7E, 0x82, 0x16, 0xE8, 0xBF, 0x2C, 0x77, 0xB6, + 0x30, 0xA3, 0xFD, 0xB5, 0x92, 0x94, 0x0C, 0x33, 0xA9, 0xFB, + 0x97, 0x30, 0x0F, 0xD0, 0x61, 0x98, 0x95, 0x29, 0xDB, 0x24, + 0x30, 0xEE, 0xFD, 0xBE, 0x77, 0x22, 0xD3, 0x69, 0x4C, 0xC5, + 0xFE, 0x3B, 0x27, 0xE6, 0xF6, 0xEB, 0x18, 0x34, 0x44, 0x49, + 0x95, 0x0D, 0x89, 0x26, 0x01, 0x95, 0x28, 0xB5, 0x81, 0xF9, + 0xD4, 0xDC, 0xD6, 0x49, 0x79, 0x1B, 0xF4, 0x9C, 0x03, 0xC4, + 0xFA, 0x0A, 0x71, 0x73, 0x4E, 0x75, 0xA9, 0xB3, 0xBB, 0x79, + 0x3D, 0x54, 0x82, 0xE8, 0x71, 0x37, 0xD2, 0x6C, 0x4F, 0xF9, + 0xED, 0x60, 0x6E, 0xFD, 0x6D, 0x34, 0x6E, 0xBF, 0xB0, 0x9E, + 0x6C, 0x4B, 0x21, 0x35, 0xB5, 0x0A, 0xB2, 0xD1, 0xC1, 0xAF, + 0x75, 0xC9, 0x63, 0xFB, 0x39, 0x24, 0x2C, 0xA9, 0x8B, 0x75, + 0xF3, 0xF3, 0x03, 0x2E, 0x73, 0x18, 0x51, 0x7D, 0x60, 0x6B, + 0xF7, 0x8F, 0xCF, 0x4F, 0x06, 0x68, 0x65, 0x4B, 0x0D, 0x38, + 0x2A, 0x20, 0xED, 0x95, 0x10, 0x3B, 0x37, 0xE0, 0xB7, 0x09, + 0xF0, 0x16, 0x63, 0x44, 0xD1, 0x88, 0x98, 0xF4, 0x1F, 0xF6, + 0xC3, 0x40, 0x8F, 0x02, 0x2C, 0x05, 0x6D, 0x6C, 0x5C, 0x95, + 0x53, 0x21, 0xBC, 0x12, 0x68, 0x12, 0x75, 0x88, 0x77, 0x25, + 0x1D, 0x5F, 0x74, 0xDE, 0x3C, 0x6C, 0x3A, 0xD9, 0x02, 0x03, + 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x21, 0xAB, 0x8F, + 0x71, 0xEE, 0xA8, 0x98, 0xED, 0x90, 0x93, 0xE9, 0xA0, 0xE4, + 0x9E, 0x1C, 0xAB, 0xFF, 0x3B, 0xCA, 0xF7, 0x93, 0xC6, 0x36, + 0x07, 0x2A, 0x4B, 0xCC, 0xE7, 0x17, 0xDE, 0xDE, 0x78, 0x69, + 0xD1, 0xBC, 0x6B, 0x8C, 0xFF, 0xA5, 0xE7, 0xEF, 0x88, 0x52, + 0xBA, 0xCC, 0x24, 0x4C, 0xB5, 0x17, 0xF2, 0xC4, 0x34, 0x73, + 0xDD, 0xA0, 0x0C, 0x76, 0x97, 0x30, 0xAF, 0xC5, 0x3D, 0xE3, + 0xF7, 0x03, 0xF3, 0x42, 0x46, 0x0B, 0x37, 0x83, 0xB9, 0x90, + 0x00, 0xF4, 0xC5, 0xE1, 0x76, 0x7A, 0x88, 0xF9, 0x8F, 0xC7, + 0xD7, 0xBB, 0x32, 0x4A, 0xAF, 0x77, 0xAD, 0xA5, 0xB8, 0x41, + 0x87, 0x31, 0x26, 0x4B, 0x0F, 0x8D, 0x81, 0x91, 0xFF, 0x91, + 0x9F, 0xDC, 0x8F, 0x14, 0xBF, 0xF5, 0xB7, 0x94, 0x94, 0xCE, + 0x34, 0x74, 0x16, 0xA5, 0xCD, 0x61, 0x20, 0xB3, 0x07, 0x33, + 0xD5, 0xD6, 0x78, 0xAF, 0x59, 0x3B, 0xAF, 0x71, 0x17, 0xDD, + 0xE4, 0x5D, 0x87, 0x02, 0xD3, 0x1A, 0x90, 0xFA, 0xD8, 0x45, + 0x63, 0x03, 0x25, 0xC5, 0x39, 0xEF, 0xA4, 0x54, 0xB0, 0x8C, + 0x22, 0x98, 0x3B, 0xA9, 0x3F, 0x70, 0x54, 0x40, 0x07, 0x94, + 0xD2, 0xFD, 0x7F, 0xB4, 0x43, 0xED, 0xEF, 0x95, 0xB6, 0x9C, + 0x69, 0xB3, 0x90, 0x76, 0x2C, 0xE7, 0x6A, 0x56, 0xA0, 0x13, + 0x9D, 0x34, 0x67, 0x61, 0xE8, 0x92, 0x26, 0xD6, 0x9E, 0x9B, + 0x6D, 0xFD, 0x01, 0xB3, 0x5D, 0xD2, 0x2B, 0x01, 0x8C, 0x94, + 0x9B, 0xB0, 0x03, 0x01, 0x21, 0xD4, 0xEE, 0xCF, 0x25, 0x63, + 0xE3, 0x01, 0x69, 0xE1, 0x99, 0x50, 0x2D, 0x4B, 0xBE, 0xDA, + 0xE6, 0xAC, 0x49, 0x4F, 0x54, 0x57, 0x4B, 0x4F, 0xE9, 0x93, + 0x81, 0x3E, 0x41, 0x2F, 0x63, 0x31, 0xAB, 0xD5, 0xCD, 0xBE, + 0xC2, 0xC0, 0x5C, 0x3D, 0x44, 0xD4, 0xAB, 0x57, 0x48, 0xD4, + 0xBE, 0xD9, 0x81, 0x02, 0x81, 0x81, 0x00, 0xF0, 0xA5, 0x91, + 0x1B, 0x1D, 0x26, 0x4B, 0x74, 0xAD, 0x36, 0x0B, 0x0A, 0xA4, + 0x19, 0x01, 0x1A, 0x70, 0xC8, 0x29, 0xC0, 0xB2, 0x6C, 0x17, + 0xD9, 0x6A, 0xFE, 0x07, 0xE7, 0xE9, 0xC8, 0xD9, 0x70, 0x05, + 0x4E, 0x71, 0x1D, 0x7D, 0x10, 0x96, 0x2D, 0x71, 0x91, 0xCF, + 0xCD, 0x29, 0x86, 0xB8, 0x87, 0x89, 0x3E, 0x84, 0x74, 0x0C, + 0xD6, 0x36, 0x79, 0x0C, 0x9E, 0xCC, 0x98, 0x75, 0x2B, 0x6B, + 0xC7, 0xF9, 0x25, 0xD2, 0x87, 0xC5, 0x92, 0xBA, 0x19, 0xFB, + 0xE2, 0x2F, 0x01, 0x42, 0x55, 0x94, 0xDD, 0x21, 0x28, 0x74, + 0x8C, 0x8E, 0x0F, 0x02, 0xDA, 0x4D, 0xB8, 0x58, 0xE6, 0x1E, + 0x4A, 0x93, 0xF4, 0x40, 0x99, 0xAF, 0xC0, 0x0D, 0x78, 0x77, + 0xCE, 0x4A, 0x44, 0xE4, 0x72, 0x3A, 0xB5, 0x73, 0x84, 0x06, + 0xD1, 0x67, 0xA1, 0xD7, 0xB7, 0xC9, 0xCB, 0x4B, 0xF9, 0x62, + 0x74, 0xB6, 0xCB, 0x3C, 0xB1, 0x02, 0x81, 0x81, 0x00, 0xE6, + 0x35, 0x17, 0x74, 0xD4, 0x9C, 0x46, 0x61, 0x25, 0xA6, 0x6C, + 0x25, 0xCD, 0x2B, 0xB3, 0x60, 0xAE, 0x91, 0xD5, 0x43, 0x07, + 0x05, 0xBB, 0xA6, 0x70, 0x84, 0xBF, 0x23, 0x54, 0x5D, 0x46, + 0x28, 0x63, 0x8F, 0xE1, 0xFD, 0xA1, 0x34, 0x24, 0x91, 0x69, + 0x19, 0x7B, 0x07, 0x3B, 0xB2, 0x92, 0xED, 0x42, 0xF9, 0xED, + 0x9C, 0x96, 0xAD, 0x0C, 0xFA, 0xCF, 0x30, 0x11, 0xCA, 0x23, + 0x2F, 0x4E, 0xC2, 0x55, 0xFB, 0x38, 0xBF, 0x51, 0x4D, 0x3D, + 0x23, 0x63, 0x03, 0x71, 0xE5, 0x19, 0x9A, 0x2E, 0xE6, 0xB8, + 0x50, 0xDD, 0xF3, 0xB8, 0x6A, 0x62, 0xBE, 0xAF, 0x55, 0x36, + 0x1D, 0x9E, 0x39, 0x36, 0xBC, 0xCF, 0x74, 0x2E, 0x58, 0x89, + 0x5A, 0x8C, 0xEC, 0xBF, 0x69, 0x93, 0x6F, 0x6F, 0x10, 0x6D, + 0x08, 0xBE, 0xE1, 0x3C, 0x47, 0x5D, 0x7E, 0xCA, 0xE5, 0xEE, + 0xD1, 0x66, 0x15, 0x91, 0x96, 0x4A, 0xA9, 0x02, 0x81, 0x81, + 0x00, 0x9E, 0x3E, 0xC1, 0xE4, 0xEA, 0x8E, 0x3C, 0x20, 0x45, + 0xA6, 0xBC, 0x2C, 0x0B, 0x2C, 0xC6, 0x24, 0xF4, 0xF5, 0x2B, + 0x3F, 0xA4, 0x14, 0xA0, 0xBA, 0x40, 0x39, 0x3C, 0x49, 0xAC, + 0xDA, 0x7E, 0xE1, 0xC3, 0x1B, 0x8A, 0x16, 0xB2, 0x1F, 0x2E, + 0x22, 0x44, 0x04, 0x76, 0x79, 0x9B, 0x4D, 0x14, 0x1B, 0x4C, + 0x8C, 0xE7, 0xDC, 0xC8, 0x74, 0x34, 0xED, 0xF4, 0xF6, 0x97, + 0xE3, 0xC9, 0x68, 0xFC, 0x3F, 0x4B, 0xFF, 0x2B, 0x2A, 0x4D, + 0x29, 0xE7, 0x67, 0x1E, 0xD3, 0xE5, 0xC5, 0x16, 0x31, 0xE0, + 0xEA, 0x68, 0xDB, 0x89, 0x88, 0xC4, 0x01, 0xEB, 0x06, 0x53, + 0x05, 0x5E, 0xB0, 0x34, 0x4B, 0x26, 0x6F, 0xFF, 0xEB, 0x10, + 0x3F, 0x62, 0x9C, 0x4D, 0x6C, 0x42, 0x3A, 0x7B, 0x5F, 0x02, + 0x6C, 0x3F, 0xC2, 0x1A, 0x19, 0xA9, 0xE4, 0x2B, 0x4E, 0x98, + 0x4C, 0x2F, 0x71, 0x96, 0xE4, 0xD9, 0x2F, 0x5C, 0x81, 0x02, + 0x81, 0x81, 0x00, 0xD7, 0xF5, 0xCC, 0x88, 0x7C, 0x80, 0x12, + 0x82, 0x46, 0x58, 0xC6, 0xB1, 0xFB, 0xB4, 0xD8, 0x75, 0x85, + 0xAF, 0x27, 0x9A, 0xD6, 0xB6, 0xA9, 0x20, 0x6E, 0x04, 0x0A, + 0x6F, 0xB1, 0x50, 0x43, 0x65, 0xD6, 0x68, 0xFF, 0x7F, 0xF9, + 0x3F, 0xBA, 0x62, 0x73, 0x6F, 0x44, 0xFC, 0x37, 0x23, 0xC2, + 0x34, 0x34, 0x95, 0xD4, 0x34, 0x07, 0x22, 0x56, 0xBF, 0xDF, + 0xA8, 0x5F, 0xB7, 0xFA, 0xA4, 0x01, 0xC5, 0xCB, 0xF5, 0x7E, + 0x79, 0xF4, 0x62, 0x7A, 0x4D, 0x7D, 0x30, 0x99, 0x23, 0x6C, + 0x8E, 0x39, 0x1B, 0x96, 0xA3, 0xBE, 0x64, 0x4A, 0x87, 0xFB, + 0x14, 0x99, 0xD5, 0x5D, 0x8C, 0x11, 0x87, 0xE8, 0xF2, 0xDD, + 0xC7, 0x47, 0x47, 0x25, 0xAB, 0xBD, 0xF2, 0xC7, 0x6A, 0xDA, + 0xB6, 0x3A, 0x41, 0xF5, 0x97, 0xB3, 0xC2, 0x06, 0xD3, 0x88, + 0x41, 0x4F, 0x44, 0xBF, 0x72, 0xCF, 0xCA, 0xC2, 0x26, 0x74, + 0xE9, 0x02, 0x81, 0x81, 0x00, 0xAD, 0xF0, 0xD6, 0x6D, 0x96, + 0xB2, 0x80, 0xF8, 0x9F, 0xBC, 0x32, 0xE7, 0x09, 0x91, 0x4A, + 0xD6, 0x76, 0x5C, 0x84, 0x14, 0xBB, 0x62, 0x2F, 0xE3, 0xF9, + 0x4C, 0x8A, 0x39, 0xB8, 0xCA, 0x08, 0xA6, 0x5D, 0xB7, 0xC9, + 0x82, 0x84, 0x49, 0x84, 0x78, 0x92, 0x71, 0x26, 0xC5, 0xBA, + 0x78, 0x66, 0x53, 0x6D, 0xCF, 0x3F, 0x77, 0xA8, 0x98, 0x52, + 0xD4, 0xE8, 0xD3, 0x69, 0xD8, 0xCB, 0xCC, 0x18, 0x00, 0xD3, + 0x55, 0x48, 0x08, 0x46, 0xCF, 0x59, 0x04, 0xC5, 0x09, 0x8D, + 0xAC, 0xB9, 0x53, 0x75, 0x8D, 0xF5, 0xC1, 0xA7, 0x0C, 0x5D, + 0xA6, 0x9F, 0xAA, 0xE4, 0xC2, 0x56, 0xCF, 0x18, 0x25, 0x91, + 0xD0, 0xAF, 0x31, 0xC1, 0x5A, 0xDB, 0x2B, 0x1F, 0x0E, 0x7E, + 0x33, 0xBD, 0xE0, 0xE4, 0x1C, 0x55, 0x24, 0x89, 0x4A, 0x77, + 0x78, 0xC8, 0x74, 0x67, 0xB8, 0x38, 0xD9, 0x64, 0x31, 0xB2, + 0x90, 0x97, 0x41 +}; +static const int sizeof_clientKey = sizeof(clientKey); + +/* ./clientCert.der, 2048-bit */ +static const unsigned char clientCert[] = +{ + 0x30, 0x82, 0x03, 0x59, 0x30, 0x82, 0x02, 0x41, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x05, 0x52, 0xB5, 0x4A, 0x88, + 0xE5, 0x98, 0x3A, 0x4D, 0x7C, 0x91, 0xE3, 0x4A, 0xD8, 0xD2, + 0x31, 0x78, 0x36, 0x93, 0x48, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x30, 0x4D, 0x31, 0x4B, 0x30, 0x49, 0x06, 0x03, 0x55, 0x04, + 0x0B, 0x0C, 0x42, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, + 0x57, 0x65, 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x20, 0x4F, 0x3D, 0x41, 0x6D, 0x61, 0x7A, 0x6F, + 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x49, 0x6E, 0x63, 0x2E, + 0x20, 0x4C, 0x3D, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, + 0x20, 0x53, 0x54, 0x3D, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, + 0x67, 0x74, 0x6F, 0x6E, 0x20, 0x43, 0x3D, 0x55, 0x53, 0x30, + 0x1E, 0x17, 0x0D, 0x31, 0x35, 0x30, 0x39, 0x31, 0x35, 0x31, + 0x35, 0x32, 0x36, 0x34, 0x31, 0x5A, 0x17, 0x0D, 0x34, 0x39, + 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, + 0x5A, 0x30, 0x1E, 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0C, 0x13, 0x41, 0x57, 0x53, 0x20, 0x49, 0x6F, + 0x54, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, + 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, + 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD8, 0x66, 0xA8, 0xB2, + 0x19, 0xB8, 0xA3, 0xD7, 0x91, 0x5F, 0x54, 0x99, 0xB3, 0x9A, + 0xB4, 0xF6, 0x6E, 0xB5, 0xAA, 0xFA, 0x2B, 0x46, 0xC4, 0x68, + 0xBF, 0x7A, 0x6B, 0x45, 0xD6, 0x6C, 0xAA, 0x32, 0x5E, 0x66, + 0x6F, 0xA6, 0xA9, 0x0A, 0x30, 0xBE, 0x89, 0x3B, 0x94, 0xED, + 0xAB, 0x78, 0xF4, 0x42, 0xB2, 0x4B, 0x92, 0x38, 0x30, 0x0D, + 0xC1, 0x70, 0x83, 0x71, 0x7B, 0xC4, 0xCC, 0xB3, 0x7B, 0xDE, + 0x27, 0xDF, 0xD2, 0x0A, 0x21, 0x3A, 0x7E, 0x82, 0x16, 0xE8, + 0xBF, 0x2C, 0x77, 0xB6, 0x30, 0xA3, 0xFD, 0xB5, 0x92, 0x94, + 0x0C, 0x33, 0xA9, 0xFB, 0x97, 0x30, 0x0F, 0xD0, 0x61, 0x98, + 0x95, 0x29, 0xDB, 0x24, 0x30, 0xEE, 0xFD, 0xBE, 0x77, 0x22, + 0xD3, 0x69, 0x4C, 0xC5, 0xFE, 0x3B, 0x27, 0xE6, 0xF6, 0xEB, + 0x18, 0x34, 0x44, 0x49, 0x95, 0x0D, 0x89, 0x26, 0x01, 0x95, + 0x28, 0xB5, 0x81, 0xF9, 0xD4, 0xDC, 0xD6, 0x49, 0x79, 0x1B, + 0xF4, 0x9C, 0x03, 0xC4, 0xFA, 0x0A, 0x71, 0x73, 0x4E, 0x75, + 0xA9, 0xB3, 0xBB, 0x79, 0x3D, 0x54, 0x82, 0xE8, 0x71, 0x37, + 0xD2, 0x6C, 0x4F, 0xF9, 0xED, 0x60, 0x6E, 0xFD, 0x6D, 0x34, + 0x6E, 0xBF, 0xB0, 0x9E, 0x6C, 0x4B, 0x21, 0x35, 0xB5, 0x0A, + 0xB2, 0xD1, 0xC1, 0xAF, 0x75, 0xC9, 0x63, 0xFB, 0x39, 0x24, + 0x2C, 0xA9, 0x8B, 0x75, 0xF3, 0xF3, 0x03, 0x2E, 0x73, 0x18, + 0x51, 0x7D, 0x60, 0x6B, 0xF7, 0x8F, 0xCF, 0x4F, 0x06, 0x68, + 0x65, 0x4B, 0x0D, 0x38, 0x2A, 0x20, 0xED, 0x95, 0x10, 0x3B, + 0x37, 0xE0, 0xB7, 0x09, 0xF0, 0x16, 0x63, 0x44, 0xD1, 0x88, + 0x98, 0xF4, 0x1F, 0xF6, 0xC3, 0x40, 0x8F, 0x02, 0x2C, 0x05, + 0x6D, 0x6C, 0x5C, 0x95, 0x53, 0x21, 0xBC, 0x12, 0x68, 0x12, + 0x75, 0x88, 0x77, 0x25, 0x1D, 0x5F, 0x74, 0xDE, 0x3C, 0x6C, + 0x3A, 0xD9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x60, 0x30, + 0x5E, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0xCB, 0xF4, 0x7E, 0x1A, 0xFF, 0x96, + 0x63, 0xEC, 0xD5, 0xA2, 0x9B, 0xE4, 0x34, 0xB7, 0x42, 0xA4, + 0xF4, 0xF4, 0xF7, 0x12, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, + 0x0E, 0x04, 0x16, 0x04, 0x14, 0x27, 0xB5, 0x1E, 0x63, 0x9A, + 0x33, 0xC2, 0xEE, 0x75, 0x02, 0x52, 0x8E, 0xFA, 0x30, 0xDF, + 0xA8, 0xB8, 0xB6, 0xAA, 0x1A, 0x30, 0x0C, 0x06, 0x03, 0x55, + 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, + 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, + 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0xB6, 0x73, 0x48, 0xD8, 0xB3, + 0xDD, 0xD6, 0x27, 0x9F, 0xB8, 0x24, 0xDE, 0x13, 0xD2, 0x80, + 0xC6, 0x2A, 0x7F, 0xBF, 0x14, 0x3D, 0x63, 0x7C, 0x15, 0x69, + 0x36, 0x9C, 0x27, 0x97, 0x96, 0x1C, 0x3D, 0x23, 0xA4, 0x8A, + 0xE8, 0x2C, 0xDD, 0x61, 0x99, 0x84, 0x63, 0x14, 0x36, 0xD1, + 0x72, 0x88, 0x2D, 0x9A, 0x3E, 0x20, 0x92, 0x7E, 0xB0, 0x7C, + 0x73, 0xF6, 0xF0, 0x83, 0xA3, 0xEB, 0x3E, 0xA0, 0xE5, 0x78, + 0xEF, 0x60, 0x44, 0x98, 0xC4, 0x81, 0x99, 0x63, 0x42, 0x93, + 0x4E, 0xBA, 0xE8, 0xDA, 0xB6, 0x24, 0xF7, 0x64, 0xAA, 0x34, + 0x47, 0xF9, 0x78, 0x3D, 0xD9, 0x71, 0x33, 0xC0, 0xE8, 0xC0, + 0xA5, 0xC8, 0xDE, 0xB7, 0x49, 0xF1, 0xF4, 0x91, 0x7E, 0xE2, + 0x2C, 0xBD, 0x7E, 0xBD, 0x50, 0x07, 0x2F, 0x76, 0xD7, 0x7A, + 0x48, 0x07, 0xA1, 0xE8, 0x00, 0xEF, 0x39, 0x35, 0x35, 0x32, + 0xAC, 0xDA, 0xCF, 0x06, 0xB2, 0x90, 0x33, 0x70, 0x32, 0x85, + 0x9F, 0xB0, 0x5F, 0xE0, 0x23, 0x09, 0xE2, 0xB8, 0xD4, 0x0A, + 0x64, 0x6A, 0xFB, 0xF7, 0xA0, 0xE2, 0x91, 0xE2, 0x5E, 0xD7, + 0x74, 0x71, 0x24, 0xF3, 0x69, 0x9B, 0x4F, 0x73, 0xF5, 0xDD, + 0x96, 0xDF, 0x45, 0xD8, 0x50, 0xAF, 0x02, 0xAA, 0x96, 0xC7, + 0x5F, 0xC8, 0x65, 0x38, 0x0B, 0x0D, 0x85, 0x2B, 0x65, 0x3A, + 0x20, 0x30, 0x2C, 0x7A, 0xFC, 0xB7, 0x94, 0x8E, 0xD6, 0x8A, + 0x08, 0x50, 0x10, 0x8B, 0x72, 0x79, 0x33, 0x5D, 0x33, 0xD7, + 0xB2, 0x23, 0xA2, 0xD3, 0x63, 0x68, 0x73, 0x21, 0x68, 0x91, + 0xC9, 0x5B, 0x46, 0x26, 0xBA, 0x9D, 0xEB, 0xD3, 0x2C, 0xCB, + 0x20, 0xCD, 0x49, 0x27, 0xC7, 0x0A, 0xEF, 0xB1, 0xAD, 0x39, + 0xF1, 0xB9, 0x32, 0x36, 0x66, 0x83, 0x2F, 0x11, 0xC9, 0xFA, + 0x72, 0x38, 0x30, 0xC7, 0x71, 0x42, 0x63, 0x4E, 0x6F, 0x3F, + 0x6E +}; +static const int sizeof_clientCert = sizeof(clientCert); + +/* ./rootCA.der, 2048-bit */ +static const unsigned char caCert[] = +{ + 0x30, 0x82, 0x04, 0xD3, 0x30, 0x82, 0x03, 0xBB, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x10, 0x18, 0xDA, 0xD1, 0x9E, 0x26, + 0x7D, 0xE8, 0xBB, 0x4A, 0x21, 0x58, 0xCD, 0xCC, 0x6B, 0x3B, + 0x4A, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, + 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xCA, 0x31, + 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, + 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, + 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56, 0x65, + 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, + 0x31, 0x3A, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, + 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, + 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, + 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x2D, 0x20, 0x46, 0x6F, 0x72, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, + 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6F, 0x6E, 0x6C, 0x79, + 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x3C, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, + 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, + 0x62, 0x6C, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x61, + 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, + 0x35, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x36, 0x31, 0x31, 0x30, + 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, + 0x33, 0x36, 0x30, 0x37, 0x31, 0x36, 0x32, 0x33, 0x35, 0x39, + 0x35, 0x39, 0x5A, 0x30, 0x81, 0xCA, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, + 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, + 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, + 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, + 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x31, 0x3A, 0x30, + 0x38, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x31, 0x28, 0x63, + 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x56, 0x65, 0x72, + 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, + 0x2E, 0x20, 0x2D, 0x20, 0x46, 0x6F, 0x72, 0x20, 0x61, 0x75, + 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x31, 0x45, 0x30, + 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3C, 0x56, 0x65, + 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x6C, 0x61, + 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, + 0x63, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x61, 0x72, 0x79, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x35, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, + 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xAF, 0x24, 0x08, 0x08, 0x29, 0x7A, 0x35, 0x9E, 0x60, + 0x0C, 0xAA, 0xE7, 0x4B, 0x3B, 0x4E, 0xDC, 0x7C, 0xBC, 0x3C, + 0x45, 0x1C, 0xBB, 0x2B, 0xE0, 0xFE, 0x29, 0x02, 0xF9, 0x57, + 0x08, 0xA3, 0x64, 0x85, 0x15, 0x27, 0xF5, 0xF1, 0xAD, 0xC8, + 0x31, 0x89, 0x5D, 0x22, 0xE8, 0x2A, 0xAA, 0xA6, 0x42, 0xB3, + 0x8F, 0xF8, 0xB9, 0x55, 0xB7, 0xB1, 0xB7, 0x4B, 0xB3, 0xFE, + 0x8F, 0x7E, 0x07, 0x57, 0xEC, 0xEF, 0x43, 0xDB, 0x66, 0x62, + 0x15, 0x61, 0xCF, 0x60, 0x0D, 0xA4, 0xD8, 0xDE, 0xF8, 0xE0, + 0xC3, 0x62, 0x08, 0x3D, 0x54, 0x13, 0xEB, 0x49, 0xCA, 0x59, + 0x54, 0x85, 0x26, 0xE5, 0x2B, 0x8F, 0x1B, 0x9F, 0xEB, 0xF5, + 0xA1, 0x91, 0xC2, 0x33, 0x49, 0xD8, 0x43, 0x63, 0x6A, 0x52, + 0x4B, 0xD2, 0x8F, 0xE8, 0x70, 0x51, 0x4D, 0xD1, 0x89, 0x69, + 0x7B, 0xC7, 0x70, 0xF6, 0xB3, 0xDC, 0x12, 0x74, 0xDB, 0x7B, + 0x5D, 0x4B, 0x56, 0xD3, 0x96, 0xBF, 0x15, 0x77, 0xA1, 0xB0, + 0xF4, 0xA2, 0x25, 0xF2, 0xAF, 0x1C, 0x92, 0x67, 0x18, 0xE5, + 0xF4, 0x06, 0x04, 0xEF, 0x90, 0xB9, 0xE4, 0x00, 0xE4, 0xDD, + 0x3A, 0xB5, 0x19, 0xFF, 0x02, 0xBA, 0xF4, 0x3C, 0xEE, 0xE0, + 0x8B, 0xEB, 0x37, 0x8B, 0xEC, 0xF4, 0xD7, 0xAC, 0xF2, 0xF6, + 0xF0, 0x3D, 0xAF, 0xDD, 0x75, 0x91, 0x33, 0x19, 0x1D, 0x1C, + 0x40, 0xCB, 0x74, 0x24, 0x19, 0x21, 0x93, 0xD9, 0x14, 0xFE, + 0xAC, 0x2A, 0x52, 0xC7, 0x8F, 0xD5, 0x04, 0x49, 0xE4, 0x8D, + 0x63, 0x47, 0x88, 0x3C, 0x69, 0x83, 0xCB, 0xFE, 0x47, 0xBD, + 0x2B, 0x7E, 0x4F, 0xC5, 0x95, 0xAE, 0x0E, 0x9D, 0xD4, 0xD1, + 0x43, 0xC0, 0x67, 0x73, 0xE3, 0x14, 0x08, 0x7E, 0xE5, 0x3F, + 0x9F, 0x73, 0xB8, 0x33, 0x0A, 0xCF, 0x5D, 0x3F, 0x34, 0x87, + 0x96, 0x8A, 0xEE, 0x53, 0xE8, 0x25, 0x15, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xA3, 0x81, 0xB2, 0x30, 0x81, 0xAF, 0x30, 0x0F, + 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, + 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x6D, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x01, 0x0C, 0x04, 0x61, 0x30, 0x5F, 0xA1, 0x5D, 0xA0, + 0x5B, 0x30, 0x59, 0x30, 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, + 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, 0x30, 0x21, + 0x30, 0x1F, 0x30, 0x07, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, + 0x1A, 0x04, 0x14, 0x8F, 0xE5, 0xD3, 0x1A, 0x86, 0xAC, 0x8D, + 0x8E, 0x6B, 0xC3, 0xCF, 0x80, 0x6A, 0xD4, 0x48, 0x18, 0x2C, + 0x7B, 0x19, 0x2E, 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x76, + 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x76, 0x73, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x67, + 0x69, 0x66, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, + 0x16, 0x04, 0x14, 0x7F, 0xD3, 0x65, 0xA7, 0xC2, 0xDD, 0xEC, + 0xBB, 0xF0, 0x30, 0x09, 0xF3, 0x43, 0x39, 0xFA, 0x02, 0xAF, + 0x33, 0x31, 0x33, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x93, 0x24, 0x4A, 0x30, 0x5F, 0x62, 0xCF, + 0xD8, 0x1A, 0x98, 0x2F, 0x3D, 0xEA, 0xDC, 0x99, 0x2D, 0xBD, + 0x77, 0xF6, 0xA5, 0x79, 0x22, 0x38, 0xEC, 0xC4, 0xA7, 0xA0, + 0x78, 0x12, 0xAD, 0x62, 0x0E, 0x45, 0x70, 0x64, 0xC5, 0xE7, + 0x97, 0x66, 0x2D, 0x98, 0x09, 0x7E, 0x5F, 0xAF, 0xD6, 0xCC, + 0x28, 0x65, 0xF2, 0x01, 0xAA, 0x08, 0x1A, 0x47, 0xDE, 0xF9, + 0xF9, 0x7C, 0x92, 0x5A, 0x08, 0x69, 0x20, 0x0D, 0xD9, 0x3E, + 0x6D, 0x6E, 0x3C, 0x0D, 0x6E, 0xD8, 0xE6, 0x06, 0x91, 0x40, + 0x18, 0xB9, 0xF8, 0xC1, 0xED, 0xDF, 0xDB, 0x41, 0xAA, 0xE0, + 0x96, 0x20, 0xC9, 0xCD, 0x64, 0x15, 0x38, 0x81, 0xC9, 0x94, + 0xEE, 0xA2, 0x84, 0x29, 0x0B, 0x13, 0x6F, 0x8E, 0xDB, 0x0C, + 0xDD, 0x25, 0x02, 0xDB, 0xA4, 0x8B, 0x19, 0x44, 0xD2, 0x41, + 0x7A, 0x05, 0x69, 0x4A, 0x58, 0x4F, 0x60, 0xCA, 0x7E, 0x82, + 0x6A, 0x0B, 0x02, 0xAA, 0x25, 0x17, 0x39, 0xB5, 0xDB, 0x7F, + 0xE7, 0x84, 0x65, 0x2A, 0x95, 0x8A, 0xBD, 0x86, 0xDE, 0x5E, + 0x81, 0x16, 0x83, 0x2D, 0x10, 0xCC, 0xDE, 0xFD, 0xA8, 0x82, + 0x2A, 0x6D, 0x28, 0x1F, 0x0D, 0x0B, 0xC4, 0xE5, 0xE7, 0x1A, + 0x26, 0x19, 0xE1, 0xF4, 0x11, 0x6F, 0x10, 0xB5, 0x95, 0xFC, + 0xE7, 0x42, 0x05, 0x32, 0xDB, 0xCE, 0x9D, 0x51, 0x5E, 0x28, + 0xB6, 0x9E, 0x85, 0xD3, 0x5B, 0xEF, 0xA5, 0x7D, 0x45, 0x40, + 0x72, 0x8E, 0xB7, 0x0E, 0x6B, 0x0E, 0x06, 0xFB, 0x33, 0x35, + 0x48, 0x71, 0xB8, 0x9D, 0x27, 0x8B, 0xC4, 0x65, 0x5F, 0x0D, + 0x86, 0x76, 0x9C, 0x44, 0x7A, 0xF6, 0x95, 0x5C, 0xF6, 0x5D, + 0x32, 0x08, 0x33, 0xA4, 0x54, 0xB6, 0x18, 0x3F, 0x68, 0x5C, + 0xF2, 0x42, 0x4A, 0x85, 0x38, 0x54, 0x83, 0x5F, 0xD1, 0xE8, + 0x2C, 0xF2, 0xAC, 0x11, 0xD6, 0xA8, 0xED, 0x63, 0x6A +}; +static const int sizeof_caCert = sizeof(caCert); + +#endif /* USE_CERT_BUFFERS_2048 */ + +#endif /* CERTS_H */ + diff --git a/software/aws-iot-ethernet/firmware/src/configuration_http.c b/software/aws-iot-ethernet/firmware/src/configuration_http.c new file mode 100644 index 0000000..60d917f --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_http.c @@ -0,0 +1,289 @@ +/******************************************************************************* + Application to Demo HTTP Server + + Summary: + Support for HTTP module in Microchip TCP/IP Stack + + Description: + -Implements the application + -Reference: RFC 1002 +*******************************************************************************/ + +/******************************************************************************* +File Name: configuration_http.c +Copyright (C) 2012 released Microchip Technology Inc. All rights +reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ + +#define __CUSTOMHTTPAPP_C + +#include "system_config.h" + +#if defined(TCPIP_STACK_USE_HTTP_SERVER) + +#include "tcpip/tcpip.h" +#include "system/tmr/sys_tmr.h" +#include "system/random/sys_random.h" +#include "tcpip/src/common/helpers.h" +#include "tcpip/src/tcpip_private.h" + +#include "app.h" +#include "app_nvm_support.h" + + +/**************************************************************************** + Section: + Definitions + ***************************************************************************/ +extern APP_DATA appData; + +/**************************************************************************** + Section: + Function Prototypes and Memory Globalizers + ***************************************************************************/ +static HTTP_IO_RESULT HTTPPostConfig(HTTP_CONN_HANDLE connHandle); + +// Sticky status message variable. +// This is used to indicated whether or not the previous POST operation was +// successful. The application uses these to store status messages when a +// POST operation redirects. This lets the application provide status messages +// after a redirect, when connection instance data has already been lost. +//static bool lastSuccess = false; + +// Stick status message variable. See lastSuccess for details. +static bool lastFailure = false; + +/**************************************************************************** + Section: + GET Form Handlers + ***************************************************************************/ + +/***************************************************************************** + Function: + HTTP_IO_RESULT TCPIP_HTTP_GetExecute(HTTP_CONN_HANDLE connHandle) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ***************************************************************************/ +HTTP_IO_RESULT TCPIP_HTTP_GetExecute(HTTP_CONN_HANDLE connHandle) +{ + uint8_t filename[20]; + //uint8_t* httpDataBuff; + + // Load the file name + // Make sure uint8_t filename[] above is large enough for your longest name + SYS_FS_FileNameGet(TCPIP_HTTP_CurrentConnectionFileGet(connHandle), filename, 20); + +TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + + // Example of how to process a GET request call + // If its the forms.htm page +// if(!memcmp(filename, "forms.htm", 9)) +// { +// +// } + return HTTP_IO_DONE; +} + +/**************************************************************************** + Section: + POST Form Handlers + ***************************************************************************/ +#if defined(TCPIP_HTTP_USE_POST) + +/***************************************************************************** + Function: + HTTP_IO_RESULT TCPIP_HTTP_PostExecute(HTTP_CONN_HANDLE connHandle) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ***************************************************************************/ +HTTP_IO_RESULT TCPIP_HTTP_PostExecute(HTTP_CONN_HANDLE connHandle) +{ + // Resolve which function to use and pass along + uint8_t filename[20]; + + // Load the file name + // Make sure uint8_t filename[] above is large enough for your longest name + SYS_FS_FileNameGet(TCPIP_HTTP_CurrentConnectionFileGet(connHandle), filename, sizeof(filename)); + + if(!memcmp(filename, "index.htm", 9)) + return HTTPPostConfig(connHandle) /*HTTPPostConfig()*/; + + + return HTTP_IO_DONE; +} + + +/***************************************************************************** + Function: + static HTTP_IO_RESULT HTTPPostConfig(HTTP_CONN_HANDLE connHandle) + + Summary: + Processes the configuration form on index.htm + + Description: + Accepts configuration parameters from the form, saves them to a + temporary location in RAM, then eventually saves the data to EEPROM or + external Flash. + + When complete, this function redirects to reconnect.htm, which will + display information on the board connecting to the amazon server. + + If an error occurs, error.htm will be seen. + + Precondition: + None + + Parameters: + connHandle - HTTP connection handle + + Return Values: + HTTP_IO_DONE - all parameters have been processed + HTTP_IO_NEED_DATA - data needed by this function has not yet arrived + ***************************************************************************/ + +static HTTP_IO_RESULT HTTPPostConfig(HTTP_CONN_HANDLE connHandle) +{ + uint8_t i; + + uint8_t* httpDataBuff = 0; + bool bConfigFailure = false; + uint32_t byteCount; + TCP_SOCKET sktHTTP; + + byteCount = TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle); + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + if(byteCount > TCPIP_TCP_GetIsReady(sktHTTP) + TCPIP_TCP_FifoRxFreeGet(sktHTTP)) + { // Configuration Failure + lastFailure = true; + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + return HTTP_IO_DONE; + } + + // Ensure that all data is waiting to be parsed. If not, keep waiting for + // all of it to arrive. + if(TCPIP_TCP_GetIsReady(sktHTTP) < byteCount) + return HTTP_IO_NEED_DATA; + + // Use current config in non-volatile memory as defaults + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + + // Read all browser POST data + while(TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle)) + { + // Read a form field name + if(TCPIP_HTTP_PostNameRead(connHandle, httpDataBuff, 6) != HTTP_READ_OK) + { + bConfigFailure = true; + break; + } + + // Read a form field value + if(TCPIP_HTTP_PostValueRead(connHandle, httpDataBuff + 6, TCPIP_HTTP_MAX_DATA_LEN-6-2) != HTTP_READ_OK) + { + bConfigFailure = true; + break; + } + + // Parse the value that was read + if(!strcmp((char*)httpDataBuff, (const char*)"rs")) + { + memcpy((uint8_t *)appData.host, (void*)(httpDataBuff+6), strlen((char*)(httpDataBuff+6))); + appData.host[strlen((char*)(httpDataBuff+6))] = 0; /* Terminate string */ + } + else if(!strcmp((char*)httpDataBuff, (const char*)"cc")) + { + memcpy((uint8_t *)appData.clientCert, (void*)(httpDataBuff+6), strlen((char*)(httpDataBuff+6))); + appData.clientCert[strlen((char*)(httpDataBuff+6))] = 0; /* Terminate string */ + } + else if(!strcmp((char*)httpDataBuff, (const char*)"ck")) + { + memcpy((uint8_t *)appData.clientKey, (void*)(httpDataBuff+6), strlen((char*)(httpDataBuff+6))); + appData.clientKey[strlen((char*)(httpDataBuff+6))] = 0; /* Terminate string */ + } + + } + + if(bConfigFailure == false) + { + // All parsing complete! Save new settings and force an interface restart + // Set the interface to restart and display reconnecting information + strcpy((char*)httpDataBuff, "reconnect.htm?"); + httpDataBuff[20+16] = 0x00; // Force null termination + for(i = 20; i < 20u+16u; i++) + { + if(httpDataBuff[i] == ' ') + httpDataBuff[i] = 0x00; + } + + } + else + { // Configuration error + + lastFailure = true; + if(httpDataBuff) + { + strcpy((char*)httpDataBuff, "error.htm"); + } + } + + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + + return HTTP_IO_DONE; +} + +#endif + + +/**************************************************************************** + Section: + Dynamic Variable Callback Functions + ***************************************************************************/ +/**************************************************************************** + Section: + Dynamic Variable Callback Functions + ***************************************************************************/ + +/***************************************************************************** + Function: + void TCPIP_HTTP_Print_varname(void) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ***************************************************************************/ +void TCPIP_HTTP_Print_remoteServer(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP; + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t*)appData.host); +} + +void TCPIP_HTTP_Print_uuid(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP; + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t*)appData.uuid); //nextSSID +} + + +#endif diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/DynRcrd.bin b/software/aws-iot-ethernet/firmware/src/configuration_webpage/DynRcrd.bin new file mode 100644 index 0000000000000000000000000000000000000000..378292077d37a68b5a99f98c781bc17d9b1d11ad GIT binary patch literal 60 ocmWe*U|?VZVhG@1VPIecGSz?>Au0(J0`VMxG&7J+1JWQ>02mJe761SM literal 0 HcmV?d00001 diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/FileRcrd.bin b/software/aws-iot-ethernet/firmware/src/configuration_webpage/FileRcrd.bin new file mode 100644 index 0000000000000000000000000000000000000000..88bf41c97e1676f4035d5f9c1e43fe3191e5a474 GIT binary patch literal 24 ZcmZQ#U|{GH5Cf7dK+LrmNH8z~F#r@R0cHRI literal 0 HcmV?d00001 diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp-min.css b/software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp-min.css new file mode 100644 index 0000000..8a94785 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp-min.css @@ -0,0 +1 @@ +body{font-family:Verdana,Arial,sans-serif;margin:0 auto;padding:0 0 20px;width:700px}#page{background:#fff;padding:20px;font-size:12pt}#page td{font-size:10pt}#title{padding:4px;font-weight:700;color:#000;margin-bottom:15px;height:16px}#title .left{float:left;text-align:left}#footer{height:16px;padding-top:3px;padding-left:5px;padding-right:5px;color:#888;font-size:.75em}#menu{float:left;width:150px;padding-right:20px}#content{width:660px}#content a{color:#c00;text-decoration:none}#content a:hover{color:#d33;text-decoration:underline}#content h1{margin-top:0}fieldset{margin:10px 40px;padding:8px;border:1px dotted #333;background:#ddd}fieldset div{padding:2px 0 2px 150px}fieldset div label{margin-left:-140px;padding-top:2px;width:135px;font-weight:700;position:absolute}fieldset input{width:250px}fieldset input.sm{width:auto}fieldset textarea{width:250px}.rounded_container{display:block;position:relative;border-width:2px;border-style:solid;border-color:#000;border-radius:15px;margin:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;font-size:12pt;-webkit-transition:height .5s;padding:10px 10px 5px}#column_wrap{float:left;width:100%}#column1{padding:10px;margin-left:30px;float:left}#column2{padding:10px;float:right;width:45%}.join_button{text-indent:0;font-family:Arial;font-style:normal;text-align:center;margin-left:280px;margin-bottom:5px}.join_button:active{position:relative;top:1px}.ssid1{width:213px}.sec1{width:222px} \ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp.css b/software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp.css new file mode 100644 index 0000000..26071ae --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/css/mchp.css @@ -0,0 +1,149 @@ +body { + font-family: Verdana, Arial, sans-serif; + margin: 0px auto; + padding: 0 0 20px 0; + width: 700px; +} + +#page { + background: #fff; + padding: 20px; + font-size: 12pt; +} + +#page td { + font-size: 10pt; +} + +#title { + padding: 4px; + font-weight: bold; + color: #000; + margin-bottom: 15px; + height: 16px; +} + +#title .left { + float: left; + text-align: left; +} + +#footer{ + height: 16px; /* Total hight is 20 less border and padding*/ + padding-top: 3px; + padding-left: 5px; + padding-right: 5px; + color: #888888; + font-size: 0.750em; +} +#menu { + float: left; + width: 150px; + padding-right: 20px; +} + +#content { + width: 660px; +} + +#content a { + color: #c00; + text-decoration: none; +} + +#content a:hover { + color: #d33; + text-decoration: underline; +} + +#content h1 { + margin-top: 0px; +} + +fieldset { + margin:10px 40px 10px 40px; + padding: 8px; + border: 1px dotted #333; + background:#ddd; +} + +fieldset div { + padding: 2px 0px 2px 150px; +} + +fieldset div label { + margin-left: -140px; + padding-top: 2px; + width: 135px; + font-weight: bold; + position: absolute; +} + +fieldset input { + width: 250px; +} + +fieldset input.sm { + width: auto; +} + +fieldset textarea { + width: 250px; +} + +.rounded_container{ + /*height: 180px;*/ + display: block; + position: relative; + border-width: 2px; + border-style: solid; + border-color: #000; + border-radius: 15px; + margin: 2px; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + padding-bottom: 5px; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + font-size: 12pt; + -webkit-transition: height .5s; +} + +#column_wrap{ + float: left; + width: 100%; +} +#column1{ + padding: 10px; + margin-left: 30px; + float: left; +} +#column2{ + padding: 10px; + float: right; + width: 45%; +} + +.join_button { + text-indent:0; + font-family:Arial; + font-style:normal; + text-align:center; + margin-left: 280px; + margin-bottom: 5px; +} + +.join_button:active { + position:relative; + top:1px; +} + +.ssid1 { + width: 213px; +} + +.sec1 { + width: 222px; +} \ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/error.htm b/software/aws-iot-ethernet/firmware/src/configuration_webpage/error.htm new file mode 100644 index 0000000..2c11f41 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/error.htm @@ -0,0 +1,12 @@ + + + + + Configuration Error + + +

+ Future home of Mchp error notification. +

+ + \ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/footer.inc b/software/aws-iot-ethernet/firmware/src/configuration_webpage/footer.inc new file mode 100644 index 0000000..e5477e0 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/footer.inc @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/header.inc b/software/aws-iot-ethernet/firmware/src/configuration_webpage/header.inc new file mode 100644 index 0000000..11c2e0f --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/header.inc @@ -0,0 +1,11 @@ + + + +Microchip IoT Ethernet Development Kit + + + +
+
Microchip
+
Embedded Configuration Webpage
 
\ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/images/mchp.gif b/software/aws-iot-ethernet/firmware/src/configuration_webpage/images/mchp.gif new file mode 100644 index 0000000000000000000000000000000000000000..39dc36d4afcfdd531525c5f564f50ab5a50544f4 GIT binary patch literal 1263 zcmb`C=}(gf0EgcmlyVeWw9sjtf@L*p;j*488v$@usy%v^Rz&X@p^VhN34EYCmmkND@K;Gv5Zo=O+4_T3@Bx{}(=1yye4slZILUF6IL+jz+h2p4VYOdoL_3VSTEs9MP zbEVW^CWsxvP$sHVu+@_BWdmAaXEq}hkKYr;o}t~QN%p8|y8C3LZfs93W$VOqIXEb1 z!Ljs(cit=Ih=iC(%k^Z-wQkw16-SiN2cRp^Y(zv zxs0K}YXcL_5fX9WEPi3YzK90S2!>0xcW`a8c!R3;3#=q=`67zH{W3Cc=!ChFZx7RW zr03W%{4NTOEmZ3^dRkvE`CcPCydS8r&YB;Q}LfXvRw9y zbnlzEi~fjN#L`{WeC|S--%K(PWxR^RCGBoW-(%>hC`uu9j%Hi?O(ddSm$muC+t^GZ zl4eXP2R|QspCrN`U;fC4P_~UL|K0#qB2nE)Et9qmTMW6kUjWo{gvber7;fqpmr`O9G z2C9x)y7$p_US^3QI3G^g&3Ow@)i8BLlYlmuI$Z$*`Z0MkI%|W;S(1tBi2C*fX~A#FJgc*+kqHJ^$~&7zmKM5V@0 zskZ)=N^kt}il<@aey}kwTK)MJ@e<-pyd+=K(6-qb**ouMPFspP-N@zier#`#fVboC z*g9m^5A@J)O;r?K`Xs35;u1|eLPx$I7zx_EE`Mg)#jND{=0uLdVnmVopc_6t9Da6M z@lD%ax|1J2WOh;0!HwS^%SN19QAC6~Q8I$0oTuGW$D(&QYS*8=Ip#rVyz*g|m-hQC zEw5X^*HMfsJvj3`?*b~?9FZ|6+qM%q+^Hz&eSNY2XMZvrKnJ|72+Jr&+)FqYV6EA; tlUdbNd!X9A(@V&D*Vf?qgn$YV<}Y?kW!P`5^uD{fvHH_T&tNRD_a9%N3i|*6 literal 0 HcmV?d00001 diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/index.htm b/software/aws-iot-ethernet/firmware/src/configuration_webpage/index.htm new file mode 100644 index 0000000..d5a0b04 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/index.htm @@ -0,0 +1,32 @@ +~inc:header.inc~ +
+
+
+
+

Server Address:

+

Client Public Cert:

+

Client Private Key:

+
+
+

+ + + + + +

+ + +
+
+ +
+
+ + + +
+
+ +~inc:footer.inc~ diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/javascript/mchp.js b/software/aws-iot-ethernet/firmware/src/configuration_webpage/javascript/mchp.js new file mode 100644 index 0000000..de17cb8 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/javascript/mchp.js @@ -0,0 +1,198 @@ + +/********************************************************************* + * Microchip TCP/IP Stack Javascript Library + ********************************************************************** + * + * Software License Agreement + * + * Copyright © 2002-2010 Microchip Technology Inc. All rights + * reserved. + * + * Microchip licenses to you the right to use, modify, copy, and + * distribute: + * (i) the Software when embedded on a Microchip microcontroller or + * digital signal controller product (“Device”) which is + * integrated into Licensee’s product; or + * (ii) ONLY the Software driver source files ENC28J60.c and + * ENC28J60.h ported to a non-Microchip device used in + * conjunction with a Microchip ethernet controller for the + * sole purpose of interfacing with the ethernet controller. + * + * You should refer to the license agreement accompanying this + * Software for additional information regarding your rights and + * obligations. + * + * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT + * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT + * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF + * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS + * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE + * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER + * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT + * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE. + * + * + * Author Date Comment + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Elliott Wood 12/5/07 Updated newAJAXCommand + ********************************************************************/ + +// Determines when a request is considered "timed out" +var timeOutMS = 5000; //ms + +// Stores a queue of AJAX events to process +var ajaxList = new Array(); + +/** + * stores the number of dots current being shown in the rescan button + */ +var scanDots = 0; + +/** + * current iteration of the bss info read from WiFi module. + */ +var currBss = 0; + +/** + * whether to destroy or build other networks table + */ +var otherNetworkExpanded = 1; + +// Initiates a new AJAX command +// url: the url to access +// container: the document ID to fill, or a function to call with response XML (optional) +// repeat: true to repeat this call indefinitely (optional) +// data: an URL encoded string to be submitted as POST data (optional) +function newAJAXCommand(url, container, repeat, data) +{ + // Set up our object + var newAjax = new Object(); + var theTimer = new Date(); + newAjax.url = url; + newAjax.container = container; + newAjax.repeat = repeat; + newAjax.ajaxReq = null; + + // Create and send the request + if(window.XMLHttpRequest) { + newAjax.ajaxReq = new XMLHttpRequest(); + newAjax.ajaxReq.open((data==null)?"GET":"POST", newAjax.url, true); + newAjax.ajaxReq.send(data); + // If we're using IE6 style (maybe 5.5 compatible too) + } else if(window.ActiveXObject) { + newAjax.ajaxReq = new ActiveXObject("Microsoft.XMLHTTP"); + if(newAjax.ajaxReq) { + newAjax.ajaxReq.open((data==null)?"GET":"POST", newAjax.url, true); + newAjax.ajaxReq.send(data); + } + } + + newAjax.lastCalled = theTimer.getTime(); + + // Store in our array + ajaxList.push(newAjax); +} + +// Loops over all pending AJAX events to determine if any action is required +function pollAJAX() { + var curAjax = new Object(); + var theTimer = new Date(); + var elapsed; + + // Read off the ajaxList objects one by one + for(i = ajaxList.length; i > 0; i--) + { + curAjax = ajaxList.shift(); + if(!curAjax) + continue; + elapsed = theTimer.getTime() - curAjax.lastCalled; + + // If we succeeded + if(curAjax.ajaxReq.readyState == 4 && curAjax.ajaxReq.status == 200) { + // If it has a container, write the result + if(typeof(curAjax.container) == 'function'){ + curAjax.container(curAjax.ajaxReq.responseXML.documentElement); + } else if(typeof(curAjax.container) == 'string') { + document.getElementById(curAjax.container).innerHTML = curAjax.ajaxReq.responseText; + } // (otherwise do nothing for null values) + + curAjax.ajaxReq.abort(); + curAjax.ajaxReq = null; + + // If it's a repeatable request, then do so + if(curAjax.repeat) + newAJAXCommand(curAjax.url, curAjax.container, curAjax.repeat); + continue; + } + + // If we've waited over 1 second, then we timed out + if(elapsed > timeOutMS) { + // Invoke the user function with null input + if(typeof(curAjax.container) == 'function'){ + curAjax.container(null); + } else { + // Alert the user + alert("Command failed.\nConnection to development board was lost."); + } + + curAjax.ajaxReq.abort(); + curAjax.ajaxReq = null; + + // If it's a repeatable request, then do so + if(curAjax.repeat) + newAJAXCommand(curAjax.url, curAjax.container, curAjax.repeat); + continue; + } + + // Otherwise, just keep waiting + ajaxList.push(curAjax); + } + + // Call ourselves again in 10ms + setTimeout("pollAJAX()",10); + +} + +function joinNetwork() { + // copy elements from hidden form and submit them through + // the normal form + + var remoteServer; + remoteServer = document.getElementById('remote_server1').value; + + var cert; + cert = document.getElementById('cert').value; + + var key; + key = document.getElementById('pkey').value; + + var ValidIpAddressRegex = new RegExp("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$"); + var ValidHostnameRegex = new RegExp("^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$"); + + var ipOrDns; + if(ValidIpAddressRegex.test(remoteServer) == true) + { + ipOrDns = "validIp"; + } + else if(ValidHostnameRegex.test(remoteServer)== true) + { + ipOrDns = "validHostname"; + } + else + { + alert('Please enter a valid URL (e.g. https://123.123.123.123 or https://yourdomain.com.'); + return; + } + + document.getElementById("rs").value = remoteServer; + document.getElementById("cc").value = cert; + document.getElementById("ck").value = key; + + document.kickoff.submit(); +} + +//kick off the AJAX Updater +setTimeout("pollAJAX()", 10); diff --git a/software/aws-iot-ethernet/firmware/src/configuration_webpage/reconnect.htm b/software/aws-iot-ethernet/firmware/src/configuration_webpage/reconnect.htm new file mode 100644 index 0000000..e5a0879 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/configuration_webpage/reconnect.htm @@ -0,0 +1,16 @@ +~inc:header.inc~ +
+
+

Connecting to server...

+ +

The IoT Ethernet board is now connecting to your AWS IoT Endpoint

+ +

This is the server you entered and your board's UUID:

+
    +
  • AWS IoT Endpoint: ~remoteServer~
  • +
  • UUID: ~uuid~
  • +
+
+
+ +~inc:footer.inc~ diff --git a/software/aws-iot-ethernet/firmware/src/custom_http_app.c b/software/aws-iot-ethernet/firmware/src/custom_http_app.c new file mode 100644 index 0000000..621082c --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/custom_http_app.c @@ -0,0 +1,1879 @@ +/******************************************************************************* + Application to Demo HTTP Server + + Summary: + Support for HTTP module in Microchip TCP/IP Stack + + Description: + -Implements the application + -Reference: RFC 1002 + *******************************************************************************/ + +/******************************************************************************* +File Name: custom_http_app.c +Copyright (C) 2012 released Microchip Technology Inc. All rights +reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ + +#define __CUSTOMHTTPAPP_C + +#include "system_config.h" + +#if defined(TCPIP_STACK_USE_HTTP_SERVER) + +#include "tcpip/tcpip.h" +#include "system/tmr/sys_tmr.h" +#include "system/random/sys_random.h" +#include "tcpip/src/common/helpers.h" +#include "crypto/crypto.h" + +/**************************************************************************** + Section: + Definitions + ****************************************************************************/ +// Use the web page in the Demo App (~2.5kb ROM, ~0b RAM) +#define HTTP_APP_USE_RECONFIG + +#ifndef NO_MD5 +// Use the MD5 Demo web page (~5kb ROM, ~160b RAM) +#define HTTP_APP_USE_MD5 +#endif + +// Use the e-mail demo web page +#if defined (TCPIP_STACK_USE_SMTP_CLIENT) +#define HTTP_APP_USE_EMAIL +#endif + +#define HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE 20 + +/**************************************************************************** + Section: + Function Prototypes + ****************************************************************************/ +#if defined(TCPIP_HTTP_USE_POST) + #if defined(SYS_OUT_ENABLE) + static HTTP_IO_RESULT HTTPPostLCD(HTTP_CONN_HANDLE connHandle); + #endif + #if defined(HTTP_APP_USE_MD5) + static HTTP_IO_RESULT HTTPPostMD5(HTTP_CONN_HANDLE connHandle); + #endif + #if defined(HTTP_APP_USE_RECONFIG) + static HTTP_IO_RESULT HTTPPostConfig(HTTP_CONN_HANDLE connHandle); + #if defined(TCPIP_STACK_USE_SNMP_SERVER) + static HTTP_IO_RESULT HTTPPostSNMPCommunity(HTTP_CONN_HANDLE connHandle); + #endif + #endif + #if defined(HTTP_APP_USE_EMAIL) || defined(TCPIP_STACK_USE_SMTP_CLIENT) + static HTTP_IO_RESULT HTTPPostEmail(HTTP_CONN_HANDLE connHandle); + #endif + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + static HTTP_IO_RESULT HTTPPostDDNSConfig(HTTP_CONN_HANDLE connHandle); + #endif +#endif + +/**************************************************************************** + Section: + Variables + ****************************************************************************/ +static uint8_t s_buf_ipv4addr[HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE]; + +extern const char * const ddnsServiceHosts[]; +// RAM allocated for DDNS parameters +#if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + static uint8_t DDNSData[100]; +#endif + +// Sticky status message variable. +// This is used to indicated whether or not the previous POST operation was +// successful. The application uses these to store status messages when a +// POST operation redirects. This lets the application provide status messages +// after a redirect, when connection instance data has already been lost. +static bool lastSuccess = false; + +// Stick status message variable. See lastSuccess for details. +static bool lastFailure = false; + +/**************************************************************************** + Section: + Authorization Handlers + ****************************************************************************/ + +/**************************************************************************** + Function: + uint8_t TCPIP_HTTP_FileAuthenticate(HTTP_CONN_HANDLE connHandle, uint8_t *cFile) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ****************************************************************************/ +#if defined(TCPIP_HTTP_USE_AUTHENTICATION) +uint8_t TCPIP_HTTP_FileAuthenticate(HTTP_CONN_HANDLE connHandle, uint8_t *cFile) +{ + // If the filename begins with the folder "protect", then require auth. + if(memcmp(cFile, (const void *)"protect", 7) == 0) + return 0x00; // Authentication will be needed later. + + // If the filename begins with the folder "snmp", then require auth. + if(memcmp(cFile, (const void *)"snmp", 4) == 0) + return 0x00; // Authentication will be needed later. + + #if defined(HTTP_MPFS_UPLOAD_REQUIRES_AUTH) + if(memcmp(cFile, (const void *)"mpfsupload", 10) == 0) + return 0x00; + #endif + // You can match additional strings here to password protect other files. + // You could switch this and exclude files from authentication. + // You could also always return 0x00 to require auth for all files. + // You can return different values (0x00 to 0x79) to track "realms" for below. + + return 0x80; // No authentication required. +} +#endif + +/**************************************************************************** + Function: + uint8_t TCPIP_HTTP_UserAuthenticate(uint8_t *cUser, uint8_t *cPass) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ****************************************************************************/ +#if defined(TCPIP_HTTP_USE_AUTHENTICATION) +uint8_t TCPIP_HTTP_UserAuthenticate(HTTP_CONN_HANDLE connHandle, uint8_t *cUser, uint8_t *cPass) +{ + if(strcmp((char *)cUser,(const char *)"admin") == 0 + && strcmp((char *)cPass, (const char *)"microchip") == 0) + return 0x80; // We accept this combination + + // You can add additional user/pass combos here. + // If you return specific "realm" values above, you can base this + // decision on what specific file or folder is being accessed. + // You could return different values (0x80 to 0xff) to indicate + // various users or groups, and base future processing decisions + // in TCPIP_HTTP_GetExecute/Post or HTTPPrint callbacks on this value. + + return 0x00; // Provided user/pass is invalid +} +#endif + +/**************************************************************************** + Section: + GET Form Handlers + ****************************************************************************/ + +/**************************************************************************** + Function: + HTTP_IO_RESULT TCPIP_HTTP_GetExecute(HTTP_CONN_HANDLE connHandle) + + Internal: + See documentation in the TCP/IP Stack API or http.h for details. + ****************************************************************************/ +HTTP_IO_RESULT TCPIP_HTTP_GetExecute(HTTP_CONN_HANDLE connHandle) +{ + const uint8_t *ptr; + uint8_t filename[20]; + uint8_t *httpDataBuff; + + // Load the file name. + // Make sure uint8_t filename[] above is large enough for your longest name. + SYS_FS_FileNameGet(TCPIP_HTTP_CurrentConnectionFileGet(connHandle), filename, 20); + + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + + // If its the forms.htm page. + if(!memcmp(filename, "forms.htm", 9)) + { + // Seek out each of the four LED strings, and if it exists set the LED states. + ptr = TCPIP_HTTP_ArgGet(httpDataBuff, (const uint8_t *)"led2"); + if(ptr) + BSP_LEDStateSet(APP_TCPIP_LED_3, (*ptr == '1')); + //LED2_IO = (*ptr == '1'); + + ptr = TCPIP_HTTP_ArgGet(httpDataBuff, (const uint8_t *)"led1"); + if(ptr) + BSP_LEDStateSet(APP_TCPIP_LED_2, (*ptr == '1')); + //LED1_IO = (*ptr == '1'); + } + + else if(!memcmp(filename, "cookies.htm", 11)) + { + // This is very simple. The names and values we want are already in + // the data array. We just set the hasArgs value to indicate how many + // name/value pairs we want stored as cookies. + // To add the second cookie, just increment this value. + // remember to also add a dynamic variable callback to control the printout. + TCPIP_HTTP_CurrentConnectionHasArgsSet(connHandle, 0x01); + } + + // If it's the LED updater file. + else if(!memcmp(filename, "leds.cgi", 8)) + { + // Determine which LED to toggle. + ptr = TCPIP_HTTP_ArgGet(httpDataBuff, (const uint8_t *)"led"); + + // Toggle the specified LED. + switch(*ptr) { + case '0': + BSP_LEDToggle(APP_TCPIP_LED_1); + //LED0_IO ^= 1; + break; + case '1': + BSP_LEDToggle(APP_TCPIP_LED_2); + //LED1_IO ^= 1; + break; + case '2': + BSP_LEDToggle(APP_TCPIP_LED_3); + //LED2_IO ^= 1; + break; + } + } + + return HTTP_IO_DONE; +} + +/**************************************************************************** + Section: + POST Form Handlers + ****************************************************************************/ +#if defined(TCPIP_HTTP_USE_POST) + +/**************************************************************************** + Function: + HTTP_IO_RESULT TCPIP_HTTP_PostExecute(HTTP_CONN_HANDLE connHandle) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ****************************************************************************/ +HTTP_IO_RESULT TCPIP_HTTP_PostExecute(HTTP_CONN_HANDLE connHandle) +{ + // Resolve which function to use and pass along + uint8_t filename[20]; + + // Load the file name + // Make sure uint8_t filename[] above is large enough for your longest name + SYS_FS_FileNameGet(TCPIP_HTTP_CurrentConnectionFileGet(connHandle), filename, sizeof(filename)); + +#if defined(SYS_OUT_ENABLE) + if(!memcmp(filename, "forms.htm", 9)) + return HTTPPostLCD(connHandle); +#endif + +#if defined(HTTP_APP_USE_MD5) + if(!memcmp(filename, "upload.htm", 10)) + return HTTPPostMD5(connHandle); +#endif + +#if defined(HTTP_APP_USE_RECONFIG) + if(!memcmp(filename, "protect/config.htm", 18)) + return HTTPPostConfig(connHandle); + #if defined(TCPIP_STACK_USE_SNMP_SERVER) + else if(!memcmp(filename, "snmp/snmpconfig.htm", 19)) + return HTTPPostSNMPCommunity(connHandle); + #endif +#endif + +#if defined(TCPIP_STACK_USE_SMTP_CLIENT) + if(!strcmp((char *)filename, "email/index.htm")) + return HTTPPostEmail(connHandle); +#endif + +#if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + if(!strcmp((char *)filename, "dyndns/index.htm")) + return HTTPPostDDNSConfig(connHandle); +#endif + + return HTTP_IO_DONE; +} + +/**************************************************************************** + Function: + static HTTP_IO_RESULT HTTPPostLCD(HTTP_CONN_HANDLE connHandle) + + Summary: + Processes the LCD form on forms.htm + + Description: + Locates the 'lcd' parameter and uses it to update the text displayed + on the board's LCD display. + + This function has four states. The first reads a name from the data + string returned as part of the POST request. If a name cannot + be found, it returns, asking for more data. Otherwise, if the name + is expected, it reads the associated value and writes it to the LCD. + If the name is not expected, the value is discarded and the next name + parameter is read. + + In the case where the expected string is never found, this function + will eventually return HTTP_IO_NEED_DATA when no data is left. In that + case, the HTTP server will automatically trap the error and issue an + Internal Server Error to the browser. + + Precondition: + None + + Parameters: + connHandle - HTTP connection handle + + Return Values: + HTTP_IO_DONE - the parameter has been found and saved + HTTP_IO_WAITING - the function is pausing to continue later + HTTP_IO_NEED_DATA - data needed by this function has not yet arrived + ****************************************************************************/ +#if defined(SYS_OUT_ENABLE) +static HTTP_IO_RESULT HTTPPostLCD(HTTP_CONN_HANDLE connHandle) +{ + uint8_t *cDest; + uint8_t *httpDataBuff; + + #define SM_POST_LCD_READ_NAME (0u) + #define SM_POST_LCD_READ_VALUE (1u) + + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + switch(TCPIP_HTTP_CurrentConnectionPostSmGet(connHandle)) + { + // Find the name + case SM_POST_LCD_READ_NAME: + + // Read a name + if(TCPIP_HTTP_PostNameRead(connHandle, httpDataBuff, TCPIP_HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_POST_LCD_READ_VALUE); + // No break...continue reading value + + // Found the value, so store the LCD and return + case SM_POST_LCD_READ_VALUE: + + // If value is expected, read it to data buffer, + // otherwise ignore it (by reading to NULL) + if(!strcmp((char *)httpDataBuff, (const char *)"lcd")) + cDest = httpDataBuff; + else + cDest = NULL; + + // Read a value string + if(TCPIP_HTTP_PostValueRead(connHandle, cDest, TCPIP_HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // If this was an unexpected value, look for a new name + if(!cDest) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_POST_LCD_READ_NAME); + break; + } + + SYS_OUT_MESSAGE((char *)cDest); + + // This is the only expected value, so callback is done + strcpy((char *)httpDataBuff, "/forms.htm"); + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + return HTTP_IO_DONE; + } + + // Default assumes that we're returning for state machine convenience. + // Function will be called again later. + return HTTP_IO_WAITING; +} +#endif + +/******************************************************************************* + Function: + static HTTP_IO_RESULT HTTPPostConfig(HTTP_CONN_HANDLE connHandle) + + Summary: + Processes the configuration form on config/index.htm. + + Description: + Accepts configuration parameters from the form, saves them to a + temporary location in RAM, then eventually saves the data to EEPROM or + external Flash. + + When complete, this function redirects to config/reboot.htm, which will + display information on reconnecting to the board. + + This function creates a shadow copy of a network info structure in + RAM and then overwrites incoming data there as it arrives. For each + name/value pair, the name is first read to cur connection data[0:5]. Next, the + value is read to newNetConfig. Once all data has been read, the new + network info structure is saved back to storage and the browser is redirected to + reboot.htm. That file includes an AJAX call to reboot.cgi, which + performs the actual reboot of the machine. + + If an IP address cannot be parsed, too much data is POSTed, or any other + parsing error occurs, the browser reloads config.htm and displays an error + message at the top. + + Precondition: + None. + + Parameters: + connHandle - HTTP connection handle + + Return Values: + HTTP_IO_DONE - all parameters have been processed + HTTP_IO_NEED_DATA - data needed by this function has not yet arrived + *******************************************************************************/ +#if defined(HTTP_APP_USE_RECONFIG) +// network configuration/information storage space +static struct +{ + TCPIP_NET_HANDLE currNet; // current working interface + valid flag + char ifName[10 + 1]; // interface name + char nbnsName[16 + 1]; // host name + char ifMacAddr[17 + 1]; // MAC address + char ipAddr[15 +1]; // IP address + char ipMask[15 + 1]; // mask + char gwIP[15 + 1]; // gateway IP address + char dns1IP[15 + 1]; // DNS IP address + char dns2IP[15 + 1]; // DNS IP address + + TCPIP_NETWORK_CONFIG netConfig; // configuration in the interface requested format +}httpNetData; + +static HTTP_IO_RESULT HTTPPostConfig(HTTP_CONN_HANDLE connHandle) +{ + uint8_t i; + IPV4_ADDR newIPAddress, newMask; + TCPIP_MAC_ADDR newMACAddr; + uint32_t byteCount; + TCP_SOCKET sktHTTP; + uint8_t *httpDataBuff = 0; + bool bConfigFailure = false; + + httpNetData.currNet = 0; // forget the old settings + + // Check to see if the browser is attempting to submit more data than we + // can parse at once. This function needs to receive all updated + // parameters and validate them all before committing them to memory so that + // orphaned configuration parameters do not get written (for example, if a + // static IP address is given, but the subnet mask fails parsing, we + // should not use the static IP address). Everything needs to be processed + // in a single transaction. If this is impossible, fail and notify the user. + // As a web devloper, if you add parameters to the network info and run into this + // problem, you could fix this by to splitting your update web page into two + // seperate web pages (causing two transactional writes). Alternatively, + // you could fix it by storing a static shadow copy of network info someplace + // in memory and using it when info is complete. + // Lastly, you could increase the TCP RX FIFO size for the HTTP server. + // This will allow more data to be POSTed by the web browser before hitting this limit. + byteCount = TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle); + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + if(byteCount > TCPIP_TCP_GetIsReady(sktHTTP) + TCPIP_TCP_FifoRxFreeGet(sktHTTP)) + { // Configuration Failure + lastFailure = true; + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + return HTTP_IO_DONE; + } + + // Ensure that all data is waiting to be parsed. If not, keep waiting for + // all of it to arrive. + if(TCPIP_TCP_GetIsReady(sktHTTP) < byteCount) + return HTTP_IO_NEED_DATA; + + // Use current config in non-volatile memory as defaults + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + + // Read all browser POST data + while(TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle)) + { + // Read a form field name + if(TCPIP_HTTP_PostNameRead(connHandle, httpDataBuff, 6) != HTTP_READ_OK) + { + bConfigFailure = true; + break; + } + + // Read a form field value + if(TCPIP_HTTP_PostValueRead(connHandle, httpDataBuff + 6, TCPIP_HTTP_MAX_DATA_LEN-6-2) != HTTP_READ_OK) + { + bConfigFailure = true; + break; + } + + // Parse the value that was read + if(!strcmp((char *)httpDataBuff, (const char *)"ip")) + { // Save new static IP Address + if(!TCPIP_Helper_StringToIPAddress((char *)(httpDataBuff+6), &newIPAddress)) + { + bConfigFailure = true; + break; + } + strncpy(httpNetData.ipAddr, (char *)httpDataBuff + 6, sizeof(httpNetData.ipAddr)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"gw")) + { // Read new gateway address + if(!TCPIP_Helper_StringToIPAddress((char *)(httpDataBuff+6), &newIPAddress)) + { + bConfigFailure = true; + break; + } + strncpy(httpNetData.gwIP, (char *)httpDataBuff + 6, sizeof(httpNetData.gwIP)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"sub")) + { // Read new static subnet + if(!TCPIP_Helper_StringToIPAddress((char *)(httpDataBuff+6), &newMask)) + { + bConfigFailure = true; + break; + } + strncpy(httpNetData.ipMask, (char *)httpDataBuff + 6, sizeof(httpNetData.ipMask)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"dns1")) + { // Read new primary DNS server + if(!TCPIP_Helper_StringToIPAddress((char *)(httpDataBuff+6), &newIPAddress)) + { + bConfigFailure = true; + break; + } + strncpy(httpNetData.dns1IP, (char *)httpDataBuff + 6, sizeof(httpNetData.dns1IP)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"dns2")) + { // Read new secondary DNS server + if(!TCPIP_Helper_StringToIPAddress((char *)(httpDataBuff+6), &newIPAddress)) + { + bConfigFailure = true; + break; + } + strncpy(httpNetData.dns2IP, (char *)httpDataBuff + 6, sizeof(httpNetData.dns2IP)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"mac")) + { // read the new MAC address + if(!TCPIP_Helper_StringToMACAddress((char *)(httpDataBuff+6), newMACAddr.v)) + { + bConfigFailure = true; + break; + } + strncpy(httpNetData.ifMacAddr, (char *)httpDataBuff + 6, sizeof(httpNetData.ifMacAddr)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"host")) + { // Read new hostname + strncpy(httpNetData.nbnsName, (char *)httpDataBuff + 6, sizeof(httpNetData.nbnsName)); + } + else if(!strcmp((char *)httpDataBuff, (const char *)"dhcp")) + { // Read new DHCP Enabled flag + httpNetData.netConfig.startFlags = httpDataBuff[6] == '1' ? TCPIP_NETWORK_CONFIG_DHCP_CLIENT_ON : 0; + } + } + + if(bConfigFailure == false) + { + // All parsing complete! Save new settings and force an interface restart + // Set the interface to restart and display reconnecting information + strcpy((char *)httpDataBuff, "/protect/reboot.htm?"); + TCPIP_Helper_FormatNetBIOSName((uint8_t *)httpNetData.nbnsName); + memcpy((void *)(httpDataBuff+20), httpNetData.nbnsName, 16); + httpDataBuff[20+16] = 0x00; // Force null termination + for(i = 20; i < 20u+16u; i++) + { + if(httpDataBuff[i] == ' ') + httpDataBuff[i] = 0x00; + } + httpNetData.currNet = TCPIP_TCP_SocketNetGet(sktHTTP); // save current interface and mark as valid + strncpy(httpNetData.ifName, TCPIP_STACK_NetNameGet(httpNetData.currNet), sizeof(httpNetData.ifName)); + } + else + { // Configuration error + + lastFailure = true; + if(httpDataBuff) + { + strcpy((char *)httpDataBuff, "/protect/config.htm"); + } + } + + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + + return HTTP_IO_DONE; +} + +#if defined(TCPIP_STACK_USE_SNMP_SERVER) +static HTTP_IO_RESULT HTTPPostSNMPCommunity(HTTP_CONN_HANDLE connHandle) +{ + uint8_t vCommunityIndex; + uint8_t *httpDataBuff; + uint8_t len = 0; + + #define SM_CFG_SNMP_READ_NAME (0u) + #define SM_CFG_SNMP_READ_VALUE (1u) + + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + switch(TCPIP_HTTP_CurrentConnectionPostSmGet(connHandle)) + { + case SM_CFG_SNMP_READ_NAME: + // If all parameters have been read, end + if(TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle) == 0u) + { + return HTTP_IO_DONE; + } + + // Read a name + if(TCPIP_HTTP_PostNameRead(connHandle, httpDataBuff, TCPIP_HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // Move to reading a value, but no break + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_CFG_SNMP_READ_VALUE); + + case SM_CFG_SNMP_READ_VALUE: + // Read a value + if(TCPIP_HTTP_PostValueRead(connHandle, httpDataBuff + 6, TCPIP_HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // Default action after this is to read the next name, unless there's an error + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_CFG_SNMP_READ_NAME); + + // See if this is a known parameter and legal (must be null + // terminator in 4th field name byte, string must no greater than + // TCPIP_SNMP_COMMUNITY_MAX_LEN bytes long, and TCPIP_SNMP_MAX_COMMUNITY_SUPPORT + // must not be violated. + vCommunityIndex = httpDataBuff[3] - '0'; + if(vCommunityIndex >= TCPIP_SNMP_MAX_COMMUNITY_SUPPORT) + break; + if(httpDataBuff[4] != 0x00u) + break; + len = strlen((char *)httpDataBuff + 6); + if(len > TCPIP_SNMP_COMMUNITY_MAX_LEN) + { + break; + } + if(memcmp((void *)httpDataBuff, (const void *)"rcm", 3) == 0) + { + if(TCPIP_SNMP_ReadCommunitySet(vCommunityIndex,len,httpDataBuff+6)!=true) + break; + } + else if(memcmp((void *)httpDataBuff, (const void *)"wcm", 3) == 0) + { + if(TCPIP_SNMP_WriteCommunitySet(vCommunityIndex,len,httpDataBuff+6) != true) + break; + } + else + { + break; + } + + break; + } + + return HTTP_IO_WAITING; // Assume we're waiting to process more data +} +#endif // #if defined(TCPIP_STACK_USE_SNMP_SERVER) + +#endif // #if defined(HTTP_APP_USE_RECONFIG) + +/**************************************************************************** + Function: + static HTTP_IO_RESULT HTTPPostMD5(HTTP_CONN_HANDLE connHandle) + + Summary: + Processes the file upload form on upload.htm + + Description: + This function demonstrates the processing of file uploads. First, the + function locates the file data, skipping over any headers that arrive. + Second, it reads the file 64 bytes at a time and hashes that data. Once + all data has been received, the function calculates the MD5 sum and + stores it in current connection data buffer. + + After the headers, the first line from the form will be the MIME + separator. Following that is more headers about the file, which we + discard. After another CRLFCRLF, the file data begins, and we read + it 16 bytes at a time and add that to the MD5 calculation. The reading + terminates when the separator string is encountered again on its own + line. Notice that the actual file data is trashed in this process, + allowing us to accept files of arbitrary size, not limited by RAM. + Also notice that the data buffer is used as an arbitrary storage array + for the result. The ~uploadedmd5~ callback reads this data later to + send back to the client. + + Precondition: + None + + Parameters: + connHandle - HTTP connection handle + + Return Values: + HTTP_IO_DONE - all parameters have been processed + HTTP_IO_WAITING - the function is pausing to continue later + HTTP_IO_NEED_DATA - data needed by this function has not yet arrived + ****************************************************************************/ +#if defined(HTTP_APP_USE_MD5) +static HTTP_IO_RESULT HTTPPostMD5(HTTP_CONN_HANDLE connHandle) +{ + uint32_t lenA, lenB; + static CRYPT_MD5_CTX md5; + + TCP_SOCKET sktHTTP; + uint8_t *httpDataBuff; + + #define SM_MD5_READ_SEPARATOR (0u) + #define SM_MD5_SKIP_TO_DATA (1u) + #define SM_MD5_READ_DATA (2u) + #define SM_MD5_POST_COMPLETE (3u) + + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + switch(TCPIP_HTTP_CurrentConnectionPostSmGet(connHandle)) + { + // Just started, so try to find the separator string + case SM_MD5_READ_SEPARATOR: + // Reset the MD5 calculation + CRYPT_MD5_Initialize(&md5); + + // See if a CRLF is in the buffer + lenA = TCPIP_TCP_ArrayFind(sktHTTP, (const uint8_t *)"\r\n", 2, 0, 0, false); + if(lenA == 0xffff) + { //if not, ask for more data + return HTTP_IO_NEED_DATA; + } + + // If so, figure out where the last byte of data is + // Data ends at CRLFseparator--CRLF, so 6+len bytes + TCPIP_HTTP_CurrentConnectionByteCountDec(connHandle, lenA + 6); + + // Read past the CRLF + TCPIP_HTTP_CurrentConnectionByteCountDec(connHandle, TCPIP_TCP_ArrayGet(sktHTTP, NULL, lenA+2)); + + // Save the next state (skip to CRLFCRLF) + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_MD5_SKIP_TO_DATA); + + // No break...continue reading the headers if possible + + // Skip the headers + case SM_MD5_SKIP_TO_DATA: + // Look for the CRLFCRLF + lenA = TCPIP_TCP_ArrayFind(sktHTTP, (const uint8_t *)"\r\n\r\n", 4, 0, 0, false); + + if(lenA != 0xffff) + { // Found it, so remove all data up to and including + lenA = TCPIP_TCP_ArrayGet(sktHTTP, NULL, lenA+4); + TCPIP_HTTP_CurrentConnectionByteCountDec(connHandle, lenA); + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_MD5_READ_DATA); + } + else + { // Otherwise, remove as much as possible + lenA = TCPIP_TCP_ArrayGet(sktHTTP, NULL, TCPIP_TCP_GetIsReady(sktHTTP) - 4); + TCPIP_HTTP_CurrentConnectionByteCountDec(connHandle, lenA); + + // Return the need more data flag + return HTTP_IO_NEED_DATA; + } + + // No break if we found the header terminator + + // Read and hash file data + case SM_MD5_READ_DATA: + // Find out how many bytes are available to be read + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + lenA = TCPIP_TCP_GetIsReady(sktHTTP); + lenB = TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle); + if(lenA > lenB) + lenA = lenB; + + while(lenA > 0u) + { // Add up to 64 bytes at a time to the sum + lenB = TCPIP_TCP_ArrayGet(sktHTTP, httpDataBuff, (lenA < 64u)?lenA:64); + TCPIP_HTTP_CurrentConnectionByteCountDec(connHandle, lenB); + lenA -= lenB; + CRYPT_MD5_DataAdd(&md5,httpDataBuff, lenB); + } + + // If we've read all the data + if(TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle) == 0u) + {// Calculate and copy result data buffer for printout + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_MD5_POST_COMPLETE); + CRYPT_MD5_Finalize(&md5, httpDataBuff); + return HTTP_IO_DONE; + } + + // Ask for more data + return HTTP_IO_NEED_DATA; + } + + return HTTP_IO_DONE; +} +#endif // #if defined(HTTP_APP_USE_MD5) + +/**************************************************************************** + Function: + static HTTP_IO_RESULT HTTPPostEmail(void) + + Summary: + Processes the e-mail form on email/index.htm + + Description: + This function sends an e-mail message using the SMTP client and + optionally encrypts the connection to the SMTP server. It + demonstrates the use of the SMTP client, waiting for asynchronous + processes in an HTTP callback, and how to send e-mail attachments using + the stack. + + Messages with attachments are sent using multipart/mixed MIME encoding, + which has three sections. The first has no headers, and is only to be + displayed by old clients that cannot interpret the MIME format. (The + overwhelming majority of these clients have been obseleted, but the + so-called "ignored" section is still used.) The second has a few + headers to indicate that it is the main body of the message in plain- + text encoding. The third section has headers indicating an attached + file, along with its name and type. All sections are separated by a + boundary string, which cannot appear anywhere else in the message. + + Precondition: + None + + Parameters: + connHandle - HTTP connection handle + + Return Values: + HTTP_IO_DONE - the message has been sent + HTTP_IO_WAITING - the function is waiting for the SMTP process to complete + HTTP_IO_NEED_DATA - data needed by this function has not yet arrived + ****************************************************************************/ +#if defined(TCPIP_STACK_USE_SMTP_CLIENT) +static HTTP_IO_RESULT HTTPPostEmail(HTTP_CONN_HANDLE connHandle) +{ + static uint8_t *ptrData; + static uint8_t *szPort; + static TCPIP_SMTP_CLIENT_MESSAGE mySMTPClient; + uint16_t len, rem; + uint8_t cName[8]; + uint8_t *httpDataBuff; + TCP_SOCKET sktHTTP; + + #define SM_EMAIL_CLAIM_MODULE (0u) + #define SM_EMAIL_READ_PARAM_NAME (1u) + #define SM_EMAIL_READ_PARAM_VALUE (2u) + #define SM_EMAIL_PUT_IGNORED (3u) + #define SM_EMAIL_PUT_BODY (4u) + #define SM_EMAIL_PUT_ATTACHMENT_HEADER (5u) + #define SM_EMAIL_PUT_ATTACHMENT_DATA_BTNS (6u) + #define SM_EMAIL_PUT_ATTACHMENT_DATA_LEDS (7u) + #define SM_EMAIL_PUT_ATTACHMENT_DATA_POT (8u) + #define SM_EMAIL_PUT_TERMINATOR (9u) + #define SM_EMAIL_FINISHING (10u) + + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + switch(TCPIP_HTTP_CurrentConnectionPostSmGet(connHandle)) + { + case SM_EMAIL_CLAIM_MODULE: + // Try to claim module + if(TCPIP_SMTP_UsageBegin()) + { // Module was claimed, so set up static parameters + memset(&mySMTPClient, 0, sizeof(mySMTPClient)); + mySMTPClient.Subject = "Microchip TCP/IP Stack Status Update"; + mySMTPClient.From = "\"SMTP Service\" "; + + // The following two lines indicate to the receiving client that + // this message has an attachment. The boundary field *must not* + // be included anywhere in the content of the message. In real + // applications it is typically a long random string. + mySMTPClient.OtherHeaders = "MIME-version: 1.0\r\nContent-type: multipart/mixed; boundary=\"frontier\"\r\n"; + + // Move our state machine forward + ptrData = httpDataBuff; + szPort = NULL; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_NAME); + } + return HTTP_IO_WAITING; + + case SM_EMAIL_READ_PARAM_NAME: + // Search for a parameter name in POST data + if(TCPIP_HTTP_PostNameRead(connHandle, cName, sizeof(cName)) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // Try to match the name value + if(!strcmp((char *)cName, (const char *)"server")) + { // Read the server name + mySMTPClient.Server = (char *)ptrData; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_VALUE); + } + else if(!strcmp((char *)cName, (const char *)"port")) + { // Read the server port + szPort = ptrData; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_VALUE); + } + else if(!strcmp((char *)cName, (const char *)"user")) + { // Read the user name + mySMTPClient.Username = (char *)ptrData; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_VALUE); + } + else if(!strcmp((char *)cName, (const char *)"pass")) + { // Read the password + mySMTPClient.Password = (char *)ptrData; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_VALUE); + } + else if(!strcmp((char *)cName, (const char *)"to")) + { // Read the To string + mySMTPClient.To = (char *)ptrData; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_VALUE); + } + else if(!strcmp((char *)cName, (const char *)"msg")) + { // Done with headers, move on to the message + // Delete paramters that are just null strings (no data from user) or illegal (ex: password without username) + if(mySMTPClient.Server ) + if(*mySMTPClient.Server == 0x00u) + mySMTPClient.Server = NULL; + if(mySMTPClient.Username ) + if(*mySMTPClient.Username == 0x00u) + mySMTPClient.Username = NULL; + if(mySMTPClient.Password) + if((*mySMTPClient.Password == 0x00u) || (mySMTPClient.Username == NULL)) + mySMTPClient.Password = NULL; + + // Decode server port string if it exists + if(szPort) + if(*szPort) + mySMTPClient.ServerPort = (uint16_t)atol((char *)szPort); + + // Start sending the message + TCPIP_SMTP_MailSend(&mySMTPClient); + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_IGNORED); + return HTTP_IO_WAITING; + } + else + { // Don't know what we're receiving + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_VALUE); + } + + // No break...continue to try reading the value + + case SM_EMAIL_READ_PARAM_VALUE: + // Search for a parameter value in POST data + rem = TCPIP_HTTP_MAX_DATA_LEN - (ptrData - httpDataBuff); + if(TCPIP_HTTP_PostValueRead(connHandle, ptrData, rem) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // Move past the data that was just read + ptrData += strlen((char *)ptrData); + if(ptrData < httpDataBuff + TCPIP_HTTP_MAX_DATA_LEN - 1) + ptrData += 1; + + // Try reading the next parameter + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_READ_PARAM_NAME); + return HTTP_IO_WAITING; + + case SM_EMAIL_PUT_IGNORED: + // This section puts a message that is ignored by compatible clients. + // This text will not display unless the receiving client is obselete + // and does not understand the MIME structure. + // The "--frontier" indicates the start of a section, then any + // needed MIME headers follow, then two CRLF pairs, and then + // the actual content (which will be the body text in the next state). + + // Check to see if a failure occured + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // See if we're ready to write data + if(TCPIP_SMTP_IsPutReady() < 90u) + return HTTP_IO_WAITING; + + // Write the ignored text + TCPIP_SMTP_StringPut("This is a multi-part message in MIME format.\r\n"); + TCPIP_SMTP_StringPut("--frontier\r\nContent-type: text/plain\r\n\r\n"); + TCPIP_SMTP_Flush(); + + // Move to the next state + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_BODY); + + case SM_EMAIL_PUT_BODY: + // Write as much body text as is available from the TCP buffer + // return HTTP_IO_NEED_DATA or HTTP_IO_WAITING + // On completion, => PUT_ATTACHMENT_HEADER and continue + + // Check to see if a failure occurred + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // Loop as long as data remains to be read + while(TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle)) + { + // See if space is available to write + len = TCPIP_SMTP_IsPutReady(); + if(len == 0u) + return HTTP_IO_WAITING; + + // See if data is ready to be read + rem = TCPIP_TCP_GetIsReady(sktHTTP); + if(rem == 0u) + return HTTP_IO_NEED_DATA; + + // Only write as much as we can handle + if(len > rem) + len = rem; + if(len > TCPIP_HTTP_MAX_DATA_LEN - 2) + len = TCPIP_HTTP_MAX_DATA_LEN - 2; + + // Read the data from HTTP POST buffer and send it to SMTP + TCPIP_HTTP_CurrentConnectionByteCountDec(connHandle, TCPIP_TCP_ArrayGet(sktHTTP, httpDataBuff, len)); + httpDataBuff[len] = '\0'; + TCPIP_HTTP_URLDecode(httpDataBuff); + TCPIP_SMTP_StringPut((char *)httpDataBuff); + TCPIP_SMTP_Flush(); + } + + // We're done with the POST data, so continue + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_ATTACHMENT_HEADER); + + case SM_EMAIL_PUT_ATTACHMENT_HEADER: + // This section writes the attachment to the message. + // This portion generally will not display in the reader, but + // will be downloadable to the local machine. Use caution + // when selecting the content-type and file name, as certain + // types and extensions are blocked by virus filters. + + // The same structure as the message body is used. + // Any attachment must not include high-bit ASCII characters or + // binary data. If binary data is to be sent, the data should + // be encoded using Base64 and a MIME header should be added: + // Content-transfer-encoding: base64 + + // Check to see if a failure occurred + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // See if we're ready to write data + if(TCPIP_SMTP_IsPutReady() < 100u) + return HTTP_IO_WAITING; + + // Write the attachment header + TCPIP_SMTP_StringPut("\r\n--frontier\r\nContent-type: text/csv\r\nContent-Disposition: attachment; filename=\"status.csv\"\r\n\r\n"); + TCPIP_SMTP_Flush(); + + // Move to the next state + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_ATTACHMENT_DATA_BTNS); + + case SM_EMAIL_PUT_ATTACHMENT_DATA_BTNS: + // The following states output the system status as a CSV file. + + // Check to see if a failure occurred + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // See if we're ready to write data + if(TCPIP_SMTP_IsPutReady() < 36u) + return HTTP_IO_WAITING; + + // Write the header and button strings + TCPIP_SMTP_StringPut("SYSTEM STATUS\r\n"); + TCPIP_SMTP_StringPut("Buttons:,"); + TCPIP_SMTP_Put(BSP_SwitchStateGet(APP_TCPIP_SWITCH_1) + '0'); + TCPIP_SMTP_Put(','); + TCPIP_SMTP_Put(BSP_SwitchStateGet(APP_TCPIP_SWITCH_2) + '0'); + TCPIP_SMTP_Put(','); + TCPIP_SMTP_Put(BSP_SwitchStateGet(APP_TCPIP_SWITCH_3) + '0'); + TCPIP_SMTP_Put('\r'); + TCPIP_SMTP_Put('\n'); + TCPIP_SMTP_Flush(); + + // Move to the next state + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_ATTACHMENT_DATA_LEDS); + + case SM_EMAIL_PUT_ATTACHMENT_DATA_LEDS: + // Check to see if a failure occurred + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // See if we're ready to write data + if(TCPIP_SMTP_IsPutReady() < 30u) + return HTTP_IO_WAITING; + + // Write the header and button strings + TCPIP_SMTP_StringPut("LEDs:,"); + TCPIP_SMTP_Put(BSP_LEDStateGet(APP_TCPIP_LED_1) + '0'); + TCPIP_SMTP_Put(','); + TCPIP_SMTP_Put(BSP_LEDStateGet(APP_TCPIP_LED_2) + '0'); + TCPIP_SMTP_Put(','); + TCPIP_SMTP_Put(BSP_LEDStateGet(APP_TCPIP_LED_3) + '0'); + TCPIP_SMTP_Put('\r'); + TCPIP_SMTP_Put('\n'); + TCPIP_SMTP_Flush(); + + // Move to the next state + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_ATTACHMENT_DATA_POT); + + case SM_EMAIL_PUT_ATTACHMENT_DATA_POT: + // Check to see if a failure occurred + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // See if we're ready to write data + if(TCPIP_SMTP_IsPutReady() < 16u) + return HTTP_IO_WAITING; + + // Display Random Number + len = (uint16_t)SYS_RANDOM_PseudoGet(); + + uitoa(len, (uint8_t *)&httpDataBuff[1]); + + // Write the header and button strings + TCPIP_SMTP_StringPut("Pot:,"); + TCPIP_SMTP_StringPut((char *)(httpDataBuff+1)); + TCPIP_SMTP_Put('\r'); + TCPIP_SMTP_Put('\n'); + TCPIP_SMTP_Flush(); + + // Move to the next state + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_PUT_TERMINATOR); + + case SM_EMAIL_PUT_TERMINATOR: + // This section finishes the message + // This consists of two dashes, the boundary, and two more dashes + // on a single line, followed by a CRLF pair to terminate the message. + + // Check to see if a failure occured + if(!TCPIP_SMTP_IsBusy()) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + return HTTP_IO_WAITING; + } + + // See if we're ready to write data + if(TCPIP_SMTP_IsPutReady() < 16u) + return HTTP_IO_WAITING; + + // Write the ignored text + TCPIP_SMTP_StringPut("--frontier--\r\n"); + TCPIP_SMTP_PutIsDone(); + TCPIP_SMTP_Flush(); + + // Move to the next state + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_EMAIL_FINISHING); + + case SM_EMAIL_FINISHING: + // Wait for status + if(!TCPIP_SMTP_IsBusy()) + { + // Release the module and check success + // Redirect the user based on the result + if(TCPIP_SMTP_UsageEnd() == SMTP_SUCCESS) + lastSuccess = true; + else + lastFailure = true; + + // Redirect to the page + strcpy((char *)httpDataBuff, "/email/index.htm"); + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + return HTTP_IO_DONE; + } + + return HTTP_IO_WAITING; + } + + return HTTP_IO_DONE; +} +#endif // #if defined(TCPIP_STACK_USE_SMTP_CLIENT) + +/**************************************************************************** + Function: + HTTP_IO_RESULT HTTPPostDDNSConfig(HTTP_CONN_HANDLE connHandle) + + Summary: + Parsing and collecting http data received from http form. + + Description: + This routine will be excuted every time the Dynamic DNS Client + configuration form is submitted. The http data is received + as a string of the variables seperated by '&' characters in the TCP RX + buffer. This data is parsed to read the required configuration values, + and those values are populated to the global array (DDNSData) reserved + for this purpose. As the data is read, DDNSPointers is also populated + so that the dynamic DNS client can execute with the new parameters. + + Precondition: + cur HTTP connection is loaded. + + Parameters: + connHandle - HTTP connection handle + + Return Values: + HTTP_IO_DONE - Finished with procedure + HTTP_IO_NEED_DATA - More data needed to continue, call again later + HTTP_IO_WAITING - Waiting for asynchronous process to complete, + call again later + ****************************************************************************/ +#if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) +static HTTP_IO_RESULT HTTPPostDDNSConfig(HTTP_CONN_HANDLE connHandle) +{ + static uint8_t *ptrDDNS; + uint8_t *httpDataBuff; + uint8_t smPost; + + #define SM_DDNS_START (0u) + #define SM_DDNS_READ_NAME (1u) + #define SM_DDNS_READ_VALUE (2u) + #define SM_DDNS_READ_SERVICE (3u) + #define SM_DDNS_DONE (4u) + + #define DDNS_SPACE_REMAINING (sizeof(DDNSData) - (ptrDDNS - DDNSData)) + + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + smPost = TCPIP_HTTP_CurrentConnectionPostSmGet(connHandle); + switch(smPost) + { + // Sets defaults for the system + case SM_DDNS_START: + ptrDDNS = DDNSData; + TCPIP_DDNS_ServiceSet(0); + DDNSClient.Host.szROM = NULL; + DDNSClient.Username.szROM = NULL; + DDNSClient.Password.szROM = NULL; + DDNSClient.ROMPointers.Host = 0; + DDNSClient.ROMPointers.Username = 0; + DDNSClient.ROMPointers.Password = 0; + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, ++smPost); + + // Searches out names and handles them as they arrive + case SM_DDNS_READ_NAME: + // If all parameters have been read, end + if(TCPIP_HTTP_CurrentConnectionByteCountGet(connHandle) == 0u) + { + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_DDNS_DONE); + break; + } + + // Read a name + if(TCPIP_HTTP_PostNameRead(connHandle, httpDataBuff, TCPIP_HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + if(!strcmp((char *)httpDataBuff, (const char *)"service")) + { + // Reading the service (numeric) + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_DDNS_READ_SERVICE); + break; + } + else if(!strcmp((char *)httpDataBuff, (const char *)"user")) + DDNSClient.Username.szRAM = ptrDDNS; + else if(!strcmp((char *)httpDataBuff, (const char *)"pass")) + DDNSClient.Password.szRAM = ptrDDNS; + else if(!strcmp((char *)httpDataBuff, (const char *)"host")) + DDNSClient.Host.szRAM = ptrDDNS; + + // Move to reading the value for user/pass/host + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, ++smPost); + + // Reads in values and assigns them to the DDNS RAM + case SM_DDNS_READ_VALUE: + // Read a name + if(TCPIP_HTTP_PostValueRead(connHandle, ptrDDNS, DDNS_SPACE_REMAINING) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // Move past the data that was just read + ptrDDNS += strlen((char *)ptrDDNS); + if(ptrDDNS < DDNSData + sizeof(DDNSData) - 1) + ptrDDNS += 1; + + // Return to reading names + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_DDNS_READ_NAME); + break; + + // Reads in a service ID + case SM_DDNS_READ_SERVICE: + // Read the integer id + if(TCPIP_HTTP_PostValueRead(connHandle, httpDataBuff, TCPIP_HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE) + return HTTP_IO_NEED_DATA; + + // Convert to a service ID + TCPIP_DDNS_ServiceSet((uint8_t)atol((char *)httpDataBuff)); + + // Return to reading names + TCPIP_HTTP_CurrentConnectionPostSmSet(connHandle, SM_DDNS_READ_NAME); + break; + + // Sets up the DDNS client for an update + case SM_DDNS_DONE: + // Since user name and password changed, force an update immediately + TCPIP_DDNS_UpdateForce(); + + // Redirect to prevent POST errors + lastSuccess = true; + strcpy((char *)httpDataBuff, "/dyndns/index.htm"); + TCPIP_HTTP_CurrentConnectionStatusSet(connHandle, HTTP_REDIRECT); + return HTTP_IO_DONE; + } + + return HTTP_IO_WAITING; // Assume we're waiting to process more data +} +#endif // defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + +#endif // defined(TCPIP_HTTP_USE_POST) + +/**************************************************************************** + Section: + Dynamic Variable Callback Functions + ****************************************************************************/ + +/**************************************************************************** + Function: + void TCPIP_HTTP_Print_varname(void) + + Internal: + See documentation in the TCP/IP Stack API or HTTP.h for details. + ****************************************************************************/ +void TCPIP_HTTP_Print_builddate(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP; + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0x01); + if(TCPIP_TCP_PutIsReady(sktHTTP) < strlen((const char *)__DATE__" "__TIME__)) + return; + + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0x00); + TCPIP_TCP_StringPut(sktHTTP, (const void *)__DATE__" "__TIME__); +} + +void TCPIP_HTTP_Print_version(HTTP_CONN_HANDLE connHandle) +{ + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (const void *)TCPIP_STACK_VERSION_STR); +} + +const uint8_t HTML_UP_ARROW[] = "up"; +const uint8_t HTML_DOWN_ARROW[] = "dn"; +void TCPIP_HTTP_Print_btn(HTTP_CONN_HANDLE connHandle, uint16_t num) +{ + // Determine which button + switch(num) + { + case 0: + num = BSP_SwitchStateGet(APP_TCPIP_SWITCH_1); + break; + case 1: + num = BSP_SwitchStateGet(APP_TCPIP_SWITCH_2); + break; + case 2: + num = BSP_SwitchStateGet(APP_TCPIP_SWITCH_3); + break; + default: + num = 0; + } + + // Print the output + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (num?HTML_UP_ARROW:HTML_DOWN_ARROW)); +} + +void TCPIP_HTTP_Print_led(HTTP_CONN_HANDLE connHandle, uint16_t num) +{ + // Determine which LED + switch(num) + { + case 0: + // This is a temporary work-around +#if defined(EX16) + num = BSP_LEDStateGet(APP_TCPIP_LED_1); +#else + num = BSP_LEDStateGet(APP_TCPIP_LED_3); +#endif + break; + case 1: + num = BSP_LEDStateGet(APP_TCPIP_LED_2); + break; + case 2: + num = BSP_LEDStateGet(APP_TCPIP_LED_3); + break; + default: + num = 0; + } + + // Print the output + TCPIP_TCP_Put(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (num?'1':'0')); +} + +void TCPIP_HTTP_Print_ledSelected(HTTP_CONN_HANDLE connHandle, uint16_t num, uint16_t state) +{ + // Determine which LED to check + switch(num) + { + case 0: + num = BSP_LEDStateGet(APP_TCPIP_LED_1); + break; + case 1: + num = BSP_LEDStateGet(APP_TCPIP_LED_2); + break; + case 2: + num = BSP_LEDStateGet(APP_TCPIP_LED_3); + break; + default: + num = 0; + } + + // Print output if true and ON or if false and OFF + if((state && num) || (!state && !num)) + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (const uint8_t *)"SELECTED"); +} + +void TCPIP_HTTP_Print_pot(HTTP_CONN_HANDLE connHandle) +{ + uint8_t AN0String[8]; + uint16_t ADval; + + ADval = (uint16_t)SYS_RANDOM_PseudoGet(); + + uitoa(ADval, (uint8_t *)AN0String); + + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), AN0String); +} + +void TCPIP_HTTP_Print_drive(HTTP_CONN_HANDLE connHandle) +{ + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (const void *)SYS_FS_DRIVE); +} + +void TCPIP_HTTP_Print_fstype(HTTP_CONN_HANDLE connHandle) +{ + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (const void *)SYS_FS_MPFS_STRING); +} + +void TCPIP_HTTP_Print_hellomsg(HTTP_CONN_HANDLE connHandle) +{ + const uint8_t *ptr; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + ptr = TCPIP_HTTP_ArgGet(TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle), (const uint8_t *)"name"); + // We omit checking for space because this is the only data being written + if(ptr != NULL) + { + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"Hello, "); + TCPIP_TCP_StringPut(sktHTTP, ptr); + } +} + +void TCPIP_HTTP_Print_cookiename(HTTP_CONN_HANDLE connHandle) +{ + const uint8_t *ptr; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + ptr = TCPIP_HTTP_ArgGet(TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle), (const uint8_t *)"name"); + if(ptr) + TCPIP_TCP_StringPut(sktHTTP, ptr); + else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"not set"); +} + +void TCPIP_HTTP_Print_cookiefav(HTTP_CONN_HANDLE connHandle) +{ + const uint8_t *ptr; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + ptr = TCPIP_HTTP_ArgGet(TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle), (const uint8_t *)"fav"); + if(ptr) + TCPIP_TCP_StringPut(sktHTTP, ptr); + else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"not set"); +} + +void TCPIP_HTTP_Print_uploadedmd5(HTTP_CONN_HANDLE connHandle) +{ + uint8_t i; + uint8_t *httpDataBuff; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + // Set a flag to indicate not finished + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 1); + + // Make sure there's enough output space + if(TCPIP_TCP_PutIsReady(sktHTTP) < 32u + 37u + 5u) + return; + + // Check for flag set in HTTPPostMD5 +#if defined(HTTP_APP_USE_MD5) + if(TCPIP_HTTP_CurrentConnectionPostSmGet(connHandle) != SM_MD5_POST_COMPLETE) +#endif + {// No file uploaded, so just return + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"Upload a File"); + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0); + return; + } + + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"Uploaded File's MD5 was:
"); + httpDataBuff = TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle); + + // Write a byte of the md5 sum at a time + for(i = 0; i < 16u; i++) + { + TCPIP_TCP_Put(sktHTTP, btohexa_high(httpDataBuff[i])); + TCPIP_TCP_Put(sktHTTP, btohexa_low(httpDataBuff[i])); + if((i & 0x03) == 3u) + TCPIP_TCP_Put(sktHTTP, ' '); + } + + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0x00); +} + +void TCPIP_HTTP_Print_config_hostname(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + TCPIP_TCP_StringPut(sktHTTP, (uint8_t *)TCPIP_STACK_NetBIOSName(TCPIP_TCP_SocketNetGet(sktHTTP))); +} + +void TCPIP_HTTP_Print_config_dhcpchecked(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + if(TCPIP_DHCP_IsEnabled(TCPIP_TCP_SocketNetGet(sktHTTP))) + { + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"checked"); + } +} + +void TCPIP_HTTP_Print_config_ip(HTTP_CONN_HANDLE connHandle) +{ + IPV4_ADDR ipAddress; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_NET_HANDLE netH = TCPIP_TCP_SocketNetGet(sktHTTP); + + ipAddress.Val = TCPIP_STACK_NetAddress(netH); + if (TCPIP_Helper_IPAddressToString(&ipAddress, (char *)s_buf_ipv4addr, HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE)) + { + TCPIP_TCP_StringPut(sktHTTP, s_buf_ipv4addr); + } +} + +void TCPIP_HTTP_Print_config_gw(HTTP_CONN_HANDLE connHandle) // gateway +{ + IPV4_ADDR gwAddress; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_NET_HANDLE netH = TCPIP_TCP_SocketNetGet(sktHTTP); + + gwAddress.Val = TCPIP_STACK_NetAddressGateway(netH); + if (TCPIP_Helper_IPAddressToString(&gwAddress, (char *)s_buf_ipv4addr, HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE)) + { + TCPIP_TCP_StringPut(sktHTTP, s_buf_ipv4addr); + } +} + +void TCPIP_HTTP_Print_config_subnet(HTTP_CONN_HANDLE connHandle) +{ + IPV4_ADDR ipMask; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_NET_HANDLE netH = TCPIP_TCP_SocketNetGet(sktHTTP); + + ipMask.Val = TCPIP_STACK_NetMask(netH); + if (TCPIP_Helper_IPAddressToString(&ipMask, (char *)s_buf_ipv4addr, HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE)) + { + TCPIP_TCP_StringPut(sktHTTP, s_buf_ipv4addr); + } +} + +void TCPIP_HTTP_Print_config_dns1(HTTP_CONN_HANDLE connHandle) +{ + IPV4_ADDR priDnsAddr; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_NET_HANDLE netH = TCPIP_TCP_SocketNetGet(sktHTTP); + + priDnsAddr.Val = TCPIP_STACK_NetAddressDnsPrimary(netH); + if (TCPIP_Helper_IPAddressToString(&priDnsAddr, (char *)s_buf_ipv4addr, HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE)) + { + TCPIP_TCP_StringPut(sktHTTP, s_buf_ipv4addr); + } +} + +void TCPIP_HTTP_Print_config_dns2(HTTP_CONN_HANDLE connHandle) +{ + IPV4_ADDR secondDnsAddr; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_NET_HANDLE netH = TCPIP_TCP_SocketNetGet(sktHTTP); + + secondDnsAddr.Val = TCPIP_STACK_NetAddressDnsSecond(netH); + if (TCPIP_Helper_IPAddressToString(&secondDnsAddr, (char *)s_buf_ipv4addr, HTTP_APP_IPV4_ADDRESS_BUFFER_SIZE)) + { + TCPIP_TCP_StringPut(sktHTTP, s_buf_ipv4addr); + } +} + +void TCPIP_HTTP_Print_config_mac(HTTP_CONN_HANDLE connHandle) +{ + uint8_t i; + TCP_SOCKET sktHTTP; + TCPIP_NET_HANDLE hNet; + const uint8_t *pMacAdd; + + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + if(TCPIP_TCP_PutIsReady(sktHTTP) < 18u) + { // need 17 bytes to write a MAC + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0x01); + return; + } + + hNet = TCPIP_TCP_SocketNetGet(sktHTTP); + pMacAdd = TCPIP_STACK_NetAddressMac(hNet); + // Write each byte + for(i = 0; i < 6u; i++) + { + if(i) + TCPIP_TCP_Put(sktHTTP, ':'); + TCPIP_TCP_Put(sktHTTP, btohexa_high(pMacAdd[i])); + TCPIP_TCP_Put(sktHTTP, btohexa_low(pMacAdd[i])); + } + + // Indicate that we're done + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0x00); + return; +} + +// SNMP Read communities configuration page +void TCPIP_HTTP_Print_read_comm(HTTP_CONN_HANDLE connHandle, uint16_t num) +{ +#if defined(TCPIP_STACK_USE_SNMP_SERVER) + uint8_t dest[TCPIP_SNMP_COMMUNITY_MAX_LEN+1]; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + // Ensure no one tries to read illegal memory addresses by specifying + // illegal num values. + if(num >= TCPIP_SNMP_MAX_COMMUNITY_SUPPORT) + return; + memset(dest,0,sizeof(dest)); + if(TCPIP_SNMP_ReadCommunityGet(num,TCPIP_SNMP_COMMUNITY_MAX_LEN,dest) != true) + return; + // Send proper string + TCPIP_TCP_StringPut(sktHTTP,dest); +#endif +} + +// SNMP Write communities configuration page +void TCPIP_HTTP_Print_write_comm(HTTP_CONN_HANDLE connHandle, uint16_t num) +{ +#if defined(TCPIP_STACK_USE_SNMP_SERVER) + uint8_t dest[TCPIP_SNMP_COMMUNITY_MAX_LEN+1]; + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + // Ensure no one tries to read illegal memory addresses by specifying + // illegal num values. + if(num >= TCPIP_SNMP_MAX_COMMUNITY_SUPPORT) + return; + memset(dest,0,sizeof(dest)); + // Send proper string + if(TCPIP_SNMP_WriteCommunityGet(num,TCPIP_SNMP_COMMUNITY_MAX_LEN,dest) != true) + return; + TCPIP_TCP_StringPut(sktHTTP,dest); +#endif +} + +void TCPIP_HTTP_Print_reboot(HTTP_CONN_HANDLE connHandle) +{ + // This is not so much a print function, but causes the interface to restart + // when the configuration is changed. If called via an AJAX call, this + // will gracefully restart the interface and bring it back online immediately + if(httpNetData.currNet != 0) + { // valid data + httpNetData.netConfig.interface = httpNetData.ifName; + httpNetData.netConfig.hostName = httpNetData.nbnsName; + httpNetData.netConfig.macAddr = httpNetData.ifMacAddr; + httpNetData.netConfig.ipAddr = httpNetData.ipAddr; + httpNetData.netConfig.ipMask = httpNetData.ipMask; + httpNetData.netConfig.gateway = httpNetData.gwIP; + httpNetData.netConfig.priDNS = httpNetData.dns1IP; + httpNetData.netConfig.secondDNS = httpNetData.dns2IP; + httpNetData.netConfig.powerMode = TCPIP_STACK_IF_POWER_FULL; + // httpNetData.netConfig.startFlags should be already set; + httpNetData.netConfig.pMacObject = TCPIP_STACK_MACObjectGet(httpNetData.currNet); + + TCPIP_STACK_NetDown(httpNetData.currNet); + TCPIP_STACK_NetUp(httpNetData.currNet, &httpNetData.netConfig); + } +} + +void TCPIP_HTTP_Print_rebootaddr(HTTP_CONN_HANDLE connHandle) +{ // This is the expected address of the board upon rebooting + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), TCPIP_HTTP_CurrentConnectionDataBufferGet(connHandle)); +} + +void TCPIP_HTTP_Print_ddns_user(HTTP_CONN_HANDLE connHandle) +{ + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + uint32_t callbackPos; + + if(DDNSClient.ROMPointers.Username || !DDNSClient.Username.szRAM) + return; + + callbackPos = TCPIP_HTTP_CurrentConnectionCallbackPosGet(connHandle); + if(callbackPos == 0x00u) + callbackPos = (uint32_t)DDNSClient.Username.szRAM; + callbackPos = (uint32_t)TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (uint8_t *)callbackPos); + if(*(uint8_t *)callbackPos == '\0') + callbackPos = 0x00; + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, callbackPos); + #endif +} + +void TCPIP_HTTP_Print_ddns_pass(HTTP_CONN_HANDLE connHandle) +{ + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + uint32_t callbackPos; + + if(DDNSClient.ROMPointers.Password || !DDNSClient.Password.szRAM) + return; + + callbackPos = TCPIP_HTTP_CurrentConnectionCallbackPosGet(connHandle); + + if(callbackPos == 0x00u) + callbackPos = (uint32_t)DDNSClient.Password.szRAM; + callbackPos = (uint32_t)TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (uint8_t *)callbackPos); + if(*(uint8_t *)callbackPos == '\0') + callbackPos = 0x00; + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, callbackPos); + #endif +} + +void TCPIP_HTTP_Print_ddns_host(HTTP_CONN_HANDLE connHandle) +{ + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + uint32_t callbackPos; + + if(DDNSClient.ROMPointers.Host || !DDNSClient.Host.szRAM) + return; + callbackPos = TCPIP_HTTP_CurrentConnectionCallbackPosGet(connHandle); + if(callbackPos == 0x00u) + callbackPos = (uint32_t)DDNSClient.Host.szRAM; + callbackPos = (uint32_t)TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (uint8_t *)callbackPos); + if(*(uint8_t *)callbackPos == '\0') + callbackPos = 0x00; + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, callbackPos); + #endif +} + +void TCPIP_HTTP_Print_ddns_service(HTTP_CONN_HANDLE connHandle, uint16_t i) +{ + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + if(!DDNSClient.ROMPointers.UpdateServer || !DDNSClient.UpdateServer.szROM) + return; + if((const char *)DDNSClient.UpdateServer.szROM == ddnsServiceHosts[i]) + TCPIP_TCP_StringPut(TCPIP_HTTP_CurrentConnectionSocketGet(connHandle), (const uint8_t *)"selected"); + #endif +} + +void TCPIP_HTTP_Print_ddns_status(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + DDNS_STATUS s; + s = TCPIP_DDNS_LastStatusGet(); + if(s == DDNS_STATUS_GOOD || s == DDNS_STATUS_UNCHANGED || s == DDNS_STATUS_NOCHG) + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"ok"); + else if(s == DDNS_STATUS_UNKNOWN) + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"unk"); + else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"fail"); + #else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"fail"); + #endif +} + +void TCPIP_HTTP_Print_ddns_status_msg(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + if(TCPIP_TCP_PutIsReady(sktHTTP) < 75u) + { + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0x01); + return; + } + + #if defined(TCPIP_STACK_USE_DYNAMICDNS_CLIENT) + switch(TCPIP_DDNS_LastStatusGet()) + { + case DDNS_STATUS_GOOD: + case DDNS_STATUS_NOCHG: + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"The last update was successful."); + break; + case DDNS_STATUS_UNCHANGED: + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"The IP has not changed since the last update."); + break; + case DDNS_STATUS_UPDATE_ERROR: + case DDNS_STATUS_CHECKIP_ERROR: + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"Could not communicate with DDNS server."); + break; + case DDNS_STATUS_INVALID: + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"The current configuration is not valid."); + break; + case DDNS_STATUS_UNKNOWN: + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"The Dynamic DNS client is pending an update."); + break; + default: + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"An error occurred during the update.
The DDNS Client is suspended."); + break; + } + #else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"The Dynamic DNS Client is not enabled."); + #endif + + TCPIP_HTTP_CurrentConnectionCallbackPosSet(connHandle, 0); +} + +void TCPIP_HTTP_Print_smtps_en(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"none"); +} + +void TCPIP_HTTP_Print_snmp_en(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + #if defined(TCPIP_STACK_USE_SNMP_SERVER) + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"none"); + #else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"block"); + #endif +} + +void TCPIP_HTTP_Print_status_ok(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + if(lastSuccess) + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"block"); + else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"none"); + lastSuccess = false; +} + +void TCPIP_HTTP_Print_status_fail(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + + if(lastFailure) + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"block"); + else + TCPIP_TCP_StringPut(sktHTTP, (const uint8_t *)"none"); + lastFailure = false; +} + +#endif // #if defined(TCPIP_STACK_USE_HTTP_SERVER) diff --git a/software/aws-iot-ethernet/firmware/src/http_print.c b/software/aws-iot-ethernet/firmware/src/http_print.c new file mode 100644 index 0000000..3ab98c7 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/http_print.c @@ -0,0 +1,79 @@ +/********************************************************************* + * File Name: http_print.c + * + * Provides callback headers and resolution for user's custom + * HTTP Application. + * + * This file is automatically generated by the MPFS Utility + * ALL MODIFICATIONS WILL BE OVERWRITTEN BY THE MPFS GENERATOR + * + * Software License Agreement + * + * Copyright (C) 2012 Microchip Technology Inc. All rights + * reserved. + * Microchip licenses to you the right to use, modify, copy, and distribute + * software only embedded on a Microchip microcontroller or digital signal + * controller that is integrated into your product or third party product + * (pursuant to the sublicense terms in the accompanying license agreement) + + * You should refer to the license agreement accompanying this + * Software for additional information regarding your rights and + * obligations. + * + * You should refer to the license agreement accompanying this + * Software for additional information regarding your rights and + * obligations. + * + * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT + * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT + * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF + * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS + * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE + * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER + * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT + * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE. + * + *********************************************************************/ + +#include "tcpip/tcpip.h" + +void TCPIP_HTTP_Print(HTTP_CONN_HANDLE connHandle,uint32_t callbackID); +void TCPIP_HTTP_Print_remoteServer(HTTP_CONN_HANDLE connHandle); +void TCPIP_HTTP_Print_uuid(HTTP_CONN_HANDLE connHandle); + +void TCPIP_HTTP_Print(HTTP_CONN_HANDLE connHandle,uint32_t callbackID) +{ +TCP_SOCKET sktHTTP; + switch(callbackID) + { + case 0x00000000: + TCPIP_HTTP_FileInclude(connHandle,(const uint8_t*)"header.inc"); + break; + case 0x00000001: + TCPIP_HTTP_FileInclude(connHandle,(const uint8_t*)"footer.inc"); + break; + case 0x00000002: + TCPIP_HTTP_Print_remoteServer(connHandle); + break; + case 0x00000003: + TCPIP_HTTP_Print_uuid(connHandle); + break; + default: + // Output notification for undefined values + sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_TCP_ArrayPut(sktHTTP, (const uint8_t*)"!DEF", 4); + } + + return; +} + +void TCPIP_HTTP_Print_(HTTP_CONN_HANDLE connHandle) +{ + TCP_SOCKET sktHTTP = TCPIP_HTTP_CurrentConnectionSocketGet(connHandle); + TCPIP_TCP_Put(sktHTTP, '~'); + return; +} + diff --git a/software/aws-iot-ethernet/firmware/src/http_print.idx b/software/aws-iot-ethernet/firmware/src/http_print.idx new file mode 100644 index 0000000..b634476 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/http_print.idx @@ -0,0 +1,4 @@ ++inc:header.inc ++inc:footer.inc ++remoteServer ++uuid diff --git a/software/aws-iot-ethernet/firmware/src/main.c b/software/aws-iot-ethernet/firmware/src/main.c new file mode 100644 index 0000000..50de2fd --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/main.c @@ -0,0 +1,92 @@ +/******************************************************************************* + MPLAB Harmony Project Main Source File + + Company: + Microchip Technology Inc. + + File Name: + main.c + + Summary: + This file contains the "main" function for an MPLAB Harmony project. + + Description: + This file contains the "main" function for an MPLAB Harmony project. The + "main" function calls the "SYS_Initialize" function to initialize the state + machines of all MPLAB Harmony modules in the system and it calls the + "SYS_Tasks" function from within a system-wide "super" loop to maintain + their correct operation. These two functions are implemented in + configuration-specific files (usually "system_init.c" and "system_tasks.c") + in a configuration-specific folder under the "src/system_config" folder + within this project's top-level folder. An MPLAB Harmony project may have + more than one configuration, each contained within it's own folder under + the "system_config" folder. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +//Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include // Defines NULL +#include // Defines true +#include // Defines EXIT_FAILURE +#include "system/common/sys_module.h" // SYS function prototypes + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Main Entry Point +// ***************************************************************************** +// ***************************************************************************** + +int main ( void ) +{ + /* Initialize all MPLAB Harmony modules, including application(s). */ + SYS_Initialize ( NULL ); + + + while ( true ) + { + /* Maintain state machines of all polled MPLAB Harmony modules. */ + SYS_Tasks ( ); + + } + + /* Execution should not come here during normal operation */ + + return ( EXIT_FAILURE ); +} + + +/******************************************************************************* + End of File +*/ + diff --git a/software/aws-iot-ethernet/firmware/src/mpfs_img2.c b/software/aws-iot-ethernet/firmware/src/mpfs_img2.c new file mode 100644 index 0000000..3b91126 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/mpfs_img2.c @@ -0,0 +1,587 @@ +/*************************************************************** + * File Name: mpfs_img2.c + * Description: Defines an MPFS2 image to be stored in program memory. + * Processor: PIC32 + * Compiler: Microchip C32,XC32 + * + * NOT FOR HAND MODIFICATION + * This file is automatically generated by the MPFS2 Utility + * ALL MODIFICATIONS WILL BE OVERWRITTEN BY THE MPFS2 GENERATOR + * Generated Mon Apr 11 2016 04:12:23 + * + * Software License Agreement + * + * Copyright (C) 2012 Microchip Technology Inc. All rights + * reserved. + * + * Microchip licenses to you the right to use, modify, copy, and distribute + * software only embedded on a Microchip microcontroller or digital signal + * controller that is integrated into your product or third party product + * (pursuant to the sublicense terms in the accompanying license agreement) + + * You should refer to the license agreement accompanying this + * Software for additional information regarding your rights and + * obligations. + * + * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT + * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT + * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF + * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS + * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE + * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER + * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT + * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE. + * + ***************************************************************/ +#include +#include "system_config.h" + +/************************************** + * MPFS2 Image Data + **************************************/ + +const uint8_t __attribute__((space(prog),address(DRV_NVM_MEDIA_START_ADDRESS))) __attribute__ ((keep)) NVM_MEDIA_DATA[DRV_NVM_MEDIA_SIZE*1024] = { \ + 0x4d,0x50,0x46,0x53,0x02,0x01,0x0b,0x00,0xf0,0x94,0xca,0xa7,0xf0,0xd6,0x26,0x4f, /* MPFS..........&O */ \ + 0x26,0x2d,0x0a,0xa3,0x8a,0x10,0x3e,0x46,0x08,0x71,0x2a,0x1c,0x2a,0xc1,0x10,0x01, /* &-....>F.q...... */ \ + 0x00,0x00,0xa2,0x01,0x00,0x00,0x3c,0x00,0x00,0x00,0x57,0x2f,0x0c,0x57,0x00,0x00, /* ......<...W/.W.. */ \ + 0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0xde,0x01,0x00,0x00,0xfc,0x00,0x00,0x00, /* ................ */ \ + 0xfc,0x1a,0x7a,0x55,0x00,0x00,0x00,0x00,0x01,0x00,0x26,0x01,0x00,0x00,0xda,0x02, /* ..zU......&..... */ \ + 0x00,0x00,0x18,0x00,0x00,0x00,0x57,0x2f,0x0c,0x57,0x00,0x00,0x00,0x00,0x00,0x00, /* ......W/.W...... */ \ + 0x33,0x01,0x00,0x00,0xf2,0x02,0x00,0x00,0x6b,0x00,0x00,0x00,0xa0,0x2c,0x0c,0x57, /* 3.......k....,.W */ \ + 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x5d,0x03,0x00,0x00,0x56,0x02, /* ......>...]...V. */ \ + 0x00,0x00,0xb5,0x2c,0x0c,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00, /* ...,.W......I... */ \ + 0xb3,0x05,0x00,0x00,0x1a,0x04,0x00,0x00,0xdb,0x2d,0x0c,0x57,0x00,0x00,0x00,0x00, /* .........-.W.... */ \ + 0x02,0x00,0x53,0x01,0x00,0x00,0xcd,0x09,0x00,0x00,0x78,0x01,0x00,0x00,0x53,0x2f, /* ..S.......x...S/ */ \ + 0x0c,0x57,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x45,0x0b,0x00,0x00, /* .W......a...E... */ \ + 0x74,0x0a,0x00,0x00,0x0d,0x39,0xf0,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x74,0x01, /* t....9.V......t. */ \ + 0x00,0x00,0xb9,0x15,0x00,0x00,0xe2,0x04,0x00,0x00,0xfc,0x1a,0x7a,0x55,0x00,0x00, /* ............zU.. */ \ + 0x00,0x00,0x01,0x00,0x84,0x01,0x00,0x00,0x9b,0x1a,0x00,0x00,0x80,0x02,0x00,0x00, /* ................ */ \ + 0xfc,0x1a,0x7a,0x55,0x00,0x00,0x00,0x00,0x01,0x00,0x95,0x01,0x00,0x00,0x1b,0x1d, /* ..zU............ */ \ + 0x00,0x00,0x0a,0x03,0x00,0x00,0xfc,0x1a,0x7a,0x55,0x00,0x00,0x00,0x00,0x01,0x00, /* ........zU...... */ \ + 0x44,0x79,0x6e,0x52,0x63,0x72,0x64,0x2e,0x62,0x69,0x6e,0x00,0x65,0x72,0x72,0x6f, /* DynRcrd.bin.erro */ \ + 0x72,0x2e,0x68,0x74,0x6d,0x00,0x46,0x69,0x6c,0x65,0x52,0x63,0x72,0x64,0x2e,0x62, /* r.htm.FileRcrd.b */ \ + 0x69,0x6e,0x00,0x66,0x6f,0x6f,0x74,0x65,0x72,0x2e,0x69,0x6e,0x63,0x00,0x68,0x65, /* in.footer.inc.he */ \ + 0x61,0x64,0x65,0x72,0x2e,0x69,0x6e,0x63,0x00,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68, /* ader.inc.index.h */ \ + 0x74,0x6d,0x00,0x72,0x65,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x2e,0x68,0x74,0x6d, /* tm.reconnect.htm */ \ + 0x00,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x2f,0x6d,0x63,0x68,0x70, /* .javascript/mchp */ \ + 0x2e,0x6a,0x73,0x00,0x69,0x6d,0x61,0x67,0x65,0x73,0x2f,0x6d,0x63,0x68,0x70,0x2e, /* .js.images/mchp. */ \ + 0x67,0x69,0x66,0x00,0x63,0x73,0x73,0x2f,0x6d,0x63,0x68,0x70,0x2d,0x6d,0x69,0x6e, /* gif.css/mchp-min */ \ + 0x2e,0x63,0x73,0x73,0x00,0x63,0x73,0x73,0x2f,0x6d,0x63,0x68,0x70,0x2e,0x63,0x73, /* .css.css/mchp.cs */ \ + 0x73,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* s............... */ \ + 0x08,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x02,0x00,0x00,0x00, /* ........&....... */ \ + 0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x01, /* ..............@. */ \ + 0x00,0x00,0x03,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x1f,0x8b, /* ......f......... */ \ + 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x8e,0x41,0x4f,0x83,0x40,0x10,0x85, /* ........E.AO.@.. */ \ + 0xef,0x26,0xfe,0x87,0x71,0xef,0x30,0x36,0xad,0x49,0xd5,0x85,0x83,0x80,0xd1,0xa4, /* .&..q.06.I...... */ \ + 0xd5,0xa6,0xc1,0x18,0x8f,0x08,0x43,0x77,0x93,0xc2,0xe2,0x32,0x88,0xfd,0xf7,0x02, /* ......Cw...2.... */ \ + 0xab,0x65,0x2e,0x33,0x6f,0x5e,0xe6,0x9b,0x27,0xaf,0xe2,0xd7,0x28,0xfd,0xd8,0x25, /* .e.3o^..'...(..% */ \ + 0xf0,0x94,0x6e,0x37,0xb0,0x7b,0x7b,0xd8,0x3c,0x47,0x20,0x3c,0xc4,0xf7,0x65,0x84, /* ..n7.{{.Copyright &co */ \ + 0x70,0x79,0x3b,0x20,0x32,0x30,0x31,0x35,0x20,0x4d,0x69,0x63,0x72,0x6f,0x63,0x68, /* py; 2015 Microch */ \ + 0x69,0x70,0x20,0x54,0x65,0x63,0x68,0x6e,0x6f,0x6c,0x6f,0x67,0x79,0x2c,0x20,0x49, /* ip Technology, I */ \ + 0x6e,0x63,0x2e,0x20,0x56,0x65,0x72,0x20,0x31,0x2e,0x30,0x2e,0x30,0x3c,0x2f,0x64, /* nc. Ver 1.0.0..
..
....< */ \ + 0x68,0x74,0x6d,0x6c,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3d,0x22,0x68,0x74,0x74,0x70, /* html xmlns="http */ \ + 0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,0x39, /* ://www.w3.org/19 */ \ + 0x39,0x39,0x2f,0x78,0x68,0x74,0x6d,0x6c,0x22,0x20,0x78,0x6d,0x6c,0x3a,0x6c,0x61, /* 99/xhtml" xml:la */ \ + 0x6e,0x67,0x3d,0x22,0x65,0x6e,0x22,0x20,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x65,0x6e, /* ng="en" lang="en */ \ + 0x22,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x74,0x69,0x74, /* ">....Microchip IoT */ \ + 0x20,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x44,0x65,0x76,0x65,0x6c,0x6f, /* Ethernet Develo */ \ + 0x70,0x6d,0x65,0x6e,0x74,0x20,0x4b,0x69,0x74,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65, /* pment Kit......~inc: */ \ + 0x66,0x6f,0x6f,0x74,0x65,0x72,0x2e,0x69,0x6e,0x63,0x7e,0x0d,0x0a,0x7e,0x69,0x6e, /* footer.inc~..~in */ \ + 0x63,0x3a,0x68,0x65,0x61,0x64,0x65,0x72,0x2e,0x69,0x6e,0x63,0x7e,0x0d,0x0a,0x3c, /* c:header.inc~..< */ \ + 0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22, /* div id="content" */ \ + 0x3e,0x0d,0x0a,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x72, /* >..
..

Connecti */ \ + 0x6e,0x67,0x20,0x74,0x6f,0x20,0x73,0x65,0x72,0x76,0x65,0x72,0x2e,0x2e,0x2e,0x3c, /* ng to server...< */ \ + 0x2f,0x68,0x32,0x3e,0x0d,0x0a,0x0d,0x0a,0x3c,0x70,0x3e,0x54,0x68,0x65,0x20,0x49, /* /h2>....

The I */ \ + 0x6f,0x54,0x20,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x62,0x6f,0x61,0x72, /* oT Ethernet boar */ \ + 0x64,0x20,0x69,0x73,0x20,0x6e,0x6f,0x77,0x20,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74, /* d is now connect */ \ + 0x69,0x6e,0x67,0x20,0x74,0x6f,0x20,0x79,0x6f,0x75,0x72,0x20,0x41,0x57,0x53,0x20, /* ing to your AWS */ \ + 0x49,0x6f,0x54,0x20,0x45,0x6e,0x64,0x70,0x6f,0x69,0x6e,0x74,0x3c,0x2f,0x70,0x3e, /* IoT Endpoint

*/ \ + 0x0d,0x0a,0x0d,0x0a,0x3c,0x70,0x3e,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x74, /* ....

This is t */ \ + 0x68,0x65,0x20,0x73,0x65,0x72,0x76,0x65,0x72,0x20,0x79,0x6f,0x75,0x20,0x65,0x6e, /* he server you en */ \ + 0x74,0x65,0x72,0x65,0x64,0x20,0x61,0x6e,0x64,0x20,0x79,0x6f,0x75,0x72,0x20,0x62, /* tered and your b */ \ + 0x6f,0x61,0x72,0x64,0x27,0x73,0x20,0x55,0x55,0x49,0x44,0x3a,0x3c,0x2f,0x70,0x3e, /* oard's UUID:

*/ \ + 0x0d,0x0a,0x3c,0x75,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x6c,0x69,0x3e,0x3c,0x62,0x3e, /* ..
    ...
  • */ \ + 0x41,0x57,0x53,0x20,0x49,0x6f,0x54,0x20,0x45,0x6e,0x64,0x70,0x6f,0x69,0x6e,0x74, /* AWS IoT Endpoint */ \ + 0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x7e,0x72,0x65,0x6d,0x6f,0x74,0x65,0x53,0x65,0x72, /* : ~remoteSer */ \ + 0x76,0x65,0x72,0x7e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x3c,0x6c,0x69,0x3e, /* ver~
  • ...
  • */ \ + 0x3c,0x62,0x3e,0x55,0x55,0x49,0x44,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x7e,0x75,0x75, /* UUID: ~uu */ \ + 0x69,0x64,0x7e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x3c,0x2f,0x75,0x6c,0x3e,0x0d, /* id~
  • ..
. */ \ + 0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d, /* .

... */ \ + 0x0a,0x0d,0x0a,0x7e,0x69,0x6e,0x63,0x3a,0x66,0x6f,0x6f,0x74,0x65,0x72,0x2e,0x69, /* ...~inc:footer.i */ \ + 0x6e,0x63,0x7e,0x0d,0x0a,0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5, /* nc~............. */ \ + 0x58,0xed,0x72,0xdb,0xc6,0x15,0xfd,0x4d,0xcf,0xf8,0x1d,0x6e,0x39,0x9d,0x88,0xcc, /* X.r....M...n9... */ \ + 0x50,0x24,0xa5,0xc4,0x69,0x6b,0x8d,0x92,0x81,0x48,0x48,0x82,0x4b,0x11,0x2a,0x09, /* P$..ik...HH.K... */ \ + 0xd9,0x56,0x13,0xb7,0x03,0x02,0x4b,0x72,0x2d,0x10,0x8b,0xe0,0x43,0x0a,0x9b,0xa8, /* .V....Kr-...C... */ \ + 0x0f,0xd1,0xe4,0x25,0xfa,0x96,0x3d,0x77,0x17,0x20,0x41,0x49,0x76,0x33,0xa9,0xff, /* ...%..=w. AIv3.. */ \ + 0x54,0x33,0x02,0x40,0xec,0xde,0x73,0x3f,0xf6,0xee,0xb9,0x77,0xf1,0xfc,0x59,0xef, /* T3.@..s?...w..Y. */ \ + 0xf3,0x4f,0xf1,0xf7,0xfc,0x19,0x7d,0x4e,0x17,0x32,0x48,0x55,0xb0,0x94,0x09,0x79, /* .O....}N.2HU...y */ \ + 0x83,0xcb,0x9e,0x73,0x49,0xd3,0xdc,0x0f,0x6e,0xe8,0x95,0x7f,0xeb,0x67,0x41,0x2a, /* ...sI...n....gA. */ \ + 0x93,0x9c,0x46,0x72,0x96,0xfa,0xe9,0x9a,0x67,0x7f,0x32,0xb5,0x5a,0xf5,0x54,0xcd, /* ..Fr....g.2.Z.T. */ \ + 0xf3,0x3b,0x3f,0x15,0xd0,0x10,0x88,0x38,0x13,0x64,0x2d,0x52,0x21,0x56,0x22,0xce, /* .;?....8.d-R!V". */ \ + 0x37,0x53,0x06,0x2a,0x59,0xa7,0x72,0xb1,0xcc,0xe9,0xdf,0x74,0xd8,0xef,0x1f,0xee, /* 7S..Y.r....t.... */ \ + 0x1f,0xf6,0x0f,0xfa,0x75,0x9b,0x45,0xb0,0x8c,0x55,0xa4,0x16,0x6b,0x72,0xe2,0xa0, /* ....u.E..U..kr.. */ \ + 0x4b,0x64,0x45,0x11,0x69,0x81,0x8c,0x34,0x40,0x2a,0x32,0x91,0xde,0x8a,0xb0,0xbb, /* KdE.i..4@.2..... */ \ + 0x81,0xdc,0x0a,0x47,0x46,0x6d,0x46,0xb9,0xa2,0xb5,0x2a,0x28,0x5f,0x0a,0x23,0xcb, /* ...GFmF....(_.#. */ \ + 0x2f,0x8a,0x4c,0x74,0x68,0xa5,0x42,0x39,0x5f,0x77,0x28,0x80,0x19,0x1d,0xf2,0xe3, /* /.Lth.B9_w(..... */ \ + 0xd0,0x80,0x86,0x32,0xcb,0x53,0x39,0x2b,0x72,0xf1,0xd2,0xbc,0x68,0xc9,0x36,0x69, /* ...2.S9+r...h.6i */ \ + 0xf1,0x8d,0x4b,0x77,0x4b,0x11,0x93,0x58,0xcd,0x44,0x18,0x8a,0x90,0x54,0x4c,0x7e, /* ..KwK..X.D...TL~ */ \ + 0x4d,0xf1,0x4a,0x3f,0xa9,0x38,0x4f,0x55,0x14,0x89,0x94,0x54,0x6a,0x60,0xf4,0x5f, /* M.J?.8OU...Tj`._ */ \ + 0x28,0x17,0x32,0xf7,0x23,0xca,0xe4,0x22,0xc6,0xad,0x36,0x2d,0x49,0x55,0x58,0x04, /* (.2.#.."..6-IUX. */ \ + 0x39,0xb5,0x7e,0x1e,0x8a,0x5b,0xd8,0xfe,0x4b,0x1b,0x6a,0x64,0xb0,0x24,0x99,0xd5, /* 9.~..[..K.jd.$.. */ \ + 0xe4,0x65,0x9c,0x8b,0x45,0xea,0xe7,0x50,0x8b,0x47,0x55,0x05,0x57,0xfc,0x2b,0xab, /* .e..E..P.GU.W.+. */ \ + 0x00,0x8e,0xa0,0xb0,0x34,0x1b,0x76,0xbb,0xe3,0xd1,0xf5,0xae,0xed,0x61,0x2a,0x6f, /* ....4.v......a.o */ \ + 0xa1,0x2e,0x53,0x45,0x1a,0x08,0x9a,0xcb,0x08,0x21,0xb2,0xc7,0x83,0xc3,0x3f,0xbe, /* ..SE.....!....?. */ \ + 0xfa,0xaa,0xdf,0x0d,0xb6,0x61,0xd0,0x7f,0x9b,0x81,0x25,0x25,0x2a,0x65,0xad,0xd0, /* .....a....%%.e.. */ \ + 0xe9,0x53,0xac,0xe2,0xfd,0xad,0xc3,0xa1,0xb6,0x97,0x63,0xca,0x46,0xd5,0xa4,0xe1, /* .S........c.F... */ \ + 0xdd,0xfb,0x22,0x0e,0x72,0x89,0x08,0xdd,0xc9,0x7c,0xb9,0x13,0x26,0x01,0xab,0xd2, /* ..".r....|..&... */ \ + 0x58,0xe4,0xf5,0x18,0xcc,0x11,0x2b,0x36,0x76,0x0b,0x91,0xa9,0x48,0x50,0x52,0xa4, /* X.....+6v...HPR. */ \ + 0x89,0x42,0x06,0xa9,0xb9,0xf6,0x3f,0x9d,0xfb,0x81,0x8c,0x17,0x06,0x92,0xa7,0x3f, /* .B....?........? */ \ + 0x01,0xd5,0xa5,0x4d,0x4a,0x5c,0x63,0xf1,0xb3,0xa5,0x2a,0xa2,0x10,0xf9,0x32,0x87, /* ...MJ\c.......2. */ \ + 0x16,0xb8,0xc0,0x52,0x65,0x82,0x90,0x5f,0xe5,0x25,0xf9,0x41,0xa0,0x56,0x89,0x1f, /* ...Re.._.%.A.V.. */ \ + 0xaf,0x19,0x3d,0x5f,0x56,0x81,0xdf,0x84,0x8e,0xcd,0xf3,0xc3,0x50,0xb2,0x43,0x58, /* ..=_V.......P.CX */ \ + 0x3c,0x19,0xe3,0xc5,0xca,0xd7,0xee,0xa5,0x62,0xe1,0xa7,0x21,0xcb,0x21,0xd7,0xd2, /* <.......b..!.!.. */ \ + 0x2a,0x49,0x37,0xc1,0x54,0xb3,0x48,0x2e,0xf4,0xcc,0x6c,0x9b,0xab,0xde,0xb9,0x4d, /* .I7.T.H...l....M */ \ + 0x53,0xf7,0xd4,0x7b,0x63,0x4d,0x6c,0xb2,0xc6,0x43,0x1a,0xba,0x83,0xab,0x0b,0x7b, /* S..{cMl..C.....{ */ \ + 0xec,0x59,0x9e,0xe3,0x8e,0x89,0xdf,0x5e,0x4e,0xdc,0xd7,0xce,0xd0,0x1e,0xd2,0xcf, /* .Y.....^N....... */ \ + 0xd6,0x94,0x9c,0xe9,0x2f,0xf4,0xc6,0xf1,0xce,0xdd,0x2b,0xcf,0xa0,0x42,0x70,0x62, /* ..../.....+..Bpb */ \ + 0x8d,0xbd,0x6b,0x72,0x4f,0x21,0x7f,0x4d,0x7f,0x76,0xc6,0xc3,0x0e,0xd9,0x98,0x62, /* ..krO!.M.v.....b */ \ + 0x4f,0xc8,0x7e,0x7b,0x39,0xb1,0xa7,0x53,0x72,0x27,0xe4,0x5c,0x5c,0x8e,0x1c,0x1b, /* O.~{9..Sr'.\\... */ \ + 0x43,0xce,0x78,0x30,0xba,0x1a,0x3a,0xe3,0xb3,0x5d,0x9c,0x91,0x73,0xe1,0x18,0xa5, /* C.x0..:..]..s... */ \ + 0x1d,0x8d,0x53,0xc7,0xbd,0xb0,0x27,0x83,0x73,0xfc,0xb0,0x4e,0x9c,0x91,0xe3,0x5d, /* ..S...'.s..N...] */ \ + 0x77,0xe8,0xd4,0xf1,0xc6,0x8c,0x7b,0x0a,0x60,0xcb,0xc8,0x5f,0x5a,0x13,0xcf,0x19, /* w.....{.`.._Z... */ \ + 0x5c,0x8d,0xac,0x09,0x5d,0x5e,0x4d,0x2e,0xdd,0xa9,0xdd,0x21,0xcf,0xf1,0x46,0xc6, /* \...]^M....!..F. */ \ + 0xab,0xb1,0x3b,0xde,0x77,0xc6,0xa7,0x13,0xa8,0xb5,0xd9,0xbb,0x2e,0xcc,0xc0,0x4b, /* ..;.w..........K */ \ + 0xb2,0x5f,0xe3,0x07,0x4d,0xcf,0xad,0xd1,0xc8,0xc0,0x5c,0x38,0x83,0x89,0x3b,0x38, /* ._..M.....\8..;8 */ \ + 0x07,0x4b,0x9d,0xd8,0xb0,0xc9,0x3a,0x01,0x80,0xd6,0x02,0x93,0x60,0x39,0xe2,0x00, /* .K....:.....`9.. */ \ + 0x33,0x46,0x1d,0x9a,0x5e,0xda,0x03,0x87,0x1f,0xe0,0xae,0x33,0xb1,0x07,0x1e,0xfb, /* 3F..^......3.... */ \ + 0x68,0x08,0xc5,0x1d,0x4f,0xed,0xbf,0x5c,0x61,0x1e,0xc6,0x69,0x68,0x5d,0x58,0x67, /* h...O..\a..ih]Xg */ \ + 0xf6,0xb4,0x43,0x23,0x77,0xea,0x71,0x28,0x61,0xba,0x8e,0x87,0xfe,0x3d,0xb4,0x3c, /* ..C#w.q(a....=.< */ \ + 0xab,0x03,0x09,0x3c,0xc2,0x4d,0xe3,0x07,0xd4,0x5f,0x4d,0xb4,0x91,0xfc,0x6e,0x7a, /* ...<.M..._M...nz */ \ + 0x75,0x32,0x85,0x1b,0x57,0x9e,0x4d,0x67,0xae,0x3b,0x04,0x90,0x67,0x0f,0xce,0xc7, /* u2..W.Mg.;..g... */ \ + 0xee,0xc8,0x3d,0xbb,0x66,0x98,0xa9,0x3d,0x79,0xed,0x0c,0x58,0x01,0x5b,0x38,0x18, /* ..=.f..=y..X.[8. */ \ + 0x59,0xce,0xc5,0xd4,0x00,0x9d,0x5c,0x63,0x71,0x9d,0xc9,0xd0,0x44,0xc6,0x9e,0x52, /* Y.....\cq...D..R */ \ + 0x6b,0x1b,0xf9,0x13,0x44,0x7d,0xec,0x7a,0x26,0xe8,0x58,0x59,0xcf,0xd5,0xe2,0x43, /* k...D}.z&.XY...C */ \ + 0xfb,0xd4,0x86,0xf1,0x54,0x65,0xc6,0xc4,0x76,0x4f,0xdb,0x3b,0xc8,0x1c,0x0a,0x78, /* ....Te..vO.;...x */ \ + 0x6c,0x5f,0x8c,0x1d,0x4f,0xeb,0x87,0xb7,0xde,0xc4,0x01,0x9e,0x5e,0x38,0xbc,0x70, /* l_..O.......^8.p */ \ + 0xf5,0xc2,0x9b,0x9c,0x05,0x3a,0xaf,0x07,0xfb,0x07,0x03,0xdf,0x9c,0xdb,0x7a,0xcc, /* .....:........z. */ \ + 0x9a,0xc2,0x68,0xd6,0x8a,0xfc,0xe2,0xf4,0x3b,0xb1,0xa6,0xce,0x94,0x7d,0xd5,0x58, /* ..h.....;....}.X */ \ + 0xd6,0xc0,0x83,0x8f,0xee,0xa4,0x4c,0x8b,0x9a,0xd1,0x63,0xfb,0x6c,0xe4,0x9c,0x81, /* ......L...c.l... */ \ + 0x0d,0x6c,0xd8,0x74,0x32,0xb1,0xad,0xc1,0x39,0x4b,0x55,0x89,0xb2,0xd5,0xfe,0xc6, /* .l.t2...9KU..... */ \ + 0x99,0xda,0x9b,0x0c,0xd7,0x28,0x56,0x91,0x2f,0xb1,0x6f,0x76,0xff,0x86,0x60,0xb0, /* .....(V./.ov..`. */ \ + 0xea,0x79,0xa0,0x56,0x55,0x55,0xf8,0xe7,0x27,0xf8,0xd3,0x4a,0xed,0x28,0x92,0x2a, /* .y.VUU..'..J.(.. */ \ + 0xcf,0xe9,0x8d,0x52,0x61,0xa3,0xd1,0x38,0x38,0xec,0xbd,0xe8,0xf5,0xff,0xd0,0x68, /* ...Ra..88......h */ \ + 0x5c,0x25,0xa1,0xe6,0xce,0x58,0xdc,0x59,0xaf,0xac,0xb7,0xac,0x1a,0x7b,0xf4,0x13, /* \%...X.Y.....{.. */ \ + 0x15,0xbf,0xde,0xf3,0x67,0xcf,0x9f,0xf5,0x7a,0x34,0x14,0xe0,0xa8,0x95,0x8c,0x41, /* ....g...z4.....A */ \ + 0xac,0xba,0x50,0xf8,0x60,0x87,0xef,0x0b,0x91,0xe5,0x4c,0xe5,0xa0,0xa8,0x4c,0x86, /* ..P.`.....L...L. */ \ + 0x22,0x85,0x11,0xcd,0x5c,0xae,0xb8,0x7c,0x14,0x79,0xf3,0xf9,0xb3,0x5b,0x1f,0xc4, /* "...\..|.y...[.. */ \ + 0x84,0xdf,0x6e,0x91,0x63,0xad,0x8f,0xe9,0x45,0xbf,0xdf,0x3f,0xa2,0x5e,0x6f,0x95, /* ..n.c...E..?.^o. */ \ + 0xc1,0x3a,0x0d,0x3b,0xcd,0x15,0xea,0x1d,0xd0,0x80,0x55,0x68,0x32,0x64,0x17,0x48, /* .:.;......Uh2d.H */ \ + 0xdc,0x22,0x78,0xba,0xca,0xa1,0x00,0x04,0x22,0xcb,0x0c,0x96,0xff,0xde,0xff,0x61, /* ."x....."......a */ \ + 0x84,0x4a,0x06,0x28,0x38,0x4b,0x56,0x9a,0xfa,0xeb,0x56,0xfb,0x48,0x9b,0x58,0x36, /* .J.(8KV...V.H.X6 */ \ + 0x07,0x99,0x01,0x64,0x2e,0x8c,0x0b,0x14,0xb3,0x94,0x31,0x43,0x05,0xb0,0xa0,0x48, /* ...d......1C...H */ \ + 0x53,0x26,0xc4,0x99,0x60,0x46,0x03,0x79,0xde,0xc5,0xcc,0xec,0xba,0x84,0x8a,0x2c, /* S&..`F.y......., */ \ + 0xf0,0x63,0x42,0x79,0xcc,0x55,0xcc,0x30,0x3d,0xa3,0x8f,0xdf,0x0e,0x59,0xf6,0x98, /* .cBy.U.0=....Y.. */ \ + 0xfa,0x3b,0x5a,0x2a,0x2c,0x89,0xa0,0x18,0xae,0x84,0x16,0x46,0x9a,0x65,0x99,0xa6, /* .;Z.,......F.e.. */ \ + 0x50,0x40,0xfa,0x21,0xcd,0x53,0xb5,0xa2,0x37,0xf2,0x54,0x72,0x59,0x2e,0x22,0xd1, /* P@.!.S..7.TrY.". */ \ + 0xad,0x61,0x33,0xc4,0x49,0xf6,0x18,0x1a,0xd1,0x65,0xe6,0x67,0xdf,0x43,0x84,0x37, /* .a3.I....e.g.C.7 */ \ + 0x55,0x6b,0x2e,0xb6,0xb3,0x42,0x82,0xea,0x95,0x1e,0x41,0x51,0xb8,0x53,0xe9,0x0d, /* Uk...B....AQ.S.. */ \ + 0x9c,0xf4,0x67,0x91,0xa8,0x41,0xea,0xe1,0xb1,0x19,0xb5,0x7f,0x00,0xe7,0x73,0x21, /* ..g..A........s! */ \ + 0x3f,0xa6,0x83,0xa3,0x72,0x0d,0x9d,0x18,0x2c,0x8f,0x54,0xe1,0x78,0xeb,0xf8,0x71, /* ?...r...,.T.x..q */ \ + 0xa8,0x83,0x2a,0x5d,0x7a,0xbd,0x46,0x91,0x46,0x2f,0xb5,0x1b,0x78,0xd0,0x45,0x31, /* ...]z.F.F/..x.E1 */ \ + 0x30,0xb1,0xc7,0x10,0x57,0x21,0x1f,0xcb,0x9f,0x9a,0x09,0xa1,0x0a,0x0a,0x5d,0x5e, /* 0...W!........]^ */ \ + 0x9c,0x21,0x4f,0x44,0xc5,0x8d,0x3a,0x6c,0xa7,0x4f,0xf3,0xaa,0x38,0xe2,0x75,0xe0, /* .!OD..:l.O..8.u. */ \ + 0xa3,0xb7,0xd1,0x15,0x0d,0x11,0x4e,0x14,0x17,0xa6,0xb7,0x17,0x23,0x6a,0xa9,0xc4, /* ......N.....#j.. */ \ + 0x54,0x9b,0xb6,0x86,0x4e,0x45,0x22,0xfc,0x1c,0xb8,0x29,0x32,0x20,0xe7,0xd0,0xf1, /* T...NE"...)2 ... */ \ + 0x6f,0x53,0xab,0x34,0x82,0x84,0x23,0x73,0x09,0xe3,0x45,0xb4,0x7e,0x28,0x8c,0xd4, /* oS.4..#s..E.~(.. */ \ + 0xf7,0x5f,0xa2,0x26,0xd1,0xd5,0x64,0x44,0x22,0x0e,0x14,0xfb,0xcc,0xbd,0x0e,0x57, /* ._.&..dD"......W */ \ + 0x3b,0x85,0xc5,0xa6,0xac,0x98,0xad,0x64,0xce,0x1b,0xc4,0xcf,0xe8,0x92,0xa9,0x91, /* ;......d........ */ \ + 0x65,0x76,0x70,0x36,0x36,0xef,0x6e,0xa1,0x16,0xc2,0xd0,0xa1,0x8d,0xe7,0x9d,0xd2, /* evp66.n......... */ \ + 0xb2,0x8e,0x06,0x80,0xd8,0x8f,0xcf,0x9f,0x35,0x38,0x87,0x51,0xa4,0x8b,0x84,0xb8, /* ........58.Q.... */ \ + 0x44,0xaa,0xd9,0x7b,0x11,0x60,0xd7,0x37,0x78,0x39,0x18,0x0c,0x09,0x5b,0x26,0xab, /* D..{.`.7x9...[&. */ \ + 0xab,0x87,0x74,0xb6,0xea,0x51,0x44,0xd1,0xc3,0xd6,0x48,0xcb,0x61,0x26,0x0f,0x33, /* ..t..QD...H.a&.3 */ \ + 0x58,0x8a,0x75,0x79,0x0d,0x8e,0x79,0x25,0xea,0x2f,0x37,0xc6,0x60,0x68,0xf3,0x5c, /* X.uy..y%./7.`h.\ */ \ + 0x9f,0x50,0x06,0xef,0xb8,0xb4,0xb5,0x3e,0xc4,0xbb,0x67,0x22,0xbe,0x67,0x85,0x45, /* .P.....>..g".g.E */ \ + 0xa4,0x51,0x8d,0xfd,0x03,0xe4,0x2a,0x98,0x8b,0xeb,0x7a,0x26,0x70,0x31,0x3b,0x42, /* .Q........z&p1;B */ \ + 0x6f,0x6e,0x4c,0x90,0xf3,0xd6,0x1d,0x16,0x40,0xdd,0x75,0xb1,0x74,0xe7,0x79,0x9e, /* onL.....@.u.t.y. */ \ + 0x4c,0xcc,0x50,0x9b,0xe0,0x7e,0x45,0x77,0x4f,0xa8,0x80,0x4f,0xbb,0x02,0xda,0xbb, /* L.P..~EwO..O.... */ \ + 0x0f,0x08,0x74,0x55,0x22,0xe2,0x56,0x8b,0xe3,0x7a,0x7c,0xcc,0xd6,0xb5,0xbf,0x69, /* ..tU".V..z|....i */ \ + 0x9e,0xd9,0x5e,0xf3,0x65,0x93,0x17,0xac,0xd9,0xa1,0x5a,0x50,0x3a,0x3a,0x51,0x3e, /* ..^.e.....ZP::Q> */ \ + 0x06,0xc6,0x5e,0x68,0xac,0x6a,0x12,0xe7,0xfe,0x9c,0xee,0xc4,0x5e,0xca,0x1d,0x1d, /* ..^h.j......^... */ \ + 0xa7,0x86,0x63,0x7f,0x85,0x2c,0x59,0xa3,0x0f,0x6b,0xad,0xfc,0x35,0xb2,0xe4,0x45, /* ..c..,Y..k..5..E */ \ + 0xf7,0x05,0xe9,0x46,0x29,0x97,0xd8,0x54,0x48,0x1d,0xd5,0x36,0xb2,0xf7,0x24,0x22, /* ...F)..TH..6..$" */ \ + 0xe4,0xed,0x36,0x0c,0x16,0x52,0xe5,0x56,0xbc,0x35,0xeb,0xf9,0x2b,0xa2,0xb0,0x33, /* ..6..R.V.5..+..3 */ \ + 0xbf,0xd5,0xd4,0xcd,0x62,0x86,0xee,0x4b,0xc7,0xd3,0xf3,0x2e,0x9b,0x75,0x57,0xa0, /* ....b..K.....uW. */ \ + 0xe6,0x01,0xca,0x8e,0x86,0x4f,0x1e,0xba,0x5f,0x15,0x3e,0x1d,0x86,0x32,0x1a,0xe6, /* .....O.._.>..2.. */ \ + 0x66,0xae,0x95,0x60,0xe4,0x67,0xf9,0x00,0x1b,0x55,0xb3,0x4d,0x95,0xd7,0xdd,0x85, /* f..`.g...U.M.... */ \ + 0xc8,0xf9,0x61,0xb3,0xec,0x9b,0xa5,0xd0,0x9c,0xcf,0xd4,0xcb,0x3b,0xc6,0x67,0x0e, /* ..a.........;.g. */ \ + 0x37,0x43,0x15,0xbb,0x77,0x93,0x22,0x5b,0x56,0x61,0x60,0xe9,0xfb,0x92,0xbf,0x46, /* 7C..w."[Va`....F */ \ + 0x4a,0x25,0x19,0x29,0xee,0xf4,0x99,0x16,0xe0,0xb7,0x6e,0x4e,0x1f,0x54,0x8c,0xb0, /* J%.)......nN.T.. */ \ + 0xaa,0x54,0x08,0x26,0x92,0x7a,0x0d,0x16,0xd3,0x7b,0x1b,0x6c,0xc2,0x59,0x2d,0x51, /* .T.&.z...{.l.Y-Q */ \ + 0xa5,0x6a,0x3b,0x3e,0x41,0x67,0xcd,0x00,0x2d,0xc4,0xb9,0x51,0x6e,0x4d,0x50,0xf3, /* .j;>Ag..-..QnMP. */ \ + 0x6f,0xd9,0xb8,0x3c,0x28,0x22,0x3f,0xc1,0x91,0x61,0xbb,0xb9,0x26,0x5c,0x07,0xd4, /* o..<("?..a..&\.. */ \ + 0xdc,0x54,0x87,0x4d,0xfd,0x32,0x3c,0x01,0x5f,0x60,0xe5,0x6c,0xcd,0x37,0xcc,0x46, /* .T.M.2<._`.l.7.F */ \ + 0xe3,0xdd,0x92,0x40,0xdd,0xc4,0x21,0x12,0xf1,0x22,0x5f,0x1e,0x91,0xa4,0xaf,0x51, /* ...@..!.."_....Q */ \ + 0x24,0x48,0xee,0xef,0x23,0x27,0x1b,0xcc,0x3a,0x8d,0xad,0x89,0x9b,0xd9,0xd9,0x52, /* $H..#'..:......R */ \ + 0xce,0x4b,0x33,0x79,0xd3,0xfe,0xae,0x9c,0xc2,0x22,0x0d,0x4d,0xdf,0x32,0x2e,0x84, /* .K3y.....".M.2.. */ \ + 0x1e,0x2d,0x8d,0x7c,0x72,0xb1,0x68,0xbf,0x72,0xbf,0xb6,0xac,0x5a,0xaa,0xc1,0x1e, /* .-.|r.h.r...Z... */ \ + 0x35,0xaa,0xad,0x04,0x5a,0x45,0x71,0x10,0x21,0x07,0x53,0xeb,0xab,0xa4,0xaa,0x2c, /* 5...ZEq.!.S...., */ \ + 0xe2,0x02,0xb8,0xc6,0xc9,0x1c,0xcc,0x72,0x7c,0x4c,0x5f,0xd2,0x67,0x9f,0xd1,0xc3, /* .......r|L_.g... */ \ + 0x29,0x19,0x46,0x8b,0x8c,0x87,0x71,0x50,0xd6,0x79,0xde,0xa8,0x14,0xc8,0x9c,0x96, /* ).F...qP.y...... */ \ + 0x3e,0xd7,0xa9,0x1a,0xfb,0xde,0xa5,0xa8,0x00,0x55,0xbd,0x2e,0xa2,0x5c,0x4f,0x87, /* >........U...\O. */ \ + 0xe6,0x7c,0x9d,0x08,0xb5,0x35,0x60,0x23,0xd1,0x66,0xe4,0xbd,0x6a,0xa5,0xf7,0xda, /* .|...5`#.f..j... */ \ + 0x06,0xbf,0xf1,0x68,0xde,0x13,0xa6,0x9b,0x62,0x85,0x0d,0xda,0xad,0x0a,0x9d,0x1d, /* ...h....b....... */ \ + 0xe9,0xe3,0x94,0x09,0x6f,0x63,0x4b,0x0a,0x1f,0x57,0x6e,0x0a,0xd1,0x5e,0xe5,0x5b, /* ....ocK..Wn..^.[ */ \ + 0xa3,0x42,0xe3,0x78,0x97,0x88,0x27,0x6b,0x27,0x7c,0x42,0xbc,0x2b,0x63,0xdc,0xce, /* .B.x..'k'|B.+c.. */ \ + 0x3d,0x94,0xcb,0xe3,0x47,0x81,0xab,0x0c,0xf4,0xc4,0x0f,0x79,0x65,0x10,0xe2,0xd6, /* =...G......ye... */ \ + 0xd2,0x0d,0xc0,0x9d,0xcc,0xb8,0x3e,0xe3,0x3c,0x8b,0x0a,0x8a,0xed,0xc1,0x07,0x3c, /* ......>.<......< */ \ + 0xe6,0x05,0xba,0xf5,0x23,0xf0,0xb0,0xc9,0x07,0x5c,0x78,0xcb,0x35,0x1e,0x22,0xfb, /* ....#....\x.5.". */ \ + 0x33,0x9c,0x88,0x4d,0x12,0x3d,0x35,0xbe,0xad,0x1d,0x3b,0x6b,0xb5,0x97,0xe9,0x7e, /* 3..M.=5...;k...~ */ \ + 0x90,0x0b,0x0e,0xb7,0x24,0x55,0xf5,0xe8,0xf0,0x62,0xc5,0x6c,0x4b,0xa6,0xaa,0xc5, /* ....$U...b.lK... */ \ + 0xaa,0x00,0xcd,0x6c,0x63,0x4c,0xe3,0x41,0xd9,0xad,0xe6,0x98,0xf2,0xfb,0x30,0x34, /* ...lcL.A......04 */ \ + 0xdb,0x57,0x25,0xc6,0xd1,0xe3,0x0c,0xbf,0xe7,0x4b,0x3d,0x5d,0xf7,0x6e,0x05,0xdd, /* .W%......K=].n.. */ \ + 0xf9,0x92,0xbb,0x00,0xcd,0x1f,0x07,0x28,0x75,0x90,0x08,0x4b,0x13,0x91,0xcf,0x9b, /* .......(u..K.... */ \ + 0xbe,0xb5,0xcc,0xe7,0x6a,0x93,0x7c,0xbd,0xed,0x60,0xeb,0x29,0x1a,0xdf,0xaa,0x1b, /* ....j.|..`.).... */ \ + 0x93,0x8c,0x45,0xc6,0x87,0xfc,0x9d,0x4f,0x02,0x3a,0xdc,0x32,0x4e,0x8a,0x4f,0x97, /* ..E....O.:.2N.O. */ \ + 0xa3,0x9a,0xd9,0x77,0x92,0xaf,0x9c,0x0a,0x63,0xac,0x48,0xa4,0xf9,0xc6,0x16,0xf3, /* ...w....c.H..... */ \ + 0xda,0xe7,0x77,0xad,0x66,0x19,0x52,0x9a,0xfb,0x12,0xfb,0xb8,0xfb,0x5d,0x3c,0x50, /* ..w.f.R......]

.F.7h<...Z.F.G */ \ + 0x36,0x3d,0xa9,0xee,0x9e,0xcd,0x27,0x24,0x94,0x8e,0x0f,0x31,0x13,0x19,0x6a,0xfa, /* 6=....'$...1..j. */ \ + 0x0f,0x83,0x42,0xb9,0xc4,0xc8,0x19,0x00,0x00,0x1f,0x8b,0x08,0x00,0x00,0x00,0x00, /* ..B............. */ \ + 0x00,0x00,0x00,0xad,0x8f,0xf9,0x4f,0x93,0x07,0x00,0x40,0xbf,0x1e,0x94,0x72,0x14, /* ......O...@...r. */ \ + 0x5a,0xb4,0xd0,0x72,0xd9,0x53,0x59,0x45,0x43,0x98,0x28,0xe0,0xd5,0xd2,0xd2,0x43, /* Z..r.SYEC.(....C */ \ + 0x18,0xf9,0xc8,0x40,0x04,0x06,0x16,0x42,0x8b,0x32,0xc0,0x82,0x58,0x04,0xa7,0x2d, /* ...@...B.2..X..- */ \ + 0x50,0x11,0xb9,0x2a,0x47,0x05,0x0a,0x52,0x50,0xca,0x74,0x14,0x8b,0x12,0x04,0x65, /* P...G..RP.t....e */ \ + 0x0a,0xca,0xa1,0x96,0xab,0xae,0x20,0x90,0x62,0x00,0x15,0x5c,0x16,0xae,0xb9,0x45, /* ...... .b..\...E */ \ + 0xdd,0x70,0xfd,0x16,0xb3,0x7f,0x61,0xef,0x87,0x97,0xbc,0x1f,0x1f,0x4f,0xc0,0xf5, /* .p....a......O.. */ \ + 0x0f,0x48,0xa8,0x05,0x18,0xc0,0x14,0x0d,0x90,0xc9,0x64,0x7d,0x7d,0x7d,0x16,0xac, /* .H........d}}}.. */ \ + 0x1b,0xb4,0xbe,0x01,0x4d,0xbc,0x58,0x5f,0x5f,0x97,0x48,0x24,0x13,0x13,0x13,0xd0, /* ....M.X__.H$.... */ \ + 0xfc,0x22,0x16,0x8b,0xb5,0x90,0x18,0x16,0x9f,0x40,0x8d,0x46,0x03,0x82,0xa0,0x85, /* .".......@.F.... */ \ + 0x29,0x10,0x0a,0x85,0x24,0x12,0x49,0xa9,0x54,0xce,0xcf,0xcf,0x43,0xf2,0x42,0xbd, /* )...$.I.T...C.B. */ \ + 0x5e,0xef,0xe3,0xe3,0x63,0x91,0x5d,0x84,0x34,0x2d,0x50,0xdf,0x13,0x0b,0x78,0xcc, /* ^...c.].4-P...x. */ \ + 0x22,0x91,0x5a,0x84,0xc9,0x90,0xb2,0x1a,0x52,0xaa,0x20,0x7d,0xa7,0x45,0x92,0xcd, /* ".Z.....R. }.E.. */ \ + 0x64,0x32,0x2d,0x80,0x3d,0x04,0x41,0x00,0x00,0xfc,0xe7,0xff,0x17,0xf2,0x5f,0x48, /* d2-.=.A......._H */ \ + 0x18,0x00,0xd0,0x00,0xef,0x2f,0xf1,0xe5,0x09,0x40,0x41,0xcc,0x4a,0x09,0xdf,0xdb, /* ...../...@A.J... */ \ + 0x55,0xf9,0xac,0x25,0xf3,0x79,0x6a,0xa0,0xc6,0x78,0x33,0xeb,0x48,0x7b,0x8c,0x7e, /* U..%.yj..x3.H{.~ */ \ + 0x46,0x27,0x1d,0x59,0xcd,0xbd,0x84,0x2c,0x61,0x63,0x19,0x35,0x56,0x0e,0x0e,0xaf, /* F'.Y...,ac.5V... */ \ + 0x47,0xd2,0x7b,0xcb,0x10,0x25,0x4f,0x42,0xf5,0x97,0xdc,0x91,0x64,0x20,0xf1,0xec, /* G.{..%OB....d .. */ \ + 0x26,0x14,0xe1,0x9c,0x24,0x55,0x88,0x6c,0x11,0x34,0x94,0x0d,0x46,0x5e,0x56,0x2e, /* &...$U.l.4..F^V. */ \ + 0x40,0xdb,0x5d,0xac,0x12,0x39,0xd3,0x30,0x78,0x92,0xb2,0xbe,0x1e,0x59,0x50,0x5d, /* @.]..9.0x....YP] */ \ + 0x95,0x03,0xb3,0x6a,0xd0,0xca,0x1a,0x9b,0x9a,0xec,0x5a,0x75,0xa7,0x6e,0xde,0x6a, /* ...j......Zu.n.j */ \ + 0x72,0xff,0xc6,0x8a,0x44,0x25,0x59,0xf3,0xac,0x30,0xf7,0x5a,0xda,0x75,0x88,0xd3, /* r...D%Y..0.Z.u.. */ \ + 0x52,0x17,0x8a,0x5b,0x95,0x1d,0x5a,0x0f,0xff,0x3e,0x04,0x47,0x1d,0x57,0x73,0x1d, /* R..[..Z..>.G.Ws. */ \ + 0xc7,0xa9,0xe7,0x1f,0xb5,0x6e,0x53,0x6c,0xa1,0x98,0x2b,0xa5,0x06,0x33,0x41,0xec, /* .....nSl..+..3A. */ \ + 0x10,0x8a,0x32,0x51,0x9d,0x82,0xad,0x96,0x8d,0x2f,0xeb,0xd1,0x0a,0x3b,0xb3,0x19, /* ..2Q...../...;.. */ \ + 0xa9,0x18,0x78,0x4f,0x14,0x7b,0x86,0x74,0x99,0xa6,0xd8,0x63,0xa6,0x99,0xae,0xd3, /* ..xO.{.t...c.... */ \ + 0x11,0xba,0xf1,0x7d,0x39,0x94,0xed,0x93,0xcf,0xe5,0xe0,0xa0,0x9c,0x05,0xc7,0xd2, /* ...}9........... */ \ + 0x17,0xdf,0x79,0xb3,0x70,0xe8,0x65,0x2e,0x3a,0x00,0xb8,0xfe,0xa6,0xaf,0x9c,0xc4, /* ..y.p.e.:....... */ \ + 0x3a,0x44,0xc2,0xdf,0x4d,0x42,0xa0,0xd8,0xb6,0x04,0xaf,0xd9,0x3b,0x2c,0x79,0xf5, /* :D..MB......;,y. */ \ + 0xce,0xe8,0xfc,0x22,0x66,0x3e,0x15,0x2d,0x0b,0x22,0x64,0x71,0x88,0x5b,0xb4,0xa3, /* ..."f>.-."dq.[.. */ \ + 0x50,0xb9,0xa3,0xd7,0x15,0x02,0xa8,0x6f,0x1e,0x10,0x92,0x29,0xae,0x0f,0x85,0xe2, /* P......o...).... */ \ + 0x82,0xca,0x52,0x2a,0x68,0x6b,0x03,0x9c,0xf9,0x6d,0x0f,0xb9,0xb7,0x29,0x8c,0x7d, /* ..R.hk...m...).} */ \ + 0x6b,0xca,0xdd,0x00,0xc7,0x3f,0x08,0x3c,0x17,0x0d,0xdc,0x98,0x81,0x47,0xa4,0xe1, /* k....?.<.....G.. */ \ + 0x61,0x0b,0xf6,0x80,0xcd,0x85,0xf4,0xa1,0xc0,0x1b,0xfd,0x93,0x4d,0xe1,0x12,0x71, /* a...........M..q */ \ + 0xe0,0x1c,0x7e,0xb1,0xdf,0xbe,0x90,0x06,0xce,0x0a,0x46,0x8a,0x76,0xb6,0x73,0x6d, /* ..~.......F.v.sm */ \ + 0x32,0x79,0x83,0xaa,0xb6,0xcb,0xac,0x44,0x6e,0xf9,0x12,0x8a,0xbf,0xf3,0x0a,0x32, /* 2y.....Dn......2 */ \ + 0x76,0xe8,0x94,0xb9,0x92,0x6f,0x0f,0xd3,0x78,0xa4,0x65,0xdb,0x31,0xfc,0x8a,0x85, /* v....o..x.e.1... */ \ + 0xc6,0x66,0xaa,0x75,0x2b,0xbd,0xb6,0x30,0xec,0xda,0xd7,0x9d,0xd4,0x78,0xd7,0xed, /* .f.u+..0.....x.. */ \ + 0x2c,0xf2,0xef,0x89,0xb1,0xe4,0xc8,0xd8,0xa3,0x18,0xdf,0x95,0xa9,0xc7,0x89,0x3b, /* ,..............; */ \ + 0x0e,0xc7,0xb6,0x11,0xd7,0x96,0x93,0xef,0xff,0x48,0x6e,0x67,0x2f,0xac,0x0d,0xf8, /* .........Hng/... */ \ + 0xda,0xaf,0x33,0x74,0x59,0x83,0x3e,0xcc,0x14,0xda,0xed,0xe3,0x2e,0x81,0x9b,0x99, /* ..3tY.>......... */ \ + 0xf0,0x2c,0xfe,0x6d,0x27,0xd6,0x8a,0x77,0x67,0x0c,0x65,0x7a,0xac,0xe0,0x57,0x91, /* .,.m'..wg.ez..W. */ \ + 0xc2,0x37,0x63,0x74,0x78,0xc8,0x91,0x7c,0xf8,0xfa,0xb8,0xe2,0x51,0xf6,0x87,0xdc, /* .7ctx..|....Q... */ \ + 0x8d,0xde,0xee,0xd8,0xa2,0x03,0xc1,0x93,0x47,0x1b,0xa3,0x9d,0x1f,0xa3,0xae,0x8a, /* ........G....... */ \ + 0x5f,0x61,0xac,0x8f,0xe5,0x04,0x7f,0x27,0x9a,0x3b,0xeb,0x90,0x52,0xa8,0x48,0x88, /* _a.....'.;..R.H. */ \ + 0xbb,0x8f,0xdf,0x56,0xc0,0x09,0x65,0xf3,0x0e,0x68,0x55,0xcd,0xd0,0x74,0xdc,0x27, /* ...V..e..hU..t.' */ \ + 0x8f,0x4c,0x97,0x83,0x22,0xdd,0xfb,0x46,0xee,0x92,0x3f,0x62,0x0e,0xb1,0x7c,0x5f, /* .L.."..F..?b..|_ */ \ + 0xb5,0x90,0xb3,0x58,0xe6,0x37,0x9b,0x04,0x44,0x1a,0xaf,0xe3,0x70,0x89,0x7b,0x9b, /* ...X.7..D...p.{. */ \ + 0xd3,0xf6,0x19,0xba,0x2b,0x0a,0x93,0x49,0x1d,0x63,0x59,0xd6,0x7e,0x93,0x09,0x68, /* ....+..I.cY.~..h */ \ + 0xd7,0x15,0x6d,0x1e,0xf1,0x2e,0x36,0x83,0x88,0xa4,0x19,0x93,0xcb,0xc1,0xcf,0x27, /* ..m...6........' */ \ + 0xde,0x27,0x8a,0x30,0x86,0xa1,0xd7,0x05,0xc4,0xab,0x4f,0x45,0xe7,0x0e,0xc4,0x7b, /* .'.0......OE...{ */ \ + 0xd5,0x10,0x3f,0x48,0x10,0xaf,0xe2,0x3d,0x6a,0x5f,0x34,0x84,0xf7,0x23,0x05,0x1c, /* ..?H...=j_4..#.. */ \ + 0x55,0x10,0xf8,0xa7,0x1a,0xfb,0x55,0x4c,0xce,0x94,0xe8,0x98,0x74,0x76,0x2a,0x7b, /* U.....UL....tv.{ */ \ + 0x9f,0xd3,0xa2,0x9a,0x7b,0xdc,0xb9,0xe2,0x28,0x9c,0x5e,0x27,0x6a,0x16,0x5f,0x8e, /* ....{...(.^'j._. */ \ + 0x04,0x87,0x51,0x98,0x0a,0x42,0xbe,0xf5,0x3f,0xaa,0x9e,0x28,0x7f,0xd1,0x67,0x3f, /* ..Q..B..?..(..g? */ \ + 0x64,0x03,0x8d,0xb3,0xb7,0x2c,0xb6,0xb7,0x4c,0xf8,0xa2,0x04,0xdc,0xed,0xf5,0xf2, /* d....,..L....... */ \ + 0x2a,0x03,0x55,0x4b,0x2d,0xd9,0xff,0xe4,0x26,0x2f,0xa3,0xc8,0x10,0x9c,0x07,0xa7, /* ..UK-...&/...... */ \ + 0xec,0xe5,0xbc,0x05,0xa8,0x6a,0x98,0x3a,0xbc,0x51,0x40,0x1b,0x4c,0x99,0xa9,0x00, /* .....j.:.Q@.L... */ \ + 0x01,0xfd,0xb8,0x3c,0xbb,0x8e,0xdb,0x79,0x52,0x6d,0x13,0x72,0x3e,0xd5,0xb6,0xff, /* ...<...yRm.r>... */ \ + 0x2e,0x90,0xa4,0x15,0x14,0x53,0xdd,0xcd,0xb8,0x8e,0x1a,0x24,0xcd,0x04,0x5b,0x0b, /* .....S.....$..[. */ \ + 0x78,0xce,0x10,0x1b,0x7c,0x7b,0x57,0x42,0x88,0xba,0x93,0x2d,0x44,0xc1,0x11,0x97, /* x...|{WB...-D... */ \ + 0x96,0xd3,0x70,0xaf,0x2b,0x90,0xb6,0x9c,0x06,0x3c,0xe5,0x87,0x99,0x9a,0xce,0x44, /* ..p.+....<.....D */ \ + 0xa6,0x64,0xd2,0x4b,0x9a,0x23,0x53,0xe2,0xa6,0x55,0xdb,0xff,0x4e,0xa1,0x37,0xfc, /* .d.K.#S..U..N.7. */ \ + 0x74,0xcd,0xd3,0xb0,0xfa,0x30,0xd8,0x98,0x1b,0xa5,0xfe,0x7c,0x87,0x58,0x8a,0x38, /* t....0.....|.X.8 */ \ + 0x17,0x27,0xc9,0xd3,0xd4,0xb7,0x6e,0x75,0x46,0xf6,0x2c,0xb8,0x99,0x53,0x97,0x23, /* .'....nuF.,..S.# */ \ + 0xcf,0x36,0x70,0x39,0x3d,0x1f,0xdb,0xda,0xc2,0xe1,0x6d,0xf8,0x7b,0xb6,0x0e,0x19, /* .6p9=.....m.{... */ \ + 0x75,0xfd,0xdd,0xf4,0x3b,0xd3,0x15,0x85,0xa5,0x9f,0x04,0x75,0x5c,0x5c,0x82,0x69, /* u...;......u\\.i */ \ + 0x57,0xc8,0xe8,0x0f,0xfd,0xa3,0x41,0x5b,0x37,0xe4,0xcf,0x4c,0x7b,0x98,0x95,0x3c, /* W.....A[7..L{..< */ \ + 0xdf,0xec,0x88,0x31,0x58,0xb4,0x28,0x22,0x0f,0x74,0xc3,0xa7,0x85,0xc1,0xcf,0xcf, /* ...1X.(".t...... */ \ + 0x28,0xbe,0x6d,0xdd,0x4f,0x77,0xf2,0xe3,0x1f,0x99,0x5b,0xd2,0xb4,0x73,0xe3,0x0e, /* (.m.Ow....[..s.. */ \ + 0xc6,0xb0,0x11,0x67,0x56,0x15,0xe1,0x21,0x4e,0x94,0xf4,0x20,0x29,0xe7,0x69,0xd7, /* ...gV..!N.. ).i. */ \ + 0xf4,0x89,0xa8,0x5d,0x8e,0xda,0x8d,0x67,0x6f,0x4e,0x78,0x10,0x1a,0xae,0x7d,0x98, /* ...]...goNx...}. */ \ + 0xe3,0xa5,0xfe,0x31,0x47,0xcb,0xed,0x12,0xf0,0x75,0x14,0xe3,0x6a,0x37,0xce,0xbc, /* ...1G....u..j7.. */ \ + 0xc0,0xbb,0x8c,0x8a,0x32,0x87,0xa7,0xcf,0xcb,0x76,0xec,0x46,0x8e,0x74,0x28,0xf2, /* ....2....v.F.t(. */ \ + 0x7b,0x5e,0x17,0xf7,0xfd,0xe2,0x4f,0x86,0x03,0xe8,0x80,0xb7,0x15,0xa1,0xe9,0x97, /* {^....O......... */ \ + 0x10,0x0f,0xe2,0x2f,0x04,0x58,0x6b,0xf6,0xec,0x66,0x56,0x35,0xd6,0x1c,0xaa,0x76, /* .../.Xk..fV5...v */ \ + 0xef,0xf0,0x12,0xb2,0xde,0xb5,0xd6,0x7b,0x0e,0x13,0x50,0x01,0xc2,0xbc,0xa5,0xf6, /* .......{..P..... */ \ + 0xe9,0x74,0xfb,0xcd,0xd5,0x9e,0x77,0xb7,0x37,0xd7,0x7e,0xfe,0xe8,0x19,0x8c,0x05, /* .t....w.7.~..... */ \ + 0xf6,0xff,0x0b,0xa6,0x2b,0xee,0xb4,0xef,0x04,0x00,0x00,0x1f,0x8b,0x08,0x00,0x00, /* ....+........... */ \ + 0x00,0x00,0x00,0x00,0x00,0x6d,0x54,0xdb,0x6e,0xe3,0x20,0x10,0xfd,0x15,0x4b,0x51, /* .....mT.n. ...KQ */ \ + 0xdf,0xea,0xc8,0x97,0x3a,0x8d,0xf0,0xd3,0xfe,0xc4,0xbe,0x56,0xd8,0x8c,0x13,0xb6, /* ....:......V.... */ \ + 0x18,0x2c,0xc0,0x69,0x53,0x94,0x7f,0xdf,0x01,0x63,0x87,0x28,0x7d,0xb1,0xf0,0x30, /* .,.iS....c.(}..0 */ \ + 0x67,0x2e,0x67,0x0e,0xd3,0x29,0x76,0x75,0x83,0x92,0x36,0x1f,0xe8,0xc8,0xc5,0x95, /* g.g..)vu..6..... */ \ + 0xfc,0x05,0xcd,0xa8,0xa4,0xaf,0x7f,0x34,0xa7,0xe2,0xd5,0x50,0x69,0x72,0x03,0x9a, /* .......4...Pir.. */ \ + 0x0f,0xed,0x48,0xf5,0x89,0x4b,0x52,0x64,0x74,0xb6,0xaa,0x9d,0x28,0x63,0x5c,0x9e, /* ..H..KRdt...(c\. */ \ + 0xf0,0xb7,0xc8,0xaa,0x62,0xfa,0x6e,0xbf,0x38,0xb3,0x67,0xf2,0x5e,0xe0,0xf9,0xb6, /* ....b.n.8.g.^... */ \ + 0x9b,0xe8,0x09,0x5c,0x47,0xfb,0xcf,0x93,0x56,0xb3,0x64,0x64,0x37,0x0c,0xc3,0x06, /* ...\G...V.dd7... */ \ + 0x09,0xee,0x21,0xa5,0xe1,0x3f,0x40,0xca,0x6a,0xb2,0x0b,0x22,0xb3,0xcc,0x25,0xf6, /* ..!..?@.j.."..%. */ \ + 0xc2,0xdb,0x2d,0xb7,0x02,0xdc,0x0a,0x7d,0x5b,0x91,0x5f,0xc0,0x4f,0x67,0xeb,0xd3, /* ..-....}[._.Og.. */ \ + 0xb5,0xbd,0x12,0x4a,0x93,0x5d,0x81,0xc7,0xa5,0xc4,0xbc,0x53,0xd6,0xaa,0x91,0x94, /* ...J.].....S.... */ \ + 0x0d,0x7a,0x9f,0x17,0xc7,0xf2,0xe0,0xcb,0x0a,0xc1,0xb2,0xbd,0x80,0xc1,0xba,0x41, /* .z.............A */ \ + 0x28,0x6a,0x89,0x3f,0xb6,0x16,0xbe,0x6d,0x4e,0x05,0x3f,0xc9,0xf0,0x7f,0xdb,0x0d, /* (j.?...mN.?..... */ \ + 0x4a,0x59,0xd0,0x2e,0xc1,0xae,0xc5,0xe7,0x56,0x4d,0xa4,0x4e,0xfe,0x3d,0x80,0x34, /* JY......VM.N.=.4 */ \ + 0x89,0x41,0x07,0x8c,0xb7,0xc4,0xc2,0x8e,0xc7,0x63,0xd2,0xed,0xfe,0xbd,0x81,0xf1, /* .A.......c...... */ \ + 0xb6,0x1b,0x41,0xce,0x69,0x09,0x0b,0x7b,0x65,0x53,0x3c,0x45,0xaa,0x02,0xa1,0x3d, /* ..A.i..{eS. */ \ + 0xf3,0x39,0xa9,0xac,0x95,0xc6,0xc8,0x01,0x4c,0xd6,0x4e,0xef,0x14,0x54,0x8a,0x87, /* .9......L.N..T.. */ \ + 0x98,0x81,0xf7,0xb0,0xe3,0xb4,0x37,0x2e,0x0a,0x2e,0x31,0xf0,0xed,0x2b,0x88,0x1b, /* ......7...1..+.. */ \ + 0xfa,0x6e,0x32,0xcc,0xd9,0x51,0x44,0x92,0x55,0xe9,0xa5,0x34,0x54,0x7d,0x6d,0x10, /* .n2..QD.U..4T}m. */ \ + 0x9c,0x68,0x30,0x1c,0x67,0xd7,0x3d,0xdd,0xdd,0xa0,0xbf,0xd2,0x60,0x8e,0x4e,0x56, /* .h0.g.=.....`.NV */ \ + 0x00,0x31,0x0d,0x75,0x00,0x1b,0x5a,0x43,0xb8,0x8a,0x50,0x85,0xb0,0x20,0x28,0x64, /* .1.u..ZC..P.. (d */ \ + 0x75,0x73,0xe7,0x6c,0x85,0xb7,0xcc,0xc8,0xd1,0x1a,0xac,0x6c,0x88,0x29,0xdd,0x46, /* us.l.......l.).F */ \ + 0x00,0x8c,0x7a,0x4d,0x57,0x3e,0x84,0x99,0x1e,0x0a,0x11,0xcf,0x76,0xef,0x8e,0xe7, /* ..zMW>......v... */ \ + 0x25,0x55,0xb6,0x27,0xdf,0x3d,0xd6,0x39,0x1d,0x6c,0x5e,0xdb,0x81,0x8a,0xe9,0xbc, /* %U.'.=.9.l^..... */ \ + 0x04,0xa1,0xe7,0x45,0xed,0xbb,0xb8,0xf2,0x59,0xce,0x48,0xe8,0xc0,0x30,0x15,0xae, /* ...E....Y.H..0.. */ \ + 0x86,0x41,0xe5,0xe1,0xe1,0x8c,0x89,0x2d,0x3b,0xf6,0xa9,0x73,0x7d,0x72,0x25,0x26, /* .A.....-;..s}r%& */ \ + 0xb4,0x93,0x0a,0x1b,0x26,0xa1,0xce,0x42,0x0a,0xba,0xd2,0x6a,0x4e,0xf2,0x15,0x2a, /* ....&..B...jN... */ \ + 0x96,0xe8,0x92,0xaa,0xfa,0x4d,0x17,0xf0,0x47,0x15,0x67,0x6b,0x03,0xa7,0xc2,0xea, /* .....M..G.gk.... */ \ + 0x06,0x44,0xb8,0xea,0xc6,0xc8,0x7a,0x46,0x39,0xd1,0xd4,0xfc,0xf0,0x9b,0xc2,0xa2, /* .D....zF9....... */ \ + 0xfd,0xde,0xfe,0xcc,0x4f,0x29,0x9a,0xf7,0xee,0xd5,0xf7,0x10,0xca,0x02,0x12,0x04, /* ....O).......... */ \ + 0x20,0x46,0x09,0xda,0x56,0x2e,0xa6,0x64,0x12,0xb6,0x84,0x90,0xa5,0x17,0xc2,0x5e, /* F..V..d.......^ */ \ + 0x17,0x60,0x2e,0xed,0x60,0xc1,0xd7,0xfe,0x87,0x0a,0xaf,0xc5,0x39,0x6e,0x29,0x4f, /* .`..`.......9n)O */ \ + 0xc2,0xf7,0x20,0xc8,0x8a,0x65,0x5c,0x3e,0xab,0xd2,0x91,0x62,0xc7,0xaa,0xfa,0xe2, /* .. ..e\>...b.... */ \ + 0xa8,0x8c,0x52,0x33,0x5f,0x31,0xdc,0x6a,0xc9,0x27,0x43,0x97,0x8e,0x99,0x18,0xa7, /* ..R3_1.j.'C..... */ \ + 0xb4,0x95,0xe5,0x79,0x6c,0x4e,0x64,0xa7,0x87,0x44,0xca,0xef,0x8e,0x54,0xc8,0x36, /* ...ylNd..D...T.6 */ \ + 0x08,0x2b,0x8a,0x7f,0x35,0xb5,0x73,0x55,0xa2,0xe4,0xc9,0xb6,0x09,0x43,0xd3,0xc2, /* .+..5.sU.....C.. */ \ + 0x48,0xdd,0xdd,0xcc,0x53,0xba,0xb7,0xb2,0x61,0x3a,0x08,0xd3,0x23,0xc7,0xb0,0xcb, /* H...S...a:..#... */ \ + 0x5a,0x2e,0xbb,0x97,0x30,0x01,0x73,0x1e,0x8a,0x72,0xc0,0xc0,0x2b,0xf5,0x74,0xdf, /* Z...0.s..r..+.t. */ \ + 0x9e,0x2c,0xba,0x8c,0x83,0x11,0xc8,0xda,0x7c,0x70,0xc0,0x3f,0x24,0xce,0xc8,0x82, /* .,......|p.?$... */ \ + 0xb1,0xd8,0x20,0x09,0x5d,0x61,0xc2,0x26,0x1d,0x97,0x88,0x65,0xc4,0x95,0x59,0xfe, /* .. .]a.&...e..Y. */ \ + 0x3e,0xa3,0x45,0x7e,0x61,0x46,0xcf,0x19,0xae,0x71,0xe7,0xe4,0xb8,0xb7,0x66,0x8f, /* >.E~aF...q....f. */ \ + 0x93,0xb6,0x91,0x53,0x4e,0x3b,0x13,0x67,0xc4,0x92,0xa1,0xb3,0xed,0x0b,0x33,0xd9, /* ...SN;.g......3. */ \ + 0x25,0xf6,0x20,0x3f,0x2f,0xf1,0xce,0x16,0x72,0x6a,0xcf,0x28,0xb8,0x21,0x42,0x6d, /* %. ?/...rj.(.!Bm */ \ + 0x7d,0x3b,0xd0,0xae,0xd6,0x71,0xac,0xf8,0x34,0x88,0xa7,0x37,0x85,0x47,0xdf,0xb1, /* };...q..4..7.G.. */ \ + 0xc5,0xc6,0xb0,0x84,0x08,0xc1,0x3c,0xbf,0x76,0xab,0xc5,0x6b,0x14,0x5f,0x69,0x8a, /* ......<.v..k._i. */ \ + 0x69,0xd6,0x0b,0x6c,0x57,0x33,0x79,0x61,0x77,0x36,0x53,0x5e,0x34,0x13,0xe4,0x5d, /* i..lW3yaw6S^4..] */ \ + 0xad,0x17,0x81,0xdc,0xd7,0xd7,0x1e,0x72,0xcf,0x92,0x89,0xa7,0x76,0x82,0xda,0x0a, /* .......r....v... */ \ + 0x8b,0x49,0xb7,0x40,0x18,0x80,0x50,0x98,0x26,0x3f,0x2c,0xef,0x4c,0x77,0x53,0xce, /* .I.@..P.&?,.LwS. */ \ + 0xf7,0x96,0x83,0x8c,0x90,0x6a,0x70,0xb4,0xe4,0x5e,0xe8,0x40,0x97,0xaa,0xc3,0x6a, /* .....jp..^.@...j */ \ + 0x3e,0xcb,0xbd,0x1f,0xcf,0xd5,0x2d,0x54,0x47,0xe8,0x27,0x71,0x34,0xb8,0xb3,0xc0, /* >.....-TG.'q4... */ \ + 0x75,0x7b,0x21,0xc2,0xf9,0x07,0xcd,0x57,0x16,0x1f,0x45,0x54,0xd3,0x9a,0x91,0x22, /* u{!....W..ET..." */ \ + 0x1d,0xa6,0xa2,0x9a,0x59,0xb4,0x5b,0x70,0x4a,0x07,0xcd,0xef,0xff,0x80,0x4e,0x23, /* ....Y.[pJ.....N# */ \ + 0x92,0x0e,0x08,0x00,0x00 /* ..... */ + + +}; + +/************************************** + * MPFS2 C linkable symbols + **************************************/ +// The entire data array is defined as a single variable to +// ensure that the linker does not reorder the data chunks in Flash when compiler +// optimizations are turned on. +struct MEDIA_STORAGE_PARTITION_INFO +{ + const char* partName; // name that identifies the partition + // valid names: "mpfs2", "tcpip_storage"; + unsigned long partStartOffset; // the absolute starting offset on that media + unsigned long partSize; // size of the partition, in bytes +} MPFS_IMAGE_PARTITION_INFO = +{ + "mpfs2", + (unsigned long)NVM_MEDIA_DATA, + sizeof(NVM_MEDIA_DATA), +}; + +/************************************************************** + * End of MPFS + **************************************************************/ diff --git a/software/aws-iot-ethernet/firmware/src/parson.c b/software/aws-iot-ethernet/firmware/src/parson.c new file mode 100755 index 0000000..d2cc1af --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/parson.c @@ -0,0 +1,1759 @@ +/* + Parson ( http://kgabis.github.com/parson/ ) + Copyright (c) 2012 - 2015 Krzysztof Gabis + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "parson.h" + +#include +#include +#include +#include +#include + +#define STARTING_CAPACITY 15 +#define ARRAY_MAX_CAPACITY 122880 /* 15*(2^13) */ +#define OBJECT_MAX_CAPACITY 960 /* 15*(2^6) */ +#define MAX_NESTING 19 +#define DOUBLE_SERIALIZATION_FORMAT "%f" + +#define SIZEOF_TOKEN(a) (sizeof(a) - 1) +#define SKIP_CHAR(str) ((*str)++) +#define SKIP_WHITESPACES(str) while (isspace(**str)) { SKIP_CHAR(str); } +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#undef malloc +#undef free + +static JSON_Malloc_Function parson_malloc = malloc; +static JSON_Free_Function parson_free = free; + +#define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */ + +/* Type definitions */ +typedef union json_value_value { + char *string; + double number; + JSON_Object *object; + JSON_Array *array; + int boolean; + int null; +} JSON_Value_Value; + +struct json_value_t { + JSON_Value_Type type; + JSON_Value_Value value; +}; + +struct json_object_t { + char **names; + JSON_Value **values; + size_t count; + size_t capacity; +}; + +struct json_array_t { + JSON_Value **items; + size_t count; + size_t capacity; +}; + +/* Various */ +static char * read_file(const char *filename); +static void remove_comments(char *string, const char *start_token, const char *end_token); +static char * parson_strndup(const char *string, size_t n); +static char * parson_strdup(const char *string); +static int is_utf16_hex(const unsigned char *string); +static int num_bytes_in_utf8_sequence(unsigned char c); +static int verify_utf8_sequence(const unsigned char *string, int *len); +static int is_valid_utf8(const char *string, size_t string_len); +static int is_decimal(const char *string, size_t length); + +/* JSON Object */ +static JSON_Object * json_object_init(void); +static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_Value *value); +static JSON_Status json_object_resize(JSON_Object *object, size_t new_capacity); +static JSON_Value * json_object_nget_value(const JSON_Object *object, const char *name, size_t n); +static void json_object_free(JSON_Object *object); + +/* JSON Array */ +static JSON_Array * json_array_init(void); +static JSON_Status json_array_add(JSON_Array *array, JSON_Value *value); +static JSON_Status json_array_resize(JSON_Array *array, size_t new_capacity); +static void json_array_free(JSON_Array *array); + +/* JSON Value */ +static JSON_Value * json_value_init_string_no_copy(char *string); + +/* Parser */ +static void skip_quotes(const char **string); +static int parse_utf_16(const char **unprocessed, char **processed); +static char * process_string(const char *input, size_t len); +static char * get_quoted_string(const char **string); +static JSON_Value * parse_object_value(const char **string, size_t nesting); +static JSON_Value * parse_array_value(const char **string, size_t nesting); +static JSON_Value * parse_string_value(const char **string); +static JSON_Value * parse_boolean_value(const char **string); +static JSON_Value * parse_number_value(const char **string); +static JSON_Value * parse_null_value(const char **string); +static JSON_Value * parse_value(const char **string, size_t nesting); + +/* Serialization */ +static int json_serialize_to_buffer_r(const JSON_Value *value, char *buf, int level, int is_pretty, char *num_buf); +static int json_serialize_string(const char *string, char *buf); +static int append_indent(char *buf, int level); +static int append_string(char *buf, const char *string); + +/* Various */ +static char * parson_strndup(const char *string, size_t n) { + char *output_string = (char*)parson_malloc(n + 1); + if (!output_string) + return NULL; + output_string[n] = '\0'; + strncpy(output_string, string, n); + return output_string; +} + +static char * parson_strdup(const char *string) { + return parson_strndup(string, strlen(string)); +} + +static int is_utf16_hex(const unsigned char *s) { + return isxdigit(s[0]) && isxdigit(s[1]) && isxdigit(s[2]) && isxdigit(s[3]); +} + +static int num_bytes_in_utf8_sequence(unsigned char c) { + if (c == 0xC0 || c == 0xC1 || c > 0xF4 || IS_CONT(c)) { + return 0; + } else if ((c & 0x80) == 0) { /* 0xxxxxxx */ + return 1; + } else if ((c & 0xE0) == 0xC0) { /* 110xxxxx */ + return 2; + } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx */ + return 3; + } else if ((c & 0xF8) == 0xF0) { /* 11110xxx */ + return 4; + } + return 0; /* won't happen */ +} + +static int verify_utf8_sequence(const unsigned char *string, int *len) { + unsigned int cp = 0; + *len = num_bytes_in_utf8_sequence(string[0]); + + if (*len == 1) { + cp = string[0]; + } else if (*len == 2 && IS_CONT(string[1])) { + cp = string[0] & 0x1F; + cp = (cp << 6) | (string[1] & 0x3F); + } else if (*len == 3 && IS_CONT(string[1]) && IS_CONT(string[2])) { + cp = ((unsigned char)string[0]) & 0xF; + cp = (cp << 6) | (string[1] & 0x3F); + cp = (cp << 6) | (string[2] & 0x3F); + } else if (*len == 4 && IS_CONT(string[1]) && IS_CONT(string[2]) && IS_CONT(string[3])) { + cp = string[0] & 0x7; + cp = (cp << 6) | (string[1] & 0x3F); + cp = (cp << 6) | (string[2] & 0x3F); + cp = (cp << 6) | (string[3] & 0x3F); + } else { + return 0; + } + + /* overlong encodings */ + if ((cp < 0x80 && *len > 1) || + (cp < 0x800 && *len > 2) || + (cp < 0x10000 && *len > 3)) { + return 0; + } + + /* invalid unicode */ + if (cp > 0x10FFFF) { + return 0; + } + + /* surrogate halves */ + if (cp >= 0xD800 && cp <= 0xDFFF) { + return 0; + } + + return 1; +} + +static int is_valid_utf8(const char *string, size_t string_len) { + int len = 0; + const char *string_end = string + string_len; + while (string < string_end) { + if (!verify_utf8_sequence((const unsigned char*)string, &len)) { + return 0; + } + string += len; + } + return 1; +} + +static int is_decimal(const char *string, size_t length) { + if (length > 1 && string[0] == '0' && string[1] != '.') + return 0; + if (length > 2 && !strncmp(string, "-0", 2) && string[2] != '.') + return 0; + while (length--) + if (strchr("xX", string[length])) + return 0; + return 1; +} + +static char * read_file(const char * filename) { + FILE *fp = fopen(filename, "r"); + size_t file_size; + long pos; + char *file_contents; + if (!fp) + return NULL; + fseek(fp, 0L, SEEK_END); + pos = ftell(fp); + if (pos < 0) { + fclose(fp); + return NULL; + } + file_size = pos; + rewind(fp); + file_contents = (char*)parson_malloc(sizeof(char) * (file_size + 1)); + if (!file_contents) { + fclose(fp); + return NULL; + } + if (fread(file_contents, file_size, 1, fp) < 1) { + if (ferror(fp)) { + fclose(fp); + parson_free(file_contents); + return NULL; + } + } + fclose(fp); + file_contents[file_size] = '\0'; + return file_contents; +} + +static void remove_comments(char *string, const char *start_token, const char *end_token) { + int in_string = 0, escaped = 0; + size_t i; + char *ptr = NULL, current_char; + size_t start_token_len = strlen(start_token); + size_t end_token_len = strlen(end_token); + if (start_token_len == 0 || end_token_len == 0) + return; + while ((current_char = *string) != '\0') { + if (current_char == '\\' && !escaped) { + escaped = 1; + string++; + continue; + } else if (current_char == '\"' && !escaped) { + in_string = !in_string; + } else if (!in_string && strncmp(string, start_token, start_token_len) == 0) { + for(i = 0; i < start_token_len; i++) + string[i] = ' '; + string = string + start_token_len; + ptr = strstr(string, end_token); + if (!ptr) + return; + for (i = 0; i < (ptr - string) + end_token_len; i++) + string[i] = ' '; + string = ptr + end_token_len - 1; + } + escaped = 0; + string++; + } +} + +/* JSON Object */ +static JSON_Object * json_object_init(void) { + JSON_Object *new_obj = (JSON_Object*)parson_malloc(sizeof(JSON_Object)); + if (!new_obj) + return NULL; + new_obj->names = (char**)NULL; + new_obj->values = (JSON_Value**)NULL; + new_obj->capacity = 0; + new_obj->count = 0; + return new_obj; +} + +static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_Value *value) { + size_t index = 0; + if (object == NULL || name == NULL || value == NULL) { + return JSONFailure; + } + if (object->count >= object->capacity) { + size_t new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY); + if (new_capacity > OBJECT_MAX_CAPACITY) + return JSONFailure; + if (json_object_resize(object, new_capacity) == JSONFailure) + return JSONFailure; + } + if (json_object_get_value(object, name) != NULL) + return JSONFailure; + index = object->count; + object->names[index] = parson_strdup(name); + if (object->names[index] == NULL) + return JSONFailure; + object->values[index] = value; + object->count++; + return JSONSuccess; +} + +static JSON_Status json_object_resize(JSON_Object *object, size_t new_capacity) { + char **temp_names = NULL; + JSON_Value **temp_values = NULL; + + if ((object->names == NULL && object->values != NULL) || + (object->names != NULL && object->values == NULL) || + new_capacity == 0) { + return JSONFailure; /* Shouldn't happen */ + } + + temp_names = (char**)parson_malloc(new_capacity * sizeof(char*)); + if (temp_names == NULL) + return JSONFailure; + + temp_values = (JSON_Value**)parson_malloc(new_capacity * sizeof(JSON_Value*)); + if (temp_names == NULL) { + parson_free(temp_names); + return JSONFailure; + } + + if (object->names != NULL && object->values != NULL && object->count > 0) { + memcpy(temp_names, object->names, object->count * sizeof(char*)); + memcpy(temp_values, object->values, object->count * sizeof(JSON_Value*)); + } + parson_free(object->names); + parson_free(object->values); + object->names = temp_names; + object->values = temp_values; + object->capacity = new_capacity; + return JSONSuccess; +} + +static JSON_Value * json_object_nget_value(const JSON_Object *object, const char *name, size_t n) { + size_t i, name_length; + for (i = 0; i < json_object_get_count(object); i++) { + name_length = strlen(object->names[i]); + if (name_length != n) + continue; + if (strncmp(object->names[i], name, n) == 0) + return object->values[i]; + } + return NULL; +} + +static void json_object_free(JSON_Object *object) { + while(object->count--) { + parson_free(object->names[object->count]); + json_value_free(object->values[object->count]); + } + parson_free(object->names); + parson_free(object->values); + parson_free(object); +} + +/* JSON Array */ +static JSON_Array * json_array_init(void) { + JSON_Array *new_array = (JSON_Array*)parson_malloc(sizeof(JSON_Array)); + if (!new_array) + return NULL; + new_array->items = (JSON_Value**)NULL; + new_array->capacity = 0; + new_array->count = 0; + return new_array; +} + +static JSON_Status json_array_add(JSON_Array *array, JSON_Value *value) { + if (array->count >= array->capacity) { + size_t new_capacity = MAX(array->capacity * 2, STARTING_CAPACITY); + if (new_capacity > ARRAY_MAX_CAPACITY) + return JSONFailure; + if (json_array_resize(array, new_capacity) == JSONFailure) + return JSONFailure; + } + array->items[array->count] = value; + array->count++; + return JSONSuccess; +} + +static JSON_Status json_array_resize(JSON_Array *array, size_t new_capacity) { + JSON_Value **new_items = NULL; + if (new_capacity == 0) { + return JSONFailure; + } + new_items = parson_malloc(new_capacity * sizeof(JSON_Value*)); + if (new_items == NULL) { + return JSONFailure; + } + if (array->items != NULL && array->count > 0) { + memcpy(new_items, array->items, array->count * sizeof(JSON_Value*)); + } + parson_free(array->items); + array->items = new_items; + array->capacity = new_capacity; + return JSONSuccess; +} + +static void json_array_free(JSON_Array *array) { + while (array->count--) + json_value_free(array->items[array->count]); + parson_free(array->items); + parson_free(array); +} + +/* JSON Value */ +static JSON_Value * json_value_init_string_no_copy(char *string) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONString; + new_value->value.string = string; + return new_value; +} + +/* Parser */ +static void skip_quotes(const char **string) { + SKIP_CHAR(string); + while (**string != '\"') { + if (**string == '\0') + return; + if (**string == '\\') { + SKIP_CHAR(string); + if (**string == '\0') + return; + } + SKIP_CHAR(string); + } + SKIP_CHAR(string); +} + +static int parse_utf_16(const char **unprocessed, char **processed) { + unsigned int cp, lead, trail; + char *processed_ptr = *processed; + const char *unprocessed_ptr = *unprocessed; + unprocessed_ptr++; /* skips u */ + if (!is_utf16_hex((const unsigned char*)unprocessed_ptr) || sscanf(unprocessed_ptr, "%4x", &cp) == EOF) + return JSONFailure; + if (cp < 0x80) { + *processed_ptr = cp; /* 0xxxxxxx */ + } else if (cp < 0x800) { + *processed_ptr++ = ((cp >> 6) & 0x1F) | 0xC0; /* 110xxxxx */ + *processed_ptr = ((cp ) & 0x3F) | 0x80; /* 10xxxxxx */ + } else if (cp < 0xD800 || cp > 0xDFFF) { + *processed_ptr++ = ((cp >> 12) & 0x0F) | 0xE0; /* 1110xxxx */ + *processed_ptr++ = ((cp >> 6) & 0x3F) | 0x80; /* 10xxxxxx */ + *processed_ptr = ((cp ) & 0x3F) | 0x80; /* 10xxxxxx */ + } else if (cp >= 0xD800 && cp <= 0xDBFF) { /* lead surrogate (0xD800..0xDBFF) */ + lead = cp; + unprocessed_ptr += 4; /* should always be within the buffer, otherwise previous sscanf would fail */ + if (*unprocessed_ptr++ != '\\' || *unprocessed_ptr++ != 'u' || /* starts with \u? */ + !is_utf16_hex((const unsigned char*)unprocessed_ptr) || + sscanf(unprocessed_ptr, "%4x", &trail) == EOF || + trail < 0xDC00 || trail > 0xDFFF) { /* valid trail surrogate? (0xDC00..0xDFFF) */ + return JSONFailure; + } + cp = ((((lead-0xD800)&0x3FF)<<10)|((trail-0xDC00)&0x3FF))+0x010000; + *processed_ptr++ = (((cp >> 18) & 0x07) | 0xF0); /* 11110xxx */ + *processed_ptr++ = (((cp >> 12) & 0x3F) | 0x80); /* 10xxxxxx */ + *processed_ptr++ = (((cp >> 6) & 0x3F) | 0x80); /* 10xxxxxx */ + *processed_ptr = (((cp ) & 0x3F) | 0x80); /* 10xxxxxx */ + } else { /* trail surrogate before lead surrogate */ + return JSONFailure; + } + unprocessed_ptr += 3; + *processed = processed_ptr; + *unprocessed = unprocessed_ptr; + return JSONSuccess; +} + + +/* Copies and processes passed string up to supplied length. +Example: "\u006Corem ipsum" -> lorem ipsum */ +static char* process_string(const char *input, size_t len) { + const char *input_ptr = input; + size_t initial_size = (len + 1) * sizeof(char); + size_t final_size = 0; + char *output = (char*)parson_malloc(initial_size); + char *output_ptr = output; + char *resized_output = NULL; + while ((*input_ptr != '\0') && (size_t)(input_ptr - input) < len) { + if (*input_ptr == '\\') { + input_ptr++; + switch (*input_ptr) { + case '\"': *output_ptr = '\"'; break; + case '\\': *output_ptr = '\\'; break; + case '/': *output_ptr = '/'; break; + case 'b': *output_ptr = '\b'; break; + case 'f': *output_ptr = '\f'; break; + case 'n': *output_ptr = '\n'; break; + case 'r': *output_ptr = '\r'; break; + case 't': *output_ptr = '\t'; break; + case 'u': + if (parse_utf_16(&input_ptr, &output_ptr) == JSONFailure) + goto error; + break; + default: + goto error; + } + } else if ((unsigned char)*input_ptr < 0x20) { + goto error; /* 0x00-0x19 are invalid characters for json string (http://www.ietf.org/rfc/rfc4627.txt) */ + } else { + *output_ptr = *input_ptr; + } + output_ptr++; + input_ptr++; + } + *output_ptr = '\0'; + /* resize to new length */ + final_size = (size_t)(output_ptr-output) + 1; + resized_output = (char*)parson_malloc(final_size); + if (resized_output == NULL) + goto error; + memcpy(resized_output, output, final_size); + parson_free(output); + return resized_output; +error: + parson_free(output); + return NULL; +} + +/* Return processed contents of a string between quotes and + skips passed argument to a matching quote. */ +static char * get_quoted_string(const char **string) { + const char *string_start = *string; + size_t string_len = 0; + skip_quotes(string); + if (**string == '\0') + return NULL; + string_len = *string - string_start - 2; /* length without quotes */ + return process_string(string_start + 1, string_len); +} + +static JSON_Value * parse_value(const char **string, size_t nesting) { + if (nesting > MAX_NESTING) + return NULL; + SKIP_WHITESPACES(string); + switch (**string) { + case '{': + return parse_object_value(string, nesting + 1); + case '[': + return parse_array_value(string, nesting + 1); + case '\"': + return parse_string_value(string); + case 'f': case 't': + return parse_boolean_value(string); + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return parse_number_value(string); + case 'n': + return parse_null_value(string); + default: + return NULL; + } +} + +static JSON_Value * parse_object_value(const char **string, size_t nesting) { + JSON_Value *output_value = json_value_init_object(), *new_value = NULL; + JSON_Object *output_object = json_value_get_object(output_value); + char *new_key = NULL; + if (output_value == NULL) + return NULL; + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + if (**string == '}') { /* empty object */ + SKIP_CHAR(string); + return output_value; + } + while (**string != '\0') { + new_key = get_quoted_string(string); + SKIP_WHITESPACES(string); + if (new_key == NULL || **string != ':') { + json_value_free(output_value); + return NULL; + } + SKIP_CHAR(string); + new_value = parse_value(string, nesting); + if (new_value == NULL) { + parson_free(new_key); + json_value_free(output_value); + return NULL; + } + if(json_object_add(output_object, new_key, new_value) == JSONFailure) { + parson_free(new_key); + parson_free(new_value); + json_value_free(output_value); + return NULL; + } + parson_free(new_key); + SKIP_WHITESPACES(string); + if (**string != ',') + break; + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + } + SKIP_WHITESPACES(string); + if (**string != '}' || /* Trim object after parsing is over */ + json_object_resize(output_object, json_object_get_count(output_object)) == JSONFailure) { + json_value_free(output_value); + return NULL; + } + SKIP_CHAR(string); + return output_value; +} + +static JSON_Value * parse_array_value(const char **string, size_t nesting) { + JSON_Value *output_value = json_value_init_array(), *new_array_value = NULL; + JSON_Array *output_array = json_value_get_array(output_value); + if (!output_value) + return NULL; + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + if (**string == ']') { /* empty array */ + SKIP_CHAR(string); + return output_value; + } + while (**string != '\0') { + new_array_value = parse_value(string, nesting); + if (!new_array_value) { + json_value_free(output_value); + return NULL; + } + if(json_array_add(output_array, new_array_value) == JSONFailure) { + parson_free(new_array_value); + json_value_free(output_value); + return NULL; + } + SKIP_WHITESPACES(string); + if (**string != ',') + break; + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + } + SKIP_WHITESPACES(string); + if (**string != ']' || /* Trim array after parsing is over */ + json_array_resize(output_array, json_array_get_count(output_array)) == JSONFailure) { + json_value_free(output_value); + return NULL; + } + SKIP_CHAR(string); + return output_value; +} + +static JSON_Value * parse_string_value(const char **string) { + JSON_Value *value = NULL; + char *new_string = get_quoted_string(string); + if (new_string == NULL) + return NULL; + value = json_value_init_string_no_copy(new_string); + if (value == NULL) { + parson_free(new_string); + return NULL; + } + return value; +} + +static JSON_Value * parse_boolean_value(const char **string) { + size_t true_token_size = SIZEOF_TOKEN("true"); + size_t false_token_size = SIZEOF_TOKEN("false"); + if (strncmp("true", *string, true_token_size) == 0) { + *string += true_token_size; + return json_value_init_boolean(1); + } else if (strncmp("false", *string, false_token_size) == 0) { + *string += false_token_size; + return json_value_init_boolean(0); + } + return NULL; +} + +static JSON_Value * parse_number_value(const char **string) { + char *end; + double number = strtod(*string, &end); + JSON_Value *output_value; + if (is_decimal(*string, end - *string)) { + *string = end; + output_value = json_value_init_number(number); + } else { + output_value = NULL; + } + return output_value; +} + +static JSON_Value * parse_null_value(const char **string) { + size_t token_size = SIZEOF_TOKEN("null"); + if (strncmp("null", *string, token_size) == 0) { + *string += token_size; + return json_value_init_null(); + } + return NULL; +} + +/* Serialization */ +#define APPEND_STRING(str) do { written = append_string(buf, (str)); \ + if (written < 0) { return -1; } \ + if (buf != NULL) { buf += written; } \ + written_total += written; } while(0) + +#define APPEND_INDENT(level) do { written = append_indent(buf, (level)); \ + if (written < 0) { return -1; } \ + if (buf != NULL) { buf += written; } \ + written_total += written; } while(0) + +static int json_serialize_to_buffer_r(const JSON_Value *value, char *buf, int level, int is_pretty, char *num_buf) +{ + const char *key = NULL, *string = NULL; + JSON_Value *temp_value = NULL; + JSON_Array *array = NULL; + JSON_Object *object = NULL; + size_t i = 0, count = 0; + double num = 0.0; + int written = -1, written_total = 0; + + switch (json_value_get_type(value)) { + case JSONArray: + array = json_value_get_array(value); + count = json_array_get_count(array); + APPEND_STRING("["); + if (count > 0 && is_pretty) + APPEND_STRING("\n"); + for (i = 0; i < count; i++) { + if (is_pretty) + APPEND_INDENT(level+1); + temp_value = json_array_get_value(array, i); + written = json_serialize_to_buffer_r(temp_value, buf, level+1, is_pretty, num_buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + if (i < (count - 1)) + APPEND_STRING(","); + if (is_pretty) + APPEND_STRING("\n"); + } + if (count > 0 && is_pretty) + APPEND_INDENT(level); + APPEND_STRING("]"); + return written_total; + case JSONObject: + object = json_value_get_object(value); + count = json_object_get_count(object); + APPEND_STRING("{"); + if (count > 0 && is_pretty) + APPEND_STRING("\n"); + for (i = 0; i < count; i++) { + key = json_object_get_name(object, i); + if (is_pretty) + APPEND_INDENT(level+1); + written = json_serialize_string(key, buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + APPEND_STRING(":"); + if (is_pretty) + APPEND_STRING(" "); + temp_value = json_object_get_value(object, key); + written = json_serialize_to_buffer_r(temp_value, buf, level+1, is_pretty, num_buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + if (i < (count - 1)) + APPEND_STRING(","); + if (is_pretty) + APPEND_STRING("\n"); + } + if (count > 0 && is_pretty) + APPEND_INDENT(level); + APPEND_STRING("}"); + return written_total; + case JSONString: + string = json_value_get_string(value); + written = json_serialize_string(string, buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + return written_total; + case JSONBoolean: + if (json_value_get_boolean(value)) + APPEND_STRING("true"); + else + APPEND_STRING("false"); + return written_total; + case JSONNumber: + num = json_value_get_number(value); + if (buf != NULL) + num_buf = buf; + if (num == ((double)(int)num)) /* check if num is integer */ + written = sprintf(num_buf, "%d", (int)num); + else + written = sprintf(num_buf, DOUBLE_SERIALIZATION_FORMAT, num); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + return written_total; + case JSONNull: + APPEND_STRING("null"); + return written_total; + case JSONError: + return -1; + default: + return -1; + } +} + +static int json_serialize_string(const char *string, char *buf) { + size_t i = 0, len = strlen(string); + char c = '\0'; + int written = -1, written_total = 0; + APPEND_STRING("\""); + for (i = 0; i < len; i++) { + c = string[i]; + switch (c) { + case '\"': APPEND_STRING("\\\""); break; + case '\\': APPEND_STRING("\\\\"); break; + case '\b': APPEND_STRING("\\b"); break; + case '\f': APPEND_STRING("\\f"); break; + case '\n': APPEND_STRING("\\n"); break; + case '\r': APPEND_STRING("\\r"); break; + case '\t': APPEND_STRING("\\t"); break; + default: + if (buf != NULL) { + buf[0] = c; + buf += 1; + } + written_total += 1; + break; + } + } + APPEND_STRING("\""); + return written_total; +} + +static int append_indent(char *buf, int level) { + int i; + int written = -1, written_total = 0; + for (i = 0; i < level; i++) { + APPEND_STRING(" "); + } + return written_total; +} + +static int append_string(char *buf, const char *string) { + if (buf == NULL) { + return (int)strlen(string); + } + return sprintf(buf, "%s", string); +} + +#undef APPEND_STRING +#undef APPEND_INDENT + +/* Parser API */ +JSON_Value * json_parse_file(const char *filename) { + char *file_contents = read_file(filename); + JSON_Value *output_value = NULL; + if (file_contents == NULL) + return NULL; + output_value = json_parse_string(file_contents); + parson_free(file_contents); + return output_value; +} + +JSON_Value * json_parse_file_with_comments(const char *filename) { + char *file_contents = read_file(filename); + JSON_Value *output_value = NULL; + if (file_contents == NULL) + return NULL; + output_value = json_parse_string_with_comments(file_contents); + parson_free(file_contents); + return output_value; +} + +JSON_Value * json_parse_string(const char *string) { + if (string == NULL) + return NULL; + SKIP_WHITESPACES(&string); + if (*string != '{' && *string != '[') + return NULL; + return parse_value((const char**)&string, 0); +} + +JSON_Value * json_parse_string_with_comments(const char *string) { + JSON_Value *result = NULL; + char *string_mutable_copy = NULL, *string_mutable_copy_ptr = NULL; + string_mutable_copy = parson_strdup(string); + if (string_mutable_copy == NULL) + return NULL; + remove_comments(string_mutable_copy, "/*", "*/"); + remove_comments(string_mutable_copy, "//", "\n"); + string_mutable_copy_ptr = string_mutable_copy; + SKIP_WHITESPACES(&string_mutable_copy_ptr); + if (*string_mutable_copy_ptr != '{' && *string_mutable_copy_ptr != '[') { + parson_free(string_mutable_copy); + return NULL; + } + result = parse_value((const char**)&string_mutable_copy_ptr, 0); + parson_free(string_mutable_copy); + return result; +} + + +/* JSON Object API */ + +JSON_Value * json_object_get_value(const JSON_Object *object, const char *name) { + if (object == NULL || name == NULL) + return NULL; + return json_object_nget_value(object, name, strlen(name)); +} + +const char * json_object_get_string(const JSON_Object *object, const char *name) { + return json_value_get_string(json_object_get_value(object, name)); +} + +double json_object_get_number(const JSON_Object *object, const char *name) { + return json_value_get_number(json_object_get_value(object, name)); +} + +JSON_Object * json_object_get_object(const JSON_Object *object, const char *name) { + return json_value_get_object(json_object_get_value(object, name)); +} + +JSON_Array * json_object_get_array(const JSON_Object *object, const char *name) { + return json_value_get_array(json_object_get_value(object, name)); +} + +int json_object_get_boolean(const JSON_Object *object, const char *name) { + return json_value_get_boolean(json_object_get_value(object, name)); +} + +JSON_Value * json_object_dotget_value(const JSON_Object *object, const char *name) { + const char *dot_position = strchr(name, '.'); + if (!dot_position) + return json_object_get_value(object, name); + object = json_value_get_object(json_object_nget_value(object, name, dot_position - name)); + return json_object_dotget_value(object, dot_position + 1); +} + +const char * json_object_dotget_string(const JSON_Object *object, const char *name) { + return json_value_get_string(json_object_dotget_value(object, name)); +} + +double json_object_dotget_number(const JSON_Object *object, const char *name) { + return json_value_get_number(json_object_dotget_value(object, name)); +} + +JSON_Object * json_object_dotget_object(const JSON_Object *object, const char *name) { + return json_value_get_object(json_object_dotget_value(object, name)); +} + +JSON_Array * json_object_dotget_array(const JSON_Object *object, const char *name) { + return json_value_get_array(json_object_dotget_value(object, name)); +} + +int json_object_dotget_boolean(const JSON_Object *object, const char *name) { + return json_value_get_boolean(json_object_dotget_value(object, name)); +} + +size_t json_object_get_count(const JSON_Object *object) { + return object ? object->count : 0; +} + +const char * json_object_get_name(const JSON_Object *object, size_t index) { + if (index >= json_object_get_count(object)) + return NULL; + return object->names[index]; +} + +/* JSON Array API */ +JSON_Value * json_array_get_value(const JSON_Array *array, size_t index) { + if (index >= json_array_get_count(array)) + return NULL; + return array->items[index]; +} + +const char * json_array_get_string(const JSON_Array *array, size_t index) { + return json_value_get_string(json_array_get_value(array, index)); +} + +double json_array_get_number(const JSON_Array *array, size_t index) { + return json_value_get_number(json_array_get_value(array, index)); +} + +JSON_Object * json_array_get_object(const JSON_Array *array, size_t index) { + return json_value_get_object(json_array_get_value(array, index)); +} + +JSON_Array * json_array_get_array(const JSON_Array *array, size_t index) { + return json_value_get_array(json_array_get_value(array, index)); +} + +int json_array_get_boolean(const JSON_Array *array, size_t index) { + return json_value_get_boolean(json_array_get_value(array, index)); +} + +size_t json_array_get_count(const JSON_Array *array) { + return array ? array->count : 0; +} + +/* JSON Value API */ +JSON_Value_Type json_value_get_type(const JSON_Value *value) { + return value ? value->type : JSONError; +} + +JSON_Object * json_value_get_object(const JSON_Value *value) { + return json_value_get_type(value) == JSONObject ? value->value.object : NULL; +} + +JSON_Array * json_value_get_array(const JSON_Value *value) { + return json_value_get_type(value) == JSONArray ? value->value.array : NULL; +} + +const char * json_value_get_string(const JSON_Value *value) { + return json_value_get_type(value) == JSONString ? value->value.string : NULL; +} + +double json_value_get_number(const JSON_Value *value) { + return json_value_get_type(value) == JSONNumber ? value->value.number : 0; +} + +int json_value_get_boolean(const JSON_Value *value) { + return json_value_get_type(value) == JSONBoolean ? value->value.boolean : -1; +} + +void json_value_free(JSON_Value *value) { + switch (json_value_get_type(value)) { + case JSONObject: + json_object_free(value->value.object); + break; + case JSONString: + if (value->value.string) { parson_free(value->value.string); } + break; + case JSONArray: + json_array_free(value->value.array); + break; + default: + break; + } + parson_free(value); +} + +JSON_Value * json_value_init_object(void) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONObject; + new_value->value.object = json_object_init(); + if (!new_value->value.object) { + parson_free(new_value); + return NULL; + } + return new_value; +} + +JSON_Value * json_value_init_array(void) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONArray; + new_value->value.array = json_array_init(); + if (!new_value->value.array) { + parson_free(new_value); + return NULL; + } + return new_value; +} + +JSON_Value * json_value_init_string(const char *string) { + char *copy = NULL; + JSON_Value *value; + size_t string_len = 0; + if (string == NULL) + return NULL; + string_len = strlen(string); + if (!is_valid_utf8(string, string_len)) + return NULL; + copy = parson_strndup(string, string_len); + if (copy == NULL) + return NULL; + value = json_value_init_string_no_copy(copy); + if (value == NULL) + parson_free(copy); + return value; +} + +JSON_Value * json_value_init_number(double number) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONNumber; + new_value->value.number = number; + return new_value; +} + +JSON_Value * json_value_init_boolean(int boolean) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONBoolean; + new_value->value.boolean = boolean ? 1 : 0; + return new_value; +} + +JSON_Value * json_value_init_null(void) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONNull; + return new_value; +} + +JSON_Value * json_value_deep_copy(const JSON_Value *value) { + size_t i = 0; + JSON_Value *return_value = NULL, *temp_value_copy = NULL, *temp_value = NULL; + const char *temp_string = NULL, *temp_key = NULL; + char *temp_string_copy = NULL; + JSON_Array *temp_array = NULL, *temp_array_copy = NULL; + JSON_Object *temp_object = NULL, *temp_object_copy = NULL; + + switch (json_value_get_type(value)) { + case JSONArray: + temp_array = json_value_get_array(value); + return_value = json_value_init_array(); + if (return_value == NULL) + return NULL; + temp_array_copy = json_value_get_array(return_value); + for (i = 0; i < json_array_get_count(temp_array); i++) { + temp_value = json_array_get_value(temp_array, i); + temp_value_copy = json_value_deep_copy(temp_value); + if (temp_value_copy == NULL) { + json_value_free(return_value); + return NULL; + } + if (json_array_add(temp_array_copy, temp_value_copy) == JSONFailure) { + json_value_free(return_value); + json_value_free(temp_value_copy); + return NULL; + } + } + return return_value; + case JSONObject: + temp_object = json_value_get_object(value); + return_value = json_value_init_object(); + if (return_value == NULL) + return NULL; + temp_object_copy = json_value_get_object(return_value); + for (i = 0; i < json_object_get_count(temp_object); i++) { + temp_key = json_object_get_name(temp_object, i); + temp_value = json_object_get_value(temp_object, temp_key); + temp_value_copy = json_value_deep_copy(temp_value); + if (temp_value_copy == NULL) { + json_value_free(return_value); + return NULL; + } + if (json_object_add(temp_object_copy, temp_key, temp_value_copy) == JSONFailure) { + json_value_free(return_value); + json_value_free(temp_value_copy); + return NULL; + } + } + return return_value; + case JSONBoolean: + return json_value_init_boolean(json_value_get_boolean(value)); + case JSONNumber: + return json_value_init_number(json_value_get_number(value)); + case JSONString: + temp_string = json_value_get_string(value); + temp_string_copy = parson_strdup(temp_string); + if (temp_string_copy == NULL) + return NULL; + return_value = json_value_init_string_no_copy(temp_string_copy); + if (return_value == NULL) + parson_free(temp_string_copy); + return return_value; + case JSONNull: + return json_value_init_null(); + case JSONError: + return NULL; + default: + return NULL; + } +} + +size_t json_serialization_size(const JSON_Value *value) { + char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */ + int res = json_serialize_to_buffer_r(value, NULL, 0, 0, num_buf); + return res < 0 ? 0 : (size_t)(res + 1); +} + +JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes) { + int written = -1; + size_t needed_size_in_bytes = json_serialization_size(value); + if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) { + return JSONFailure; + } + written = json_serialize_to_buffer_r(value, buf, 0, 0, NULL); + if (written < 0) + return JSONFailure; + return JSONSuccess; +} + +JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename) { + JSON_Status return_code = JSONSuccess; + FILE *fp = NULL; + char *serialized_string = json_serialize_to_string(value); + if (serialized_string == NULL) { + return JSONFailure; + } + fp = fopen (filename, "w"); + if (fp != NULL) { + if (fputs (serialized_string, fp) == EOF) { + return_code = JSONFailure; + } + if (fclose (fp) == EOF) { + return_code = JSONFailure; + } + } + json_free_serialized_string(serialized_string); + return return_code; +} + +char * json_serialize_to_string(const JSON_Value *value) { + JSON_Status serialization_result = JSONFailure; + size_t buf_size_bytes = json_serialization_size(value); + char *buf = NULL; + if (buf_size_bytes == 0) { + return NULL; + } + buf = (char*)parson_malloc(buf_size_bytes); + if (buf == NULL) + return NULL; + serialization_result = json_serialize_to_buffer(value, buf, buf_size_bytes); + if (serialization_result == JSONFailure) { + json_free_serialized_string(buf); + return NULL; + } + return buf; +} + +size_t json_serialization_size_pretty(const JSON_Value *value) { + char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */ + int res = json_serialize_to_buffer_r(value, NULL, 0, 1, num_buf); + return res < 0 ? 0 : (size_t)(res + 1); +} + +JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes) { + int written = -1; + size_t needed_size_in_bytes = json_serialization_size_pretty(value); + if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) + return JSONFailure; + written = json_serialize_to_buffer_r(value, buf, 0, 1, NULL); + if (written < 0) + return JSONFailure; + return JSONSuccess; +} + +JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename) { + JSON_Status return_code = JSONSuccess; + FILE *fp = NULL; + char *serialized_string = json_serialize_to_string_pretty(value); + if (serialized_string == NULL) { + return JSONFailure; + } + fp = fopen (filename, "w"); + if (fp != NULL) { + if (fputs (serialized_string, fp) == EOF) { + return_code = JSONFailure; + } + if (fclose (fp) == EOF) { + return_code = JSONFailure; + } + } + json_free_serialized_string(serialized_string); + return return_code; +} + +char * json_serialize_to_string_pretty(const JSON_Value *value) { + JSON_Status serialization_result = JSONFailure; + size_t buf_size_bytes = json_serialization_size_pretty(value); + char *buf = NULL; + if (buf_size_bytes == 0) { + return NULL; + } + buf = (char*)parson_malloc(buf_size_bytes); + if (buf == NULL) + return NULL; + serialization_result = json_serialize_to_buffer_pretty(value, buf, buf_size_bytes); + if (serialization_result == JSONFailure) { + json_free_serialized_string(buf); + return NULL; + } + return buf; +} + + +void json_free_serialized_string(char *string) { + parson_free(string); +} + +JSON_Status json_array_remove(JSON_Array *array, size_t ix) { + size_t last_element_ix = 0; + if (array == NULL || ix >= json_array_get_count(array)) { + return JSONFailure; + } + last_element_ix = json_array_get_count(array) - 1; + json_value_free(json_array_get_value(array, ix)); + array->count -= 1; + if (ix != last_element_ix) /* Replace value with one from the end of array */ + array->items[ix] = json_array_get_value(array, last_element_ix); + return JSONSuccess; +} + +JSON_Status json_array_replace_value(JSON_Array *array, size_t ix, JSON_Value *value) { + if (array == NULL || value == NULL || ix >= json_array_get_count(array)) { + return JSONFailure; + } + json_value_free(json_array_get_value(array, ix)); + array->items[ix] = value; + return JSONSuccess; +} + +JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string) { + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number) { + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean) { + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_replace_null(JSON_Array *array, size_t i) { + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_clear(JSON_Array *array) { + size_t i = 0; + if (array == NULL) + return JSONFailure; + for (i = 0; i < json_array_get_count(array); i++) { + json_value_free(json_array_get_value(array, i)); + } + array->count = 0; + return JSONSuccess; +} + +JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value) { + if (array == NULL || value == NULL) + return JSONFailure; + return json_array_add(array, value); +} + +JSON_Status json_array_append_string(JSON_Array *array, const char *string) { + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_append_number(JSON_Array *array, double number) { + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_append_boolean(JSON_Array *array, int boolean) { + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_append_null(JSON_Array *array) { + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value) { + size_t i = 0; + JSON_Value *old_value; + if (object == NULL || name == NULL || value == NULL) + return JSONFailure; + old_value = json_object_get_value(object, name); + if (old_value != NULL) { /* free and overwrite old value */ + json_value_free(old_value); + for (i = 0; i < json_object_get_count(object); i++) { + if (strcmp(object->names[i], name) == 0) { + object->values[i] = value; + return JSONSuccess; + } + } + } + /* add new key value pair */ + return json_object_add(object, name, value); +} + +JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string) { + return json_object_set_value(object, name, json_value_init_string(string)); +} + +JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number) { + return json_object_set_value(object, name, json_value_init_number(number)); +} + +JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean) { + return json_object_set_value(object, name, json_value_init_boolean(boolean)); +} + +JSON_Status json_object_set_null(JSON_Object *object, const char *name) { + return json_object_set_value(object, name, json_value_init_null()); +} + +JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value) { + const char *dot_pos = NULL; + char *current_name = NULL; + JSON_Object *temp_obj = NULL; + JSON_Value *new_value = NULL; + if (value == NULL || name == NULL || value == NULL) + return JSONFailure; + dot_pos = strchr(name, '.'); + if (dot_pos == NULL) { + return json_object_set_value(object, name, value); + } else { + current_name = parson_strndup(name, dot_pos - name); + temp_obj = json_object_get_object(object, current_name); + if (temp_obj == NULL) { + new_value = json_value_init_object(); + if (new_value == NULL) { + parson_free(current_name); + return JSONFailure; + } + if (json_object_add(object, current_name, new_value) == JSONFailure) { + json_value_free(new_value); + parson_free(current_name); + return JSONFailure; + } + temp_obj = json_object_get_object(object, current_name); + } + parson_free(current_name); + return json_object_dotset_value(temp_obj, dot_pos + 1, value); + } +} + +JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string) { + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number) { + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean) { + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_dotset_null(JSON_Object *object, const char *name) { + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_remove(JSON_Object *object, const char *name) { + size_t i = 0, last_item_index = 0; + if (object == NULL || json_object_get_value(object, name) == NULL) + return JSONFailure; + last_item_index = json_object_get_count(object) - 1; + for (i = 0; i < json_object_get_count(object); i++) { + if (strcmp(object->names[i], name) == 0) { + parson_free(object->names[i]); + json_value_free(object->values[i]); + if (i != last_item_index) { /* Replace key value pair with one from the end */ + object->names[i] = object->names[last_item_index]; + object->values[i] = object->values[last_item_index]; + } + object->count -= 1; + return JSONSuccess; + } + } + return JSONFailure; /* No execution path should end here */ +} + +JSON_Status json_object_dotremove(JSON_Object *object, const char *name) { + const char *dot_pos = strchr(name, '.'); + char *current_name = NULL; + JSON_Object *temp_obj = NULL; + if (dot_pos == NULL) { + return json_object_remove(object, name); + } else { + current_name = parson_strndup(name, dot_pos - name); + temp_obj = json_object_get_object(object, current_name); + if (temp_obj == NULL) { + parson_free(current_name); + return JSONFailure; + } + parson_free(current_name); + return json_object_dotremove(temp_obj, dot_pos + 1); + } +} + +JSON_Status json_object_clear(JSON_Object *object) { + size_t i = 0; + if (object == NULL) { + return JSONFailure; + } + for (i = 0; i < json_object_get_count(object); i++) { + parson_free(object->names[i]); + json_value_free(object->values[i]); + } + object->count = 0; + return JSONSuccess; +} + +JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value) { + JSON_Value *temp_schema_value = NULL, *temp_value = NULL; + JSON_Array *schema_array = NULL, *value_array = NULL; + JSON_Object *schema_object = NULL, *value_object = NULL; + JSON_Value_Type schema_type = JSONError, value_type = JSONError; + const char *key = NULL; + size_t i = 0, count = 0; + if (schema == NULL || value == NULL) + return JSONFailure; + schema_type = json_value_get_type(schema); + value_type = json_value_get_type(value); + if (schema_type != value_type && schema_type != JSONNull) /* null represents all values */ + return JSONFailure; + switch (schema_type) { + case JSONArray: + schema_array = json_value_get_array(schema); + value_array = json_value_get_array(value); + count = json_array_get_count(schema_array); + if (count == 0) + return JSONSuccess; /* Empty array allows all types */ + /* Get first value from array, rest is ignored */ + temp_schema_value = json_array_get_value(schema_array, 0); + for (i = 0; i < json_array_get_count(value_array); i++) { + temp_value = json_array_get_value(value_array, i); + if (json_validate(temp_schema_value, temp_value) == 0) { + return JSONFailure; + } + } + return JSONSuccess; + case JSONObject: + schema_object = json_value_get_object(schema); + value_object = json_value_get_object(value); + count = json_object_get_count(schema_object); + if (count == 0) + return JSONSuccess; /* Empty object allows all objects */ + else if (json_object_get_count(value_object) < count) + return JSONFailure; /* Tested object mustn't have less name-value pairs than schema */ + for (i = 0; i < count; i++) { + key = json_object_get_name(schema_object, i); + temp_schema_value = json_object_get_value(schema_object, key); + temp_value = json_object_get_value(value_object, key); + if (temp_value == NULL) + return JSONFailure; + if (json_validate(temp_schema_value, temp_value) == JSONFailure) + return JSONFailure; + } + return JSONSuccess; + case JSONString: case JSONNumber: case JSONBoolean: case JSONNull: + return JSONSuccess; /* equality already tested before switch */ + case JSONError: default: + return JSONFailure; + } +} + +JSON_Status json_value_equals(const JSON_Value *a, const JSON_Value *b) { + JSON_Object *a_object = NULL, *b_object = NULL; + JSON_Array *a_array = NULL, *b_array = NULL; + const char *a_string = NULL, *b_string = NULL; + const char *key = NULL; + size_t a_count = 0, b_count = 0, i = 0; + JSON_Value_Type a_type, b_type; + a_type = json_value_get_type(a); + b_type = json_value_get_type(b); + if (a_type != b_type) { + return 0; + } + switch (a_type) { + case JSONArray: + a_array = json_value_get_array(a); + b_array = json_value_get_array(b); + a_count = json_array_get_count(a_array); + b_count = json_array_get_count(b_array); + if (a_count != b_count) { + return 0; + } + for (i = 0; i < a_count; i++) { + if (!json_value_equals(json_array_get_value(a_array, i), + json_array_get_value(b_array, i))) { + return 0; + } + } + return 1; + case JSONObject: + a_object = json_value_get_object(a); + b_object = json_value_get_object(b); + a_count = json_object_get_count(a_object); + b_count = json_object_get_count(b_object); + if (a_count != b_count) { + return 0; + } + for (i = 0; i < a_count; i++) { + key = json_object_get_name(a_object, i); + if (!json_value_equals(json_object_get_value(a_object, key), + json_object_get_value(b_object, key))) { + return 0; + } + } + return 1; + case JSONString: + a_string = json_value_get_string(a); + b_string = json_value_get_string(b); + return strcmp(a_string, b_string) == 0; + case JSONBoolean: + return json_value_get_boolean(a) == json_value_get_boolean(b); + case JSONNumber: + return fabs(json_value_get_number(a) - json_value_get_number(b)) < 0.000001; /* EPSILON */ + case JSONError: + return 1; + case JSONNull: + return 1; + default: + return 1; + } +} + +JSON_Value_Type json_type(const JSON_Value *value) { + return json_value_get_type(value); +} + +JSON_Object * json_object (const JSON_Value *value) { + return json_value_get_object(value); +} + +JSON_Array * json_array (const JSON_Value *value) { + return json_value_get_array(value); +} + +const char * json_string (const JSON_Value *value) { + return json_value_get_string(value); +} + +double json_number (const JSON_Value *value) { + return json_value_get_number(value); +} + +int json_boolean(const JSON_Value *value) { + return json_value_get_boolean(value); +} + +void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun) { + parson_malloc = malloc_fun; + parson_free = free_fun; +} diff --git a/software/aws-iot-ethernet/firmware/src/parson.h b/software/aws-iot-ethernet/firmware/src/parson.h new file mode 100755 index 0000000..3c04edf --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/parson.h @@ -0,0 +1,222 @@ +/* + Parson ( http://kgabis.github.com/parson/ ) + Copyright (c) 2012 - 2015 Krzysztof Gabis + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef parson_parson_h +#define parson_parson_h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include /* size_t */ + +/* Types and enums */ +typedef struct json_object_t JSON_Object; +typedef struct json_array_t JSON_Array; +typedef struct json_value_t JSON_Value; + +enum json_value_type { + JSONError = -1, + JSONNull = 1, + JSONString = 2, + JSONNumber = 3, + JSONObject = 4, + JSONArray = 5, + JSONBoolean = 6 +}; +typedef int JSON_Value_Type; + +enum json_result_t { + JSONSuccess = 0, + JSONFailure = -1 +}; +typedef int JSON_Status; + +typedef void * (*JSON_Malloc_Function)(size_t); +typedef void (*JSON_Free_Function)(void *); + +/* Call only once, before calling any other function from parson API. If not called, malloc and free + from stdlib will be used for all allocations */ +void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun); + +/* Parses first JSON value in a file, returns NULL in case of error */ +JSON_Value * json_parse_file(const char *filename); + +/* Parses first JSON value in a file and ignores comments (/ * * / and //), + returns NULL in case of error */ +JSON_Value * json_parse_file_with_comments(const char *filename); + +/* Parses first JSON value in a string, returns NULL in case of error */ +JSON_Value * json_parse_string(const char *string); + +/* Parses first JSON value in a string and ignores comments (/ * * / and //), + returns NULL in case of error */ +JSON_Value * json_parse_string_with_comments(const char *string); + +/* Serialization */ +size_t json_serialization_size(const JSON_Value *value); /* returns 0 on fail */ +JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes); +JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename); +char * json_serialize_to_string(const JSON_Value *value); + +/* Pretty serialization */ +size_t json_serialization_size_pretty(const JSON_Value *value); /* returns 0 on fail */ +JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes); +JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename); +char * json_serialize_to_string_pretty(const JSON_Value *value); + +void json_free_serialized_string(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */ + +/* Comparing */ +int json_value_equals(const JSON_Value *a, const JSON_Value *b); + +/* Validation + This is *NOT* JSON Schema. It validates json by checking if object have identically + named fields with matching types. + For example schema {"name":"", "age":0} will validate + {"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"}, + but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}. + In case of arrays, only first value in schema is checked against all values in tested array. + Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays, + null validates values of every type. + */ +JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value); + +/* + * JSON Object + */ +JSON_Value * json_object_get_value (const JSON_Object *object, const char *name); +const char * json_object_get_string (const JSON_Object *object, const char *name); +JSON_Object * json_object_get_object (const JSON_Object *object, const char *name); +JSON_Array * json_object_get_array (const JSON_Object *object, const char *name); +double json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */ +int json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */ + +/* dotget functions enable addressing values with dot notation in nested objects, + just like in structs or c++/java/c# objects (e.g. objectA.objectB.value). + Because valid names in JSON can contain dots, some values may be inaccessible + this way. */ +JSON_Value * json_object_dotget_value (const JSON_Object *object, const char *name); +const char * json_object_dotget_string (const JSON_Object *object, const char *name); +JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name); +JSON_Array * json_object_dotget_array (const JSON_Object *object, const char *name); +double json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */ +int json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */ + +/* Functions to get available names */ +size_t json_object_get_count(const JSON_Object *object); +const char * json_object_get_name (const JSON_Object *object, size_t index); + +/* Creates new name-value pair or frees and replaces old value with a new one. + * json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value); +JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string); +JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number); +JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean); +JSON_Status json_object_set_null(JSON_Object *object, const char *name); + +/* Works like dotget functions, but creates whole hierarchy if necessary. + * json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value); +JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string); +JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number); +JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean); +JSON_Status json_object_dotset_null(JSON_Object *object, const char *name); + +/* Frees and removes name-value pair */ +JSON_Status json_object_remove(JSON_Object *object, const char *name); + +/* Works like dotget function, but removes name-value pair only on exact match. */ +JSON_Status json_object_dotremove(JSON_Object *object, const char *key); + +/* Removes all name-value pairs in object */ +JSON_Status json_object_clear(JSON_Object *object); + +/* + *JSON Array + */ +JSON_Value * json_array_get_value (const JSON_Array *array, size_t index); +const char * json_array_get_string (const JSON_Array *array, size_t index); +JSON_Object * json_array_get_object (const JSON_Array *array, size_t index); +JSON_Array * json_array_get_array (const JSON_Array *array, size_t index); +double json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */ +int json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */ +size_t json_array_get_count (const JSON_Array *array); + +/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist. + * Order of values in array may change during execution. */ +JSON_Status json_array_remove(JSON_Array *array, size_t i); + +/* Frees and removes from array value at given index and replaces it with given one. + * Does nothing and returns JSONFailure if index doesn't exist. + * json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value); +JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string); +JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number); +JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean); +JSON_Status json_array_replace_null(JSON_Array *array, size_t i); + +/* Frees and removes all values from array */ +JSON_Status json_array_clear(JSON_Array *array); + +/* Appends new value at the end of array. + * json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value); +JSON_Status json_array_append_string(JSON_Array *array, const char *string); +JSON_Status json_array_append_number(JSON_Array *array, double number); +JSON_Status json_array_append_boolean(JSON_Array *array, int boolean); +JSON_Status json_array_append_null(JSON_Array *array); + +/* + *JSON Value + */ +JSON_Value * json_value_init_object (void); +JSON_Value * json_value_init_array (void); +JSON_Value * json_value_init_string (const char *string); /* copies passed string */ +JSON_Value * json_value_init_number (double number); +JSON_Value * json_value_init_boolean(int boolean); +JSON_Value * json_value_init_null (void); +JSON_Value * json_value_deep_copy (const JSON_Value *value); +void json_value_free (JSON_Value *value); + +JSON_Value_Type json_value_get_type (const JSON_Value *value); +JSON_Object * json_value_get_object (const JSON_Value *value); +JSON_Array * json_value_get_array (const JSON_Value *value); +const char * json_value_get_string (const JSON_Value *value); +double json_value_get_number (const JSON_Value *value); +int json_value_get_boolean(const JSON_Value *value); + +/* Same as above, but shorter */ +JSON_Value_Type json_type (const JSON_Value *value); +JSON_Object * json_object (const JSON_Value *value); +JSON_Array * json_array (const JSON_Value *value); +const char * json_string (const JSON_Value *value); +double json_number (const JSON_Value *value); +int json_boolean(const JSON_Value *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/FreeRTOSConfig.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/FreeRTOSConfig.h new file mode 100644 index 0000000..f93a105 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/FreeRTOSConfig.h @@ -0,0 +1,159 @@ +/* + FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#include + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ ( 200000000UL ) +#define configPERIPHERAL_CLOCK_HZ ( 100000000UL ) +#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) +#define configMAX_PRIORITIES ( 5UL ) +#define configMINIMAL_STACK_SIZE ( 512 ) +#define configISR_STACK_SIZE ( 1024 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) 131072 ) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configQUEUE_REGISTRY_SIZE 0 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 0 + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 + +/* Run time and task stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_TRACE_FACILITY 0 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES 2 + +/* Software timer related definitions. */ +#define configUSE_TIMERS 0 +#define configTIMER_TASK_PRIORITY +#define configTIMER_QUEUE_LENGTH +#define configTIMER_TASK_STACK_DEPTH + +/* Misc */ +#define configUSE_APPLICATION_TASK_TAG 0 + + +/* Interrupt nesting behaviour configuration. */ + +/* The priority at which the tick interrupt runs. This should probably be kept at 1. */ +#define configKERNEL_INTERRUPT_PRIORITY 1 + +/* The maximum interrupt priority from which FreeRTOS.org API functions can be called. +Only API functions that end in ...FromISR() can be used within interrupts. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 3 + +/* Optional functions - most linkers will remove unused functions anyway. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 0 +#define INCLUDE_xTaskGetCurrentTaskHandle 0 +#define INCLUDE_uxTaskGetStackHighWaterMark 0 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 +#define INCLUDE_pcTaskGetTaskName 0 +#define INCLUDE_eTaskGetState 0 +#define INCLUDE_xEventGroupSetBitFromISR 0 +#define INCLUDE_xTimerPendFunctionCall 0 + +#endif /* FREERTOS_CONFIG_H */ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/IoT-Ethernet.mhc b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/IoT-Ethernet.mhc new file mode 100644 index 0000000..5943635 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/IoT-Ethernet.mhc @@ -0,0 +1,1177 @@ +# +# Configuration generated by Microchip Harmony Configurator (MHC) v1.0.7.16 +# Project name: aws-iot-ethernet +# Configuration: IoT-Ethernet +# Device: PIC32MZ2048EFM064 +# Harmony version: 1.07 +# +# +# from $PROJECT_FIRMWARE_DIRECTORY/$PROJECT_NAME.hconfig +# +CONFIG_APP_INSTANCES=2 +# +# from $HARMONY_VERSION_PATH/utilities/mhc/config/app_name_idx_gencode.ftl +# +CONFIG_APP_MENU_IDX0=y +CONFIG_APP_NAME_0="app" +CONFIG_APP_AUTO_GENERATE_CODE0=n +CONFIG_APP_TASK_SIZE_IDX0=2048 +CONFIG_APP_TASK_PRIORITY_IDX0=1 +CONFIG_APP_TASK_USE_DELAY_IDX0=y +CONFIG_APP_TASK_DELAY_IDX0=1 +CONFIG_APP_MENU_IDX1=y +CONFIG_APP_NAME_1="app1" +CONFIG_APP_AUTO_GENERATE_CODE1=n +CONFIG_APP_TASK_SIZE_IDX1=512 +CONFIG_APP_TASK_PRIORITY_IDX1=2 +CONFIG_APP_TASK_USE_DELAY_IDX1=y +CONFIG_APP_TASK_DELAY_IDX1=10 +# +# from $PROJECT_FIRMWARE_DIRECTORY/$PROJECT_NAME.hconfig +# +CONFIG_USE_EXCEPTION_HANDLER=y +CONFIG_EXCEPTION_USE_SYS_DEBUG=y +CONFIG_EXCEPTION_BREAKPOINT=y +# +# from $HARMONY_VERSION_PATH/framework/config/framework.hconfig +# +CONFIG_FW_USE_SYS_TASK=y +CONFIG_FW_SYS_TASK_SIZE=4096 +CONFIG_FW_SYS_TASK_PRIORITY=2 +CONFIG_FW_SYS_TASK_USE_DELAY=y +CONFIG_FW_SYS_TASK_DELAY=1 +# +# from $HARMONY_VERSION_PATH/framework/bluetooth/config/bluetooth.hconfig +# +CONFIG_USE_BLUETOOTH_LIBRARIES=n +# +# from $HARMONY_VERSION_PATH/framework/bootloader/config/bootloader.hconfig +# +CONFIG_USE_BOOTLOADER=n +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto.hconfig +# +CONFIG_USE_CRYPTO_LIBRARY=y +CONFIG_USE_CRYPTO_HW=n +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto_cipher.hconfig +# +CONFIG_USE_CRYPTO_ECC=n +CONFIG_USE_CRYPTO_3DES_SW=y +CONFIG_USE_CRYPTO_RSA=y +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto_cipher_aes.hconfig +# +CONFIG_USE_CRYPTO_AES_SW=y +CONFIG_USE_CRYPTO_AES_CBC_SW=n +CONFIG_USE_CRYPTO_AES_COUNTER_SW=n +CONFIG_USE_CRYPTO_AES_DIRECT_SW=n +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto_hash.hconfig +# +CONFIG_USE_CRYPTO_MD5_SW=n +CONFIG_USE_CRYPTO_SHA_SW=n +CONFIG_USE_CRYPTO_SHA_256_SW=y +CONFIG_USE_CRYPTO_SHA_384=n +CONFIG_USE_CRYPTO_SHA_512=n +CONFIG_USE_CRYPTO_HMAC_SW=y +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto_compress.hconfig +# +CONFIG_USE_CRYPTO_COMPRESS=n +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto_random.hconfig +# +CONFIG_USE_CRYPTO_RANDOM=y +# +# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto.hconfig +# +CONFIG_USE_CRYPTO_LIB=n +# +# from $HARMONY_VERSION_PATH/framework/decoder/config/decoder.hconfig +# +CONFIG_USE_IMAGE_DECODER=n +CONFIG_USE_DECODER=n +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adc.hconfig +# +CONFIG_USE_DRV_ADC=y +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adchs.hconfig +# +CONFIG_DRV_ADCHS_DRIVER_MODE="STATIC" +CONFIG_DRV_ADCHS_INTERRUPT_MODE=n +CONFIG_DRV_ADCHS_POLLED_MODE=y +CONFIG_DRV_ADCHS_CHARGEPUMP_MODE="ADCHS_CHARGEPUMP_DISABLE" +CONFIG_DRV_ADCHS_FAST_SYNC_SYSTEM_CLOCK="ADCHS_FAST_SYNC_SYSTEM_CLOCK_DISABLE" +CONFIG_DRV_ADCHS_FAST_SYNC_PERIPHERAL_CLOCK="ADCHS_FAST_SYNC_PERIPHERAL_CLOCK_DISABLE" +CONFIG_DRV_ADCHS_OUTPUT_DATA_FORMAT="ADCHS_OUTPUT_DATA_FORMAT_INTEGER" +CONFIG_DRV_ADC_VOLTAGE_REFERENCE_ADCHS="ADCHS_VREF_AVDD_AVSS" +CONFIG_DRV_ADCHS_CLOCK_SOURCE="ADCHS_CLOCK_SOURCE_PBCLK" +CONFIG_DRV_ADCHS_CLOCK_DIVIDER=16 +CONFIG_DRV_ADCHS_WARMUP_CLOCK="ADCHS_WARMUP_CLOCK_32768" +CONFIG_DRV_ADCHS_CHANNEL_NUMBER=1 +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adchs_channel_idx.ftl +# +CONFIG_DRV_ADCHS_CHANNEL_INST_IDX0=y +CONFIG_DRV_ADCHS_CHANNEL_ID_IDX0="ADCHS_CHANNEL_3" +CONFIG_DRV_ADCHS_CHNL_3_ALT_INP_SEL_IDX0="ADCHS_DEFAULT_CLASS1_AN3" +CONFIG_DRV_ADCHS_ANALOG_INPUT_LEVEL_TRIGGER_IDX0=n +CONFIG_DRV_ADCHS_TRIGGER_SOURCE_IDX0="ADCHS_TRIGGER_SOURCE_GLOBAL_SOFTWARE_EDGE" +CONFIG_DRV_ADCHS_INPUT_MODE_IDX0="ADCHS_INPUT_MODE_SINGLE_ENDED_UNIPOLAR" +CONFIG_DRV_ADCHS_DATA_RESOLUTION_SELECT_IDX0="ADCHS_DATA_RESOLUTION_12BIT" +CONFIG_DRV_ADCHS_CHANNEL_CLOCK_DIVIDER_IDX0=4 +CONFIG_DRV_ADCHS_SAMPLE_TIME_COUNT_IDX0=32 +CONFIG_DRV_ADCHS_TRIGGER_SAMPLE_SELECT_IDX0="ADCHS_CHANNEL_UNSYNC_TRIGGER_UNSYNC_SAMPLING" +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adchs.hconfig +# +CONFIG_DRV_ADCHS_POWER_STATE="SYS_MODULE_POWER_RUN_FULL" +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adc.hconfig +# +CONFIG_USE_DRV_ADCHS_CLASS_2_ANALOG_INPUT_CONVERT=n +CONFIG_USE_DRV_ADCHS_SCAN_MODE=n +CONFIG_USE_DRV_ADCHS_DIGITAL_COMPARATOR=n +CONFIG_USE_DRV_ADCHS_DIGITAL_FILTER=y +CONFIG_DRV_ADCHS_DIGITAL_FILTER_INSTANCES_NUMBER=2 +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adchs_digital_filter_idx.ftl +# +CONFIG_DRV_ADCHS_DIGITAL_FILTER_INST_IDX0=y +CONFIG_DRV_ADCHS_DIGITAL_FILTER_ID_IDX0="ADCHS_DIGITAL_FILTER_1" +CONFIG_DRV_ADCHS_DIGITAL_FILTER_ANALOG_INPUT_ID_IDX0="ADCHS_AN3" +CONFIG_DRV_ADCHS_DIGITAL_FILTER_MODE_IDX0=y +CONFIG_DRV_ADCHS_DIGITAL_FILTER_OVERSAMPLING_RATIO_IDX0="ADCHS_DIGITAL_FILTER_OVERSAMPLE_RATIO_256X" +CONFIG_DRV_ADCHS_DIGITAL_FILTER_SIG_BITS_IDX0="ADCHS_DIGITAL_FILTER_SIGNIFICANT_ALL_16BITS" +CONFIG_DRV_ADCHS_DIGITAL_FILTER_INST_IDX1=n +# +# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adc.hconfig +# +CONFIG_USE_DRV_ADCHS_CVD=n +# +# from $HARMONY_VERSION_PATH/framework/driver/camera/config/drv_camera.hconfig +# +CONFIG_USE_DRV_CAMERA=n +# +# from $HARMONY_VERSION_PATH/framework/driver/can/config/drv_can.hconfig +# +CONFIG_USE_DRV_CAN=n +# +# from $HARMONY_VERSION_PATH/framework/driver/cmp/config/drv_cmp.hconfig +# +CONFIG_DRV_CVREF_ENABLE=y +CONFIG_DRV_CMP_CVREF_VOLTAGE_SOURCE="CMP_CVREF_VOLTAGE_SOURCE_VDD" +CONFIG_DRV_CMP_CVREF="CMP_CVREF_RESISTOR_LADDER_VOLTAGE" +CONFIG_DRV_CMP_CVREF_VALUE="CMP_CVREF_VALUE_11" +CONFIG_DRV_CMP_IVREF="CMP_CVREF_BANDGAP_1_2V" +CONFIG_DRV_CMP_CVREF_WIDE_RANGE=n +CONFIG_DRV_CMP_CVREF_OE=n +CONFIG_USE_DRV_CMP=y +CONFIG_DRV_CMP_DRIVER_MODE="STATIC" +CONFIG_DRV_CMP_INTERRUPT_MODE=y +CONFIG_DRV_CMP_INSTANCES_NUMBER=1 +# +# from $HARMONY_VERSION_PATH/framework/driver/cmp/config/drv_cmp_idx.ftl +# +CONFIG_DRV_CMP_INST_IDX0=y +CONFIG_DRV_CMP_PERIPHERAL_ID_IDX0="CMP_ID_2" +CONFIG_DRV_CMP_INTERRUPT_EVENT_IDX0="CMP_INTERRUPT_GENERATION_LOW_TO_HIGH" +CONFIG_DRV_CMP_INT_PRIORITY_IDX0="INT_PRIORITY_LEVEL1" +CONFIG_DRV_CMP_INT_SUB_PRIORITY_IDX0="INT_SUBPRIORITY_LEVEL0" +CONFIG_DRV_CMP_OUTPUT_ENABLE_IDX0=y +CONFIG_DRV_CMP_OUTPUT_INVERT_IDX0=n +CONFIG_DRV_CMP_INVERTING_INPUT_IDX0="CMP_INVERTING_INPUT_EXTERNAL_PIN_B" +CONFIG_DRV_CMP_NON_INVERTING_INPUT_IDX0="CMP_NON_INVERTING_INPUT_CVREF" +# +# from $HARMONY_VERSION_PATH/framework/driver/codec/config/drv_codec.hconfig +# +CONFIG_SELECT_DRV_AK4384=n +CONFIG_SELECT_DRV_AK4642=n +CONFIG_SELECT_DRV_AK4953=n +CONFIG_SELECT_DRV_AK7755=n +# +# from $HARMONY_VERSION_PATH/framework/driver/ddr/config/drv_ddr.hconfig +# +CONFIG_USE_DRV_DDR=n +# +# from $HARMONY_VERSION_PATH/framework/driver/encx24j600/config/drv_encx24j600.hconfig +# +CONFIG_DRV_ENCX24J600_USE_DRIVER=n +# +# from $HARMONY_VERSION_PATH/framework/driver/enc28j60/config/drv_enc28j60.hconfig +# +CONFIG_DRV_ENC28J60_USE_DRIVER=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_mac.hconfig +# +CONFIG_TCPIP_USE_ETH_MAC=y +CONFIG_TCPIP_EMAC_TX_DESCRIPTORS=8 +CONFIG_TCPIP_EMAC_RX_DESCRIPTORS=10 +CONFIG_TCPIP_EMAC_RX_DEDICATED_BUFFERS=4 +CONFIG_TCPIP_EMAC_RX_INIT_BUFFERS=0 +CONFIG_TCPIP_EMAC_RX_LOW_THRESHOLD=1 +CONFIG_TCPIP_EMAC_RX_LOW_FILL=2 +CONFIG_TCPIP_EMAC_RX_BUFF_SIZE=1536 +CONFIG_TCPIP_EMAC_RX_MAX_FRAME=1536 +CONFIG_TCPIP_EMAC_RX_FRAGMENTS=1 +CONFIG_TCPIP_EMAC_ETH_OF_AUTO_NEGOTIATION=y +CONFIG_TCPIP_EMAC_ETH_OF_FULL_DUPLEX=y +CONFIG_TCPIP_EMAC_ETH_OF_HALF_DUPLEX=y +CONFIG_TCPIP_EMAC_ETH_OF_100=y +CONFIG_TCPIP_EMAC_ETH_OF_10=y +CONFIG_TCPIP_EMAC_ETH_OF_HUGE_PKTS=n +CONFIG_TCPIP_EMAC_ETH_OF_MAC_LOOPBACK=n +CONFIG_TCPIP_EMAC_ETH_OF_PHY_LOOPBACK=n +CONFIG_TCPIP_EMAC_ETH_OF_MDIX_AUTO=n +CONFIG_TCPIP_EMAC_ETH_OF_MDIX_SWAP=n +CONFIG_TCPIP_EMAC_ETH_OF_RMII=y +CONFIG_TCPIP_EMAC_PHY_CONFIG_RMII=y +CONFIG_TCPIP_EMAC_PHY_CONFIG_ALTERNATE=n +CONFIG_TCPIP_EMAC_PHY_CONFIG_AUTO=n +CONFIG_TCPIP_EMAC_PHY_LINK_INIT_DELAY=500 +CONFIG_TCPIP_EMAC_PHY_ADDRESS=0 +CONFIG_TCPIP_EMAC_INTERRUPT_PRIORITY="INT_PRIORITY_LEVEL5" +CONFIG_TCPIP_EMAC_INTERRUPT_SUB_PRIORITY="INT_SUBPRIORITY_LEVEL3" +CONFIG_TCPIP_EMAC_PHY_TYPE="SMSC_LAN8740" +CONFIG_DRV_ETHPHY_INSTANCES_NUMBER=1 +CONFIG_DRV_ETHPHY_CLIENTS_NUMBER=1 +CONFIG_DRV_ETHPHY_INDEX=1 +CONFIG_DRV_ETHPHY_PERIPHERAL_ID=1 +CONFIG_DRV_ETHPHY_NEG_INIT_TMO=1 +CONFIG_DRV_ETHPHY_NEG_DONE_TMO=2000 +CONFIG_DRV_ETHPHY_RESET_CLR_TMO=500 +CONFIG_DRV_ETHMAC_INSTANCES_NUMBER=1 +CONFIG_DRV_ETHMAC_CLIENTS_NUMBER=1 +CONFIG_DRV_ETHMAC_INDEX=1 +CONFIG_DRV_ETHMAC_PERIPHERAL_ID=1 +CONFIG_DRV_ETHMAC_INTERRUPT_MODE=y +CONFIG_DRV_ETHMAC_POWER_STATE="SYS_MODULE_POWER_RUN_FULL" +# +# from $HARMONY_VERSION_PATH/framework/driver/flash/config/drv_flash.hconfig +# +CONFIG_USE_DRV_FLASH=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/glcd/config/drv_gfx_glcd.hconfig +# +CONFIG_USE_DRV_GFX_GLCD=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/lcc/config/drv_gfx_lcc.hconfig +# +CONFIG_USE_DRV_GFX_LCC=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/otm2201a/config/drv_gfx_otm2201a.hconfig +# +CONFIG_USE_DRV_GFX_OTM2201A=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/ssd1926/config/drv_gfx_ssd1926.hconfig +# +CONFIG_USE_DRV_GFX_SSD1926=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/ssd1289/config/drv_gfx_ssd1289.hconfig +# +CONFIG_USE_DRV_GFX_SSD1289=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/s1d13517/config/drv_gfx_s1d13517.hconfig +# +CONFIG_USE_DRV_GFX_S1D13517=n +# +# from $HARMONY_VERSION_PATH/framework/driver/gfx/display/config/drv_gfx_display.hconfig +# +CONFIG_USE_DRV_GFX_DISPLAY=n +CONFIG_DRV_GFX_DISP_VSYNC_NEGATIVE_POLARITY=n +CONFIG_DRV_GFX_DISP_HSYNC_NEGATIVE_POLARITY=n +# +# from $HARMONY_VERSION_PATH/framework/driver/i2c/config/drv_i2c.hconfig +# +CONFIG_USE_DRV_I2C=n +# +# from $HARMONY_VERSION_PATH/framework/driver/i2s/config/drv_i2s.hconfig +# +CONFIG_USE_DRV_I2S=n +# +# from $HARMONY_VERSION_PATH/framework/driver/ic/config/drv_ic.hconfig +# +CONFIG_USE_DRV_IC=n +# +# from $HARMONY_VERSION_PATH/framework/driver/nvm/config/drv_nvm.hconfig +# +CONFIG_USE_DRV_NVM=y +CONFIG_DRV_NVM_DRIVER_MODE="DYNAMIC" +CONFIG_DRV_NVM_DRIVER_TYPE_SELECT="BLOCK_DRIVER" +CONFIG_DRV_NVM_CLIENTS_NUMBER=2 +CONFIG_DRV_NVM_MEDIA_START_ADDRESS=0x9D100000 +CONFIG_DRV_NVM_MEDIA_SIZE=80 +CONFIG_DRV_NVM_BUFFER_OBJECT_NUMBER=5 +CONFIG_DRV_NVM_INTERRUPT_MODE=y +CONFIG_DRV_NVM_INTERRUPT_PRIORITY="INT_PRIORITY_LEVEL3" +CONFIG_DRV_NVM_INTERRUPT_SUB_PRIORITY="INT_SUBPRIORITY_LEVEL0" +CONFIG_DRV_NVM_POWER_STATE="SYS_MODULE_POWER_RUN_FULL" +CONFIG_USE_DRV_NVM_ERASE_WRITE=y +CONFIG_USE_DRV_NVM_SYS_FS_REGISTER=y +CONFIG_USE_DRV_NVM_DISABLE_ERROR_CHECK=n +# +# from $HARMONY_VERSION_PATH/framework/driver/oc/config/drv_oc.hconfig +# +CONFIG_USE_DRV_OC=n +# +# from $HARMONY_VERSION_PATH/framework/driver/pmp/config/drv_pmp.hconfig +# +CONFIG_USE_DRV_PMP=n +# +# from $HARMONY_VERSION_PATH/framework/driver/rtcc/config/drv_rtcc.hconfig +# +CONFIG_USE_DRV_RTCC=n +# +# from $HARMONY_VERSION_PATH/framework/driver/sample/config/drv_sample.hconfig +# +CONFIG_USE_DRV_SAMPLE=n +# +# from $HARMONY_VERSION_PATH/framework/driver/sdcard/config/drv_sdcard.hconfig +# +CONFIG_USE_DRV_SDCARD=n +# +# from $HARMONY_VERSION_PATH/framework/driver/spi/config/drv_spi.hconfig +# +CONFIG_DRV_SPI_USE_DRIVER=n +# +# from $HARMONY_VERSION_PATH/framework/driver/sqi/config/drv_sqi.hconfig +# +CONFIG_DRV_SQI_USE_DRIVER=n +# +# from $HARMONY_VERSION_PATH/framework/driver/spi_flash/sst25vf016b/config/drv_sst25vf016b.hconfig +# +CONFIG_USE_DRV_SST25VF016B=n +# +# from $HARMONY_VERSION_PATH/framework/driver/spi_flash/sst25vf020b/config/drv_sst25vf020b.hconfig +# +CONFIG_USE_DRV_SST25VF020B=n +# +# from $HARMONY_VERSION_PATH/framework/driver/spi_flash/sst25vf064c/config/drv_sst25vf064c.hconfig +# +CONFIG_USE_DRV_SST25VF064C=n +# +# from $HARMONY_VERSION_PATH/framework/driver/tmr/config/drv_tmr.hconfig +# +CONFIG_USE_DRV_TMR=y +CONFIG_DRV_TMR_DRIVER_MODE="DYNAMIC" +CONFIG_DRV_TMR_CLIENTS_NUMBER=1 +CONFIG_DRV_TMR_INTERRUPT_MODE=y +CONFIG_DRV_TMR_INSTANCES_NUMBER=1 +# +# from $HARMONY_VERSION_PATH/framework/driver/tmr/config/drv_tmr_idx.ftl +# +CONFIG_DRV_TMR_INST_0=y +CONFIG_DRV_TMR_PERIPHERAL_ID_IDX0="TMR_ID_2" +CONFIG_DRV_TMR_RTOS_IDX0="Combined with System Tasks" +CONFIG_DRV_TMR_INTERRUPT_PRIORITY_IDX0="INT_PRIORITY_LEVEL1" +CONFIG_DRV_TMR_INTERRUPT_SUB_PRIORITY_IDX0="INT_SUBPRIORITY_LEVEL0" +CONFIG_DRV_TMR_CLOCK_SOURCE_3_IDX0="DRV_TMR_CLKSOURCE_INTERNAL" +CONFIG_DRV_TMR_PRESCALE_IDX0="TMR_PRESCALE_VALUE_256" +CONFIG_DRV_TMR_OPERATION_MODE_IDX0="DRV_TMR_OPERATION_MODE_16_BIT" +CONFIG_DRV_TMR_ASYNC_WRITE_ENABLE_IDX0=n +CONFIG_DRV_TMR_POWER_STATE_IDX0="SYS_MODULE_POWER_RUN_FULL" +# +# from $HARMONY_VERSION_PATH/framework/driver/touch/adc10bit/config/drv_adc10bit.hconfig +# +CONFIG_USE_DRV_TOUCH_ADC10BIT=n +# +# from $HARMONY_VERSION_PATH/framework/driver/touch/mtch6301/config/drv_mtch6301.hconfig +# +CONFIG_USE_DRV_TOUCH_MTCH6301=n +# +# from $HARMONY_VERSION_PATH/framework/driver/touch/mtch6303/config/drv_mtch6303.hconfig +# +CONFIG_USE_DRV_TOUCH_MTCH6303=n +# +# from $HARMONY_VERSION_PATH/framework/driver/usart/config/drv_usart.hconfig +# +CONFIG_USE_DRV_USART=n +# +# from $HARMONY_VERSION_PATH/framework/driver/wifi/config/drv_wifi.hconfig +# +CONFIG_USE_DRV_WIFI=n +# +# from $HARMONY_VERSION_PATH/framework/gfx/config/gfx.hconfig +# +CONFIG_USE_GFX_STACK=n +# +# from $HARMONY_VERSION_PATH/framework/gfx/config/gfx_segger.hconfig +# +CONFIG_USE_SEGGER_EMWIN=n +# +# from $HARMONY_VERSION_PATH/framework/math/dsp/config/dsp.hconfig +# +CONFIG_USE_DSP=n +# +# from $HARMONY_VERSION_PATH/framework/math/libq/config/libq.hconfig +# +CONFIG_USE_LIBQ=n +# +# from $HARMONY_VERSION_PATH/framework/net/pres/config/net_pres.hconfig +# +CONFIG_NET_PRES_USE=y +CONFIG_NET_PRES_SOCKETS=10 +CONFIG_NET_PRES_INSTANCES=1 +# +# from $HARMONY_VERSION_PATH/framework/net/pres/config/net_pres_idx.ftl +# +CONFIG_NET_PRES_IDX0=y +CONFIG_NET_PRES_CONFIG_NAME_IDX0="NET_PRES_0" +CONFIG_NET_PRES_TRANSPORT_AS_TCPIP_IDX0=y +CONFIG_NET_PRES_SUPPORT_STREAM_IDX0=y +CONFIG_NET_PRES_SUPPORT_DATAGRAM_IDX0=n +CONFIG_NET_PRES_SUPPORT_SERVER_IDX0=n +CONFIG_NET_PRES_SUPPORT_CLIENT_IDX0=y +CONFIG_NET_PRES_SUPPORT_ENCRYPTION0=y +CONFIG_NET_PRES_USE_WOLF_SSL_IDX0=y +CONFIG_NET_PRES_SUPPORT_STREAM_ENC_IDX0=y +CONFIG_NET_PRES_SUPPORT_CLIENT_ENC_IDX0=y +# +# from $HARMONY_VERSION_PATH/framework/net/pres/config/net_pres.hconfig +# +CONFIG_NET_PRES_BLOB_CERT_REPO=y +CONFIG_NET_PRES_BLOB_CLIENT_SUPPORT=y +CONFIG_NET_PRES_BLOB_CLIENT_CERT_FILENAME="ca-certs.h" +CONFIG_NET_PRES_BLOB_CLIENT_CERT_VARIABLE="caCert" +CONFIG_NET_PRES_BLOB_CLIENT_CERT_LEN_VARIABLE="caCert_len" +CONFIG_NET_PRES_BLOB_SERVER_SUPPORT=n +# +# from $HARMONY_VERSION_PATH/framework/osal/config/osal.hconfig +# +CONFIG_USE_OSAL=y +# +# from $HARMONY_VERSION_PATH/framework/peripheral/config/peripheral.hconfig +# +CONFIG_PERIPHERAL_LIB=y +# +# from $HARMONY_VERSION_PATH/framework/sample/config/sample_module.hconfig +# +CONFIG_USE_SAMPLE_MODULE=n +# +# from $HARMONY_VERSION_PATH/framework/system/clk/config/sys_clk.hconfig +# +CONFIG_USE_SYS_CLK=y +CONFIG_SYS_CLK_MODE="STATIC" +CONFIG_SYS_CLK_PBDIV0_MZ=2 +CONFIG_SYS_CLK_PBCLK1_ENABLE=y +CONFIG_SYS_CLK_PBDIV1=2 +CONFIG_SYS_CLK_PBCLK2_ENABLE=y +CONFIG_SYS_CLK_PBDIV2=2 +CONFIG_SYS_CLK_PBCLK3_ENABLE=y +CONFIG_SYS_CLK_PBDIV3=2 +CONFIG_SYS_CLK_PBCLK4_ENABLE=y +CONFIG_SYS_CLK_PBDIV4=2 +CONFIG_SYS_CLK_PBCLK6_ENABLE=y +CONFIG_SYS_CLK_PBDIV6=1 +CONFIG_SYS_CLK_PBCLK7_ENABLE=y +CONFIG_SYS_CLK_PBDIV7=1 +CONFIG_SYS_CLK_REFCLK0_ENABLE=n +CONFIG_SYS_CLK_REFCLK1_ENABLE=n +CONFIG_SYS_CLK_REFCLK2_ENABLE=n +CONFIG_SYS_CLK_REFCLK3_ENABLE=n +CONFIG_SYS_CLK_CONFIG_PRIMARY_XTAL="24000000" +CONFIG_SYS_CLK_CONFIG_SECONDARY_XTAL="" +CONFIG_SYS_CLK_FREQ="200000000" +CONFIG_SYS_CLK_PBCLK0_FREQ="100000000" +CONFIG_SYS_CLK_PBCLK1_FREQ="100000000" +CONFIG_SYS_CLK_PBCLK2_FREQ="100000000" +CONFIG_SYS_CLK_PBCLK3_FREQ="100000000" +CONFIG_SYS_CLK_PBCLK4_FREQ="100000000" +CONFIG_SYS_CLK_PBCLK6_FREQ="200000000" +CONFIG_SYS_CLK_PBCLK7_FREQ="200000000" +# +# from $HARMONY_VERSION_PATH/framework/system/command/config/sys_command.hconfig +# +CONFIG_USE_SYS_COMMAND=y +CONFIG_SYS_COMMAND_RTOS="Combined with System Tasks" +CONFIG_COMMAND_PRINT_BUFFER_SIZE=2048 +CONFIG_REMAP_SYS_DEBUG_MESSAGE=y +CONFIG_REMAP_SYS_CONSOLE_MESSAGE=y +# +# from $HARMONY_VERSION_PATH/framework/system/common/config/sys_common.hconfig +# +CONFIG_USE_SYS_COMMON=y +CONFIG_SYS_BUFFER=n +CONFIG_SYS_QUEUE=n +# +# from $HARMONY_VERSION_PATH/framework/system/console/config/sys_console.hconfig +# +CONFIG_USE_SYS_CONSOLE=y +CONFIG_SYS_CONSOLE_MODE="DYNAMIC" +CONFIG_SYS_CONSOLE_OVERRIDE_STDIO=y +CONFIG_SYS_CONSOLE_SOURCE_IDX0="USB_CDC_CONSOLE" +CONFIG_SYS_CONSOLE_RTOS_IDX0="Combined with System Tasks" +CONFIG_SYS_CONSOLE_USB_CDC_INSTANCE_1="USB_DEVICE_CDC_INDEX_0" +CONFIG_SYS_CONSOLE_USB_CDC_COMM_BAUD_RATE="230400" +CONFIG_SYS_CONSOLE_USB_CDC_RD_QUEUE_DEPTH=1 +CONFIG_SYS_CONSOLE_USB_CDC_WR_QUEUE_DEPTH=128 +# +# from $HARMONY_VERSION_PATH/framework/system/debug/config/sys_debug.hconfig +# +CONFIG_USE_SYS_DEBUG=y +CONFIG_SYS_ERR_LEVEL="SYS_ERROR_FATAL" +CONFIG_DEBUG_PRINT_BUFFER_SIZE=1024 +# +# from $HARMONY_VERSION_PATH/framework/system/devcon/config/sys_devcon.hconfig +# +CONFIG_USE_SYS_DEVCON=y +CONFIG_SYS_DEVCON_RTOS="Combined with System Tasks" +CONFIG_SYS_DEVCON_USE_JTAG=n +CONFIG_SYS_DEVCON_USE_TRACE=n +# +# from $HARMONY_VERSION_PATH/framework/system/dma/config/sys_dma.hconfig +# +CONFIG_USE_SYS_DMA=n +# +# from $HARMONY_VERSION_PATH/framework/system/fs/config/sys_fs.hconfig +# +CONFIG_USE_SYS_FS=y +CONFIG_SYS_FS_RTOS="Combined with System Tasks" +CONFIG_SYS_FS_MAX_FILES=25 +CONFIG_SYS_FS_MEDIA_MAX_BLOCK_SIZE=512 +CONFIG_SYS_FS_MEDIA_MANAGER_BUFFER_SIZE=2048 +CONFIG_SYS_FS_AUTO_MOUNT=n +CONFIG_SYS_FS_INSTANCES_NUMBER=1 +CONFIG_SYS_FS_VOLUME_NUMBER=1 +# +# from $HARMONY_VERSION_PATH/framework/system/fs/config/sys_fs_idx.ftl +# +CONFIG_SYS_FS_IDX0=y +# +# from $HARMONY_VERSION_PATH/framework/system/fs/config/sys_fs.hconfig +# +CONFIG_SYS_FS_MAX_FILE_SYSTEM_TYPE=1 +CONFIG_SYS_FS_FAT=n +CONFIG_SYS_FS_MPFS=y +# +# from $HARMONY_VERSION_PATH/framework/system/int/config/sys_int.hconfig +# +CONFIG_USE_SYS_INT=y +CONFIG_USE_EXT_INT=n +# +# from $HARMONY_VERSION_PATH/framework/system/msg/config/sys_msg.hconfig +# +CONFIG_USE_SYS_MSG=n +# +# from $HARMONY_VERSION_PATH/framework/system/ports/config/sys_ports.hconfig +# +CONFIG_USE_SYS_PORTS=y +CONFIG_COMPONENT_PACKAGE="TQFP" +CONFIG_USE_SYS_PORTS_CN_INTERRUPT=n +# +# from $HARMONY_VERSION_PATH/framework/system/ports/config/sys_ports_idx.ftl +# +CONFIG_USE_PORT_B=y +CONFIG_SYS_PORT_B_ANSEL=0x1f +CONFIG_SYS_PORT_B_TRIS=0x8f3f +CONFIG_SYS_PORT_B_LAT=0x4000 +CONFIG_SYS_PORT_B_ODC=0x0 +CONFIG_SYS_PORT_B_CNPU=0x0 +CONFIG_SYS_PORT_B_CNPD=0x0 +CONFIG_SYS_PORT_B_CNEN=0x0 +CONFIG_USE_PORT_C=y +CONFIG_SYS_PORT_C_ANSEL=0x6000 +CONFIG_SYS_PORT_C_TRIS=0x7000 +CONFIG_SYS_PORT_C_LAT=0x0 +CONFIG_SYS_PORT_C_ODC=0x0 +CONFIG_SYS_PORT_C_CNPU=0x0 +CONFIG_SYS_PORT_C_CNPD=0x0 +CONFIG_SYS_PORT_C_CNEN=0x0 +CONFIG_SYS_PORT_D_ANSEL=0x0 +CONFIG_SYS_PORT_D_TRIS=0xe3f +CONFIG_SYS_PORT_D_LAT=0x0 +CONFIG_SYS_PORT_D_ODC=0x0 +CONFIG_SYS_PORT_D_CNPU=0x0 +CONFIG_SYS_PORT_D_CNPD=0x0 +CONFIG_SYS_PORT_D_CNEN=0x0 +CONFIG_USE_PORT_E=y +CONFIG_SYS_PORT_E_ANSEL=0x0 +CONFIG_SYS_PORT_E_TRIS=0xff +CONFIG_SYS_PORT_E_LAT=0x0 +CONFIG_SYS_PORT_E_ODC=0x0 +CONFIG_SYS_PORT_E_CNPU=0x0 +CONFIG_SYS_PORT_E_CNPD=0x0 +CONFIG_SYS_PORT_E_CNEN=0x0 +CONFIG_USE_PORT_F=y +CONFIG_SYS_PORT_F_ANSEL=0x0 +CONFIG_SYS_PORT_F_TRIS=0x39 +CONFIG_SYS_PORT_F_LAT=0x0 +CONFIG_SYS_PORT_F_ODC=0x0 +CONFIG_SYS_PORT_F_CNPU=0x0 +CONFIG_SYS_PORT_F_CNPD=0x0 +CONFIG_SYS_PORT_F_CNEN=0x0 +CONFIG_SYS_PORT_G_ANSEL=0x3c0 +CONFIG_SYS_PORT_G_TRIS=0x3c0 +CONFIG_SYS_PORT_G_LAT=0x0 +CONFIG_SYS_PORT_G_ODC=0x0 +CONFIG_SYS_PORT_G_CNPU=0x0 +CONFIG_SYS_PORT_G_CNPD=0x0 +CONFIG_SYS_PORT_G_CNEN=0x0 +# +# from $HARMONY_VERSION_PATH/framework/system/ports/config/sys_ports_pps_output_idx.ftl +# +CONFIG_USE_PPS_OUTPUT_0=y +CONFIG_SYS_PORT_PPS_OUTPUT_FUNCTION_0="OUTPUT_FUNC_C2OUT" +CONFIG_SYS_PORT_PPS_OUTPUT_PIN_0="OUTPUT_PIN_RPB9" +# +# from $HARMONY_VERSION_PATH/framework/system/random/config/sys_random.hconfig +# +CONFIG_USE_SYS_RANDOM=y +CONFIG_SYS_RANDOM_CRYPTO_SEED_SIZE=32 +# +# from $HARMONY_VERSION_PATH/framework/system/reset/config/sys_reset.hconfig +# +CONFIG_USE_SYS_RESET=y +# +# from $HARMONY_VERSION_PATH/framework/system/touch/config/sys_touch.hconfig +# +CONFIG_USE_SYS_TOUCH=n +# +# from $HARMONY_VERSION_PATH/framework/system/tmr/config/sys_tmr.hconfig +# +CONFIG_USE_SYS_TMR=y +CONFIG_SYS_TMR_RTOS="Combined with System Tasks" +CONFIG_SYS_TMR_POWER_STATE="SYS_MODULE_POWER_RUN_FULL" +CONFIG_SYS_TMR_DRIVER_INDEX="DRV_TMR_INDEX_0" +CONFIG_SYS_TMR_MAX_CLIENT_OBJECTS=5 +CONFIG_SYS_TMR_FREQUENCY=1000 +CONFIG_SYS_TMR_FREQUENCY_TOLERANCE=10 +CONFIG_SYS_TMR_UNIT_RESOLUTION=10000 +CONFIG_SYS_TMR_CLIENT_TOLERANCE=10 +CONFIG_SYS_TMR_INTERRUPT_NOTIFICATION=n +# +# from $HARMONY_VERSION_PATH/framework/system/wdt/config/sys_wdt.hconfig +# +CONFIG_USE_SYS_WDT=n +# +# from $HARMONY_VERSION_PATH/framework/test/config/test.hconfig +# +CONFIG_USE_TEST_HARNESS=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_stack.hconfig +# +CONFIG_USE_TCPIP_STACK=y +CONFIG_TCPIP_RTOS="Combined with System Tasks" +CONFIG_TCPIP_STACK_USE_IPV4=y +CONFIG_TCPIP_STACK_USE_IPV6=n +CONFIG_TCPIP_USE_TCP=y +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcp.hconfig +# +CONFIG_TCPIP_TCP_MAX_SEG_SIZE_TX=1460 +CONFIG_TCPIP_TCP_MAX_SEG_SIZE_RX_LOCAL=1460 +CONFIG_TCPIP_TCP_MAX_SEG_SIZE_RX_NON_LOCAL=536 +CONFIG_TCPIP_TCP_SOCKET_DEFAULT_TX_SIZE=512 +CONFIG_TCPIP_TCP_SOCKET_DEFAULT_RX_SIZE=4096 +CONFIG_TCPIP_TCP_DYNAMIC_OPTIONS=y +CONFIG_TCPIP_TCP_START_TIMEOUT_VAL=1000 +CONFIG_TCPIP_TCP_DELAYED_ACK_TIMEOUT=100 +CONFIG_TCPIP_TCP_FIN_WAIT_2_TIMEOUT=5000 +CONFIG_TCPIP_TCP_KEEP_ALIVE_TIMEOUT=10000 +CONFIG_TCPIP_TCP_CLOSE_WAIT_TIMEOUT=200 +CONFIG_TCPIP_TCP_MAX_RETRIES=5 +CONFIG_TCPIP_TCP_MAX_UNACKED_KEEP_ALIVES=6 +CONFIG_TCPIP_TCP_MAX_SYN_RETRIES=3 +CONFIG_TCPIP_TCP_AUTO_TRANSMIT_TIMEOUT_VAL=40 +CONFIG_TCPIP_TCP_WINDOW_UPDATE_TIMEOUT_VAL=200 +CONFIG_TCPIP_TCP_MAX_SOCKETS=15 +CONFIG_TCPIP_TCP_TASK_TICK_RATE=5 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_stack.hconfig +# +CONFIG_TCPIP_USE_UDP=y +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/udp.hconfig +# +CONFIG_TCPIP_UDP_MAX_SOCKETS=10 +CONFIG_TCPIP_UDP_SOCKET_DEFAULT_TX_SIZE=512 +CONFIG_TCPIP_UDP_USE_TX_CHECKSUM=y +CONFIG_TCPIP_UDP_USE_RX_CHECKSUM=y +CONFIG_TCPIP_UDP_SOCKET_DEFAULT_TX_QUEUE_LIMIT=3 +CONFIG_TCPIP_UDP_SOCKET_DEFAULT_RX_QUEUE_LIMIT=3 +CONFIG_TCPIP_UDP_USE_POOL_BUFFERS=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_stack.hconfig +# +CONFIG_TCPIP_STACK_NETWORK_CONFIG_NUMBER=1 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/network_config_idx.ftl +# +CONFIG_TCPIP_STACK_NETWORK_CONFIG_IDX0=y +CONFIG_TCPIP_NETWORK_DEFAULT_INTERFACE_NAME_IDX0="PIC32INT" +CONFIG_TCPIP_NETWORK_DEFAULT_HOST_NAME_IDX0="AWS_IOT_ETHERNET" +CONFIG_TCPIP_NETWORK_DEFAULT_MAC_ADDR_IDX0="" +CONFIG_TCPIP_NETWORK_DEFAULT_IP_ADDRESS_IDX0="0.0.0.0" +CONFIG_TCPIP_NETWORK_DEFAULT_IP_MASK_IDX0="255.255.255.0" +CONFIG_TCPIP_NETWORK_DEFAULT_GATEWAY_IDX0="192.168.100.1" +CONFIG_TCPIP_NETWORK_DEFAULT_DNS_IDX0="192.168.100.1" +CONFIG_TCPIP_NETWORK_DEFAULT_SECOND_DNS_IDX0="0.0.0.0" +CONFIG_TCPIP_NETWORK_DEFAULT_POWER_MODE_IDX0="full" +CONFIG_TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS_IDX0="TCPIP_NETWORK_CONFIG_DHCP_CLIENT_ON" +CONFIG_TCPIP_NETWORK_DEFAULT_MAC_DRIVER_IDX0="DRV_ETHMAC_PIC32MACObject" +CONFIG_TCPIP_NETWORK_DEFAULT_IPV6_ADDRESS_IDX0="" +CONFIG_TCPIP_NETWORK_DEFAULT_IPV6_PREFIX_LENGTH_IDX0=0 +CONFIG_TCPIP_NETWORK_DEFAULT_IPV6_GATEWAY_IDX0="" +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_stack.hconfig +# +CONFIG_TCPIP_STACK_TICK_RATE=5 +CONFIG_TCPIP_STACK_USER_NOTIFICATION=n +CONFIG_TCPIP_STACK_DOWN_OPERATION=y +CONFIG_TCPIP_STACK_IF_UP_DOWN_OPERATION=y +CONFIG_TCPIP_STACK_CONFIGURATION_SAVE_RESTORE=y +CONFIG_TCPIP_STACK_SECURE_PORT_ENTRIES=10 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_heap.hconfig +# +CONFIG_TCPIP_USE_HEAP=y +CONFIG_TCPIP_STACK_USE_HEAP_CONFIG="TCPIP_STACK_HEAP_TYPE_INTERNAL_HEAP" +CONFIG_TCPIP_STACK_MALLOC_FUNC="malloc" +CONFIG_TCPIP_STACK_CALLOC_FUNC="calloc" +CONFIG_TCPIP_STACK_FREE_FUNC="free" +CONFIG_TCPIP_STACK_HEAP_USE_FLAGS="TCPIP_STACK_HEAP_FLAG_ALLOC_UNCACHED" +CONFIG_TCPIP_STACK_HEAP_USAGE_CONFIG="TCPIP_STACK_HEAP_USE_DEFAULT" +CONFIG_TCPIP_STACK_SUPPORTED_HEAPS=1 +CONFIG_TCPIP_STACK_DRAM_SIZE=39250 +CONFIG_TCPIP_STACK_DRAM_RUN_LIMIT=2048 +CONFIG_TCPIP_STACK_DRAM_DEBUG_ENABLE=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/arp.hconfig +# +CONFIG_TCPIP_ARP_CACHE_ENTRIES=5 +CONFIG_TCPIP_ARP_CACHE_DELETE_OLD=y +CONFIG_TCPIP_ARP_CACHE_SOLVED_ENTRY_TMO=1200 +CONFIG_TCPIP_ARP_CACHE_PENDING_ENTRY_TMO=60 +CONFIG_TCPIP_ARP_CACHE_PENDING_RETRY_TMO=2 +CONFIG_TCPIP_ARP_CACHE_PERMANENT_QUOTA=50 +CONFIG_TCPIP_ARP_CACHE_PURGE_THRESHOLD=75 +CONFIG_TCPIP_ARP_CACHE_PURGE_QUANTA=1 +CONFIG_TCPIP_ARP_CACHE_ENTRY_RETRIES=3 +CONFIG_TCPIP_ARP_GRATUITOUS_PROBE_COUNT=1 +CONFIG_TCPIP_ARP_TASK_PROCESS_RATE=2 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/berkeley_api.hconfig +# +CONFIG_TCPIP_STACK_USE_BERKELEY_API=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/dhcp.hconfig +# +CONFIG_TCPIP_STACK_USE_DHCP_CLIENT=y +CONFIG_TCPIP_DHCP_TIMEOUT=10 +CONFIG_TCPIP_DHCP_TASK_TICK_RATE=5 +CONFIG_TCPIP_DHCP_CLIENT_ENABLED=y +CONFIG_TCPIP_DHCP_HOST_NAME_SIZE=20 +CONFIG_TCPIP_DHCP_CLIENT_CONNECT_PORT=68 +CONFIG_TCPIP_DHCP_SERVER_LISTEN_PORT=67 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/dhcps.hconfig +# +CONFIG_TCPIP_STACK_USE_DHCP_SERVER=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/dns.hconfig +# +CONFIG_TCPIP_USE_DNS_CLIENT=y +CONFIG_TCPIP_DNS_CLIENT_SERVER_TMO=60 +CONFIG_TCPIP_DNS_CLIENT_TASK_PROCESS_RATE=200 +CONFIG_TCPIP_DNS_CLIENT_CACHE_ENTRIES=5 +CONFIG_TCPIP_DNS_CLIENT_CACHE_ENTRY_TMO=0 +CONFIG_TCPIP_DNS_CLIENT_CACHE_PER_IPV4_ADDRESS=5 +CONFIG_TCPIP_DNS_CLIENT_CACHE_PER_IPV6_ADDRESS=1 +CONFIG_TCPIP_DNS_CLIENT_ADDRESS_TYPE="IP_ADDRESS_TYPE_IPV4" +CONFIG_TCPIP_DNS_CLIENT_CACHE_DEFAULT_TTL_VAL=1200 +CONFIG_TCPIP_DNS_CLIENT_CACHE_UNSOLVED_ENTRY_TMO=10 +CONFIG_TCPIP_DNS_CLIENT_LOOKUP_RETRY_TMO=3 +CONFIG_TCPIP_DNS_CLIENT_MAX_HOSTNAME_LEN=256 +CONFIG_TCPIP_DNS_CLIENT_MAX_SELECT_INTERFACES=4 +CONFIG_TCPIP_DNS_CLIENT_DELETE_OLD_ENTRIES=y +CONFIG_TCPIP_DNS_CLIENT_USER_NOTIFICATION=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/dnss.hconfig +# +CONFIG_TCPIP_USE_DNSS=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/ddns.hconfig +# +CONFIG_TCPIP_USE_DDNS=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/ftp.hconfig +# +CONFIG_TCPIP_USE_FTP_MODULE=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/http.hconfig +# +CONFIG_TCPIP_STACK_USE_HTTP_SERVER=y +CONFIG_TCPIP_HTTP_MAX_HEADER_LEN=15 +CONFIG_TCPIP_HTTP_CACHE_LEN="600" +CONFIG_TCPIP_HTTP_TIMEOUT=45 +CONFIG_TCPIP_HTTP_MAX_CONNECTIONS=1 +CONFIG_TCPIP_HTTP_DEFAULT_FILE="index.htm" +CONFIG_TCPIP_HTTPS_DEFAULT_FILE="index.htm" +CONFIG_TCPIP_HTTP_DEFAULT_LEN=10 +CONFIG_TCPIP_HTTP_FILE_UPLOAD_ENABLE=n +CONFIG_TCPIP_HTTP_USE_POST=y +CONFIG_TCPIP_HTTP_USE_COOKIES=n +CONFIG_TCPIP_HTTP_USE_BASE64_DECODE=n +CONFIG_TCPIP_HTTP_USE_AUTHENTICATION=n +CONFIG_TCPIP_HTTP_NO_AUTH_WITHOUT_SSL=n +CONFIG_TCPIP_HTTP_MAX_DATA_LEN=4096 +CONFIG_TCPIP_HTTP_MIN_CALLBACK_FREE=16 +CONFIG_TCPIP_HTTP_SKT_TX_BUFF_SIZE=0 +CONFIG_TCPIP_HTTP_SKT_RX_BUFF_SIZE=0 +CONFIG_TCPIP_HTTP_CFG_FLAGS="TCPIP_HTTP_MODULE_FLAG_ADJUST_SKT_FIFOS" +CONFIG_TCPIP_HTTP_TASK_RATE=33 +CONFIG_TCPIP_HTTP_CUSTOM_TEMPLATE=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/icmp.hconfig +# +CONFIG_TCPIP_STACK_USE_ICMPV4=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/nbns.hconfig +# +CONFIG_TCPIP_USE_NBNS=y +CONFIG_TCPIP_NBNS_TASK_TICK_RATE=110 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_reboot.hconfig +# +CONFIG_TCPIP_USE_REBOOT_SERVER=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/smtp.hconfig +# +CONFIG_TCPIP_USE_SMTP_CLIENT=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/snmp.hconfig +# +CONFIG_TCPIP_USE_SNMP=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/sntp.hconfig +# +CONFIG_TCPIP_USE_SNTP_CLIENT=y +CONFIG_TCPIP_NTP_DEFAULT_IF="PIC32INT" +CONFIG_TCPIP_NTP_STRING_VERSION="SNTP_VERSION_4" +CONFIG_TCPIP_NTP_DEFAULT_CONNECTION_TYPE="IP_ADDRESS_TYPE_IPV4" +CONFIG_TCPIP_NTP_EPOCH=2208988800 +CONFIG_TCPIP_NTP_REPLY_TIMEOUT=6 +CONFIG_TCPIP_NTP_MAX_STRATUM=15 +CONFIG_TCPIP_NTP_TIME_STAMP_TMO=660 +CONFIG_TCPIP_NTP_SERVER="pool.ntp.org" +CONFIG_TCPIP_NTP_SERVER_MAX_LENGTH="30" +CONFIG_TCPIP_NTP_QUERY_INTERVAL="600" +CONFIG_TCPIP_NTP_FAST_QUERY_INTERVAL="14" +CONFIG_TCPIP_NTP_TASK_TICK_RATE="1100" +CONFIG_TCPIP_NTP_RX_QUEUE_LIMIT="2" +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/telnet.hconfig +# +CONFIG_TCPIP_USE_TELNET=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/zeroconf.hconfig +# +CONFIG_TCPIP_USE_LINK_ZERO_CONFIG=y +CONFIG_TCPIP_ZC_WARN_ZCLL=n +CONFIG_TCPIP_ZC_INFO_ZCLL=n +CONFIG_TCPIP_ZC_DEBUG_ZCLL=n +CONFIG_TCPIP_ZC_LL_PROBE_WAIT=1 +CONFIG_TCPIP_ZC_LL_PROBE_MIN=1 +CONFIG_TCPIP_ZC_LL_PROBE_MAX=2 +CONFIG_TCPIP_ZC_LL_PROBE_NUM=3 +CONFIG_TCPIP_ZC_LL_ANNOUNCE_WAIT=2 +CONFIG_TCPIP_ZC_LL_ANNOUNCE_NUM=2 +CONFIG_TCPIP_ZC_LL_ANNOUNCE_INTERVAL=2 +CONFIG_TCPIP_ZC_LL_MAX_CONFLICTS=10 +CONFIG_TCPIP_ZC_LL_RATE_LIMIT_INTERVAL=60 +CONFIG_TCPIP_ZC_LL_DEFEND_INTERVAL=10 +CONFIG_TCPIP_ZC_LL_IPV4_LLBASE=0xa9fe0100 +CONFIG_TCPIP_ZC_LL_IPV4_LLBASE_MASK=0x0000FFFF +CONFIG_TCPIP_ZC_LL_TASK_TICK_RATE=333 +CONFIG_TCPIP_USE_MULTI_CAST_DNS_ZERO_CONFIG=y +CONFIG_TCPIP_ZC_INFO_MDNS=n +CONFIG_TCPIP_ZC_WARN_MDNS=n +CONFIG_TCPIP_ZC_DEBUG_MDNS=n +CONFIG_TCPIP_ZC_MDNS_TASK_TICK_RATE=63 +CONFIG_TCPIP_ZC_MDNS_PORT=5353 +CONFIG_TCPIP_ZC_MDNS_MAX_HOST_NAME_SIZE=32 +CONFIG_TCPIP_ZC_MDNS_MAX_LABEL_SIZE=64 +CONFIG_TCPIP_ZC_MDNS_MAX_RR_NAME_SIZE=256 +CONFIG_TCPIP_ZC_MDNS_MAX_SRV_TYPE_SIZE=32 +CONFIG_TCPIP_ZC_MDNS_MAX_SRV_NAME_SIZE=64 +CONFIG_TCPIP_ZC_MDNS_MAX_TXT_DATA_SIZE=128 +CONFIG_TCPIP_ZC_MDNS_RESOURCE_RECORD_TTL_VAL=3600 +CONFIG_TCPIP_ZC_MDNS_MAX_RR_NUM=4 +CONFIG_TCPIP_ZC_MDNS_PROBE_WAIT=750 +CONFIG_TCPIP_ZC_MDNS_PROBE_INTERVAL=250 +CONFIG_TCPIP_ZC_MDNS_PROBE_NUM=3 +CONFIG_TCPIP_ZC_MDNS_MAX_PROBE_CONFLICT_NUM=30 +CONFIG_TCPIP_ZC_MDNS_ANNOUNCE_NUM=3 +CONFIG_TCPIP_ZC_MDNS_ANNOUNCE_INTERVAL=250 +CONFIG_TCPIP_ZC_MDNS_ANNOUNCE_WAIT=250 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_announce.hconfig +# +CONFIG_TCPIP_USE_ANNOUNCE=y +CONFIG_TCPIP_ANNOUNCE_MAX_PAYLOAD=512 +CONFIG_TCPIP_ANNOUNCE_TASK_RATE=333 +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/iperf.hconfig +# +CONFIG_TCPIP_USE_IPERF=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_cmd.hconfig +# +CONFIG_TCPIP_STACK_USE_COMMANDS=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/tftpc.hconfig +# +CONFIG_TCPIP_USE_TFTPC_MODULE=n +# +# from $HARMONY_VERSION_PATH/framework/tcpip/config/sys_fs_wrapper.hconfig +# +CONFIG_TCPIP_SYS_FS_MAX_PATH=80 +CONFIG_TCPIP_LOCAL_WEBSITE_PATH="/mnt/mchpSite1" +CONFIG_TCPIP_SYS_FS_DRIVE="FLASH" +CONFIG_TCPIP_SYS_FS_NVM_VOL="/dev/nvma1" +CONFIG_TCPIP_SYS_FS_SD_VOL="/dev/mmcblka1" +# +# from $HARMONY_VERSION_PATH/framework/usb/config/usb.hconfig +# +CONFIG_USE_USB_STACK=y +CONFIG_USB_RTOS="Combined with System Tasks" +CONFIG_DRV_USB_INTERRUPT_MODE=y +CONFIG_DRV_USB_DEVICE_SUPPORT=y +CONFIG_DRV_USB_HOST_SUPPORT=n +CONFIG_DRV_USB_BETA_SW_HOST_SUPPORT=n +CONFIG_DRV_USB_ENDPOINTS_NUMBER=3 +CONFIG_USB_DEVICE_EP0_BUFFER_SIZE="64" +# +# from $HARMONY_VERSION_PATH/framework/usb/config/usb_device_idx.ftl +# +CONFIG_USB_DEVICE_INST_IDX0=y +CONFIG_USB_DEVICE_SPEED_HS_IDX0="USB_SPEED_HIGH" +CONFIG_USB_DEVICE_NUMBER_REGISTRED_FUNCTION_DRIVER_IDX0=1 +CONFIG_USB_DEVICE_FUNCTION_1_IDX0=y +# +# from $HARMONY_VERSION_PATH/framework/usb/config/usb_device_function_1.ftl +# +CONFIG_USB_DEVICE_FUNCTION_1_DEVICE_CLASS_IDX0="CDC" +CONFIG_USB_DEVICE_FUNCTION_1_CONFIGURATION_IDX0=1 +CONFIG_USB_DEVICE_FUNCTION_1_INTERFACE_NUMBER_IDX0=0 +CONFIG_USB_DEVICE_FUNCTION_1_SPEED_HS_IDX0="USB_SPEED_HIGH|USB_SPEED_FULL" +CONFIG_USB_DEVICE_FUNCTION_1_CDC_READ_Q_SIZE_IDX0=1 +CONFIG_USB_DEVICE_FUNCTION_1_CDC_WRITE_Q_SIZE_IDX0=128 +CONFIG_USB_DEVICE_FUNCTION_1_CDC_SERIAL_NOTIFIACATION_Q_SIZE_IDX0=1 +CONFIG_USB_DEVICE_FUNCTION_1_CDC_INT_ENDPOINT_NUMBER_IDX0=1 +CONFIG_USB_DEVICE_FUNCTION_1_CDC_BULK_ENDPOINT_NUMBER_IDX0=2 +# +# from $HARMONY_VERSION_PATH/framework/usb/config/usb_device_idx.ftl +# +CONFIG_USB_DEVICE_PRODUCT_ID_SELECT_IDX0="cdc_com_port_single_demo" +CONFIG_USB_DEVICE_VENDOR_ID_IDX0="0x04D8" +CONFIG_USB_DEVICE_PRODUCT_ID_IDX0="0x000A" +CONFIG_USB_DEVICE_MANUFACTURER_STRING_IDX0="Microchip Technology Inc." +CONFIG_USB_DEVICE_PRODUCT_STRING_DESCRIPTOR_IDX0="Simple CDC Device Demo" +CONFIG_USB_DEVICE_SUSPEND_IN_SLEEP_IDX0=n +CONFIG_DRV_USB_INTERRUPT_PRIORITY_IDX0="INT_PRIORITY_LEVEL4" +CONFIG_DRV_USB_INTERRUPT_SUB_PRIORITY_IDX0="INT_SUBPRIORITY_LEVEL0" +CONFIG_DRV_USBDMA_INTERRUPT_PRIORITY_IDX0="INT_PRIORITY_LEVEL4" +CONFIG_DRV_USBDMA_INTERRUPT_SUB_PRIORITY_IDX0="INT_SUBPRIORITY_LEVEL0" +CONFIG_USB_DEVICE_POWER_STATE_IDX0="SYS_MODULE_POWER_RUN_FULL" +# +# from $HARMONY_VERSION_PATH/framework/usb/config/usb.hconfig +# +CONFIG_USB_DEVICE_SOF_EVENT_ENABLE=n +CONFIG_USB_DEVICE_SET_DESCRIPTOR_EVENT_ENABLE=n +CONFIG_USB_DEVICE_SYNCH_FRAME_EVENT_ENABLE=n +CONFIG_USB_DEVICE_REMOTE_WAKEUP=n +CONFIG_USB_DEVICE_BOS_DESCRIPTOR_SUPPORT=n +CONFIG_USB_DEVICE_STRING_DESCRIPTOR_TABLE_ADVANCED=n +# +# from $HARMONY_VERSION_PATH/bsp/config/bsp.hconfig +# +CONFIG_USE_BSP=n +# +# from $HARMONY_VERSION_PATH/third_party/rtos/config/rtos.hconfig +# +CONFIG_USE_3RDPARTY_RTOS=y +CONFIG_3RDPARTY_RTOS_USED="FreeRTOS_V8.x.x" +# +# from $HARMONY_VERSION_PATH/third_party/rtos/FreeRTOS/config/freertos_menu.hconfig +# +CONFIG_FREERTOS_PREEMPTIVE_SCHEDULER=y +CONFIG_FREERTOS_COOPERATIVE_SCHEDULER=n +CONFIG_FREERTOS_PORT_OPTIMIZED_TASK_SELECTION=y +CONFIG_FREERTOS_GENERIC_TASK_SELECTION=n +CONFIG_FREERTOS_TICKLESS_IDLE=n +CONFIG_FREERTOS_TICK_INTERRUPT=y +CONFIG_FREERTOS_CPU_CLOCK_HZ="200000000" +CONFIG_FREERTOS_PERIPHERAL_CLOCK_HZ="100000000" +CONFIG_FREERTOS_TIMER_ID="TMR_ID_1" +CONFIG_FREERTOS_TICK_RATE_HZ=1000 +CONFIG_FREERTOS_MAX_PRIORITIES=5 +CONFIG_FREERTOS_MINIMAL_STACK_SIZE=512 +CONFIG_FREERTOS_ISR_STACK_SIZE=1024 +CONFIG_FREERTOS_HEAP_1=n +CONFIG_FREERTOS_HEAP_2=y +CONFIG_FREERTOS_HEAP_3=n +CONFIG_FREERTOS_HEAP_4=n +CONFIG_FREERTOS_HEAP_5=n +CONFIG_FREERTOS_TOTAL_HEAP_SIZE=131072 +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +CONFIG_FREERTOS_USE_16_BIT_TICKS=n +CONFIG_FREERTOS_IDLE_SHOULD_YIELD=y +CONFIG_FREERTOS_USE_MUTEXES=y +CONFIG_FREERTOS_USE_RECURSIVE_MUTEXES=n +CONFIG_FREERTOS_USE_COUNTING_SEMAPHORES=y +CONFIG_FREERTOS_USE_TASK_NOTIFICATIONS=y +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_USE_QUEUE_SETS=n +CONFIG_FREERTOS_USE_TIME_SLICING=n +CONFIG_FREERTOS_USE_NEWLIB_REENTRANT=n +CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY=n +CONFIG_FREERTOS_IDLE_HOOK=n +CONFIG_FREERTOS_TICK_HOOK=n +CONFIG_FREERTOS_NO_STACK_OVERFLOW_CHECK=n +CONFIG_FREERTOS_STACK_OVERFLOW_CHECK_METHOD_1=n +CONFIG_FREERTOS_STACK_OVERFLOW_CHECK_METHOD_2=y +CONFIG_FREERTOS_USE_MALLOC_FAILED_HOOK=y +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=n +CONFIG_FREERTOS_USE_TRACE_FACILITY=n +CONFIG_FREERTOS_USE_CO_ROUTINES=n +CONFIG_FREERTOS_MAX_CO_ROUTINE_PRIORITIES=2 +CONFIG_FREERTOS_USE_TIMERS=n +CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG=n +CONFIG_FREERTOS_USE_CONFIGASSERT=n +CONFIG_FREERTOS_KERNEL_INTERRUPT_PRIORITY=1 +CONFIG_FREERTOS_MAX_SYSCALL_INTERRUPT_PRIORITY=3 +CONFIG_FREERTOS_INCLUDE_VTASKPRIORITYSET=y +CONFIG_FREERTOS_INCLUDE_UXTASKPRIORITYGET=y +CONFIG_FREERTOS_INCLUDE_VTASKDELETE=y +CONFIG_FREERTOS_INCLUDE_VTASKCLEANUPRESOURCES=n +CONFIG_FREERTOS_INCLUDE_VTASKSUSPEND=y +CONFIG_FREERTOS_INCLUDE_VTASKDELAYUNTIL=y +CONFIG_FREERTOS_INCLUDE_VTASKDELAY=y +CONFIG_FREERTOS_INCLUDE_UXTASKGETSTACKHIGHWATERMARK=n +CONFIG_FREERTOS_INCLUDE_XTASKGETSCHEDULERSTATE=n +CONFIG_FREERTOS_INCLUDE_XTASKGETCURRENTTASKHANDLE=n +CONFIG_FREERTOS_INCLUDE_XTASKGETIDLETASKHANDLE=n +CONFIG_FREERTOS_INCLUDE_XTASKGETTIMERDAEMONTASKHANDLE=n +CONFIG_FREERTOS_INCLUDE_XQUEUEGETMUTEXHOLDER=n +CONFIG_FREERTOS_INCLUDE_XSEMAPHOREGETMUTEXHOLDER=n +CONFIG_FREERTOS_INCLUDE_PCTASKGETTASKNAME=n +CONFIG_FREERTOS_INCLUDE_ETASKGETSTATE=n +CONFIG_FREERTOS_INCLUDE_XEVENTGROUPSETBITFROMISR=n +CONFIG_FREERTOS_INCLUDE_XTIMERPENDFUNCTIONCALL=n +# +# from $HARMONY_VERSION_PATH/third_party/tcpip/config/wolfssl.hconfig +# +CONFIG_USE_3RDPARTY_WOLFSSL=y +CONFIG_WOLFSSL_MULTI_THREAD_SUPPORT=n +CONFIG_WOLFSSL_USE_FAST_MATH=y +CONFIG_WOLFSSL_USE_MZ_CRYPTO=n +CONFIG_WOLFSSL_TLS=y +CONFIG_WOLFSSL_DH=y +CONFIG_WOLFSSL_PSK=y +CONFIG_WOLFSSL_PWDBASED=y +CONFIG_WOLFSSL_CERT_GEN=n +CONFIG_WOLFSSL_DER_LOAD=n +CONFIG_WOLFSSL_DTLS=n +CONFIG_WOLFSSL_KEY_GEN=n +CONFIG_WOLFSSL_HAVE_CRL=n +CONFIG_WOLFSSL_HAVE_ECC=n +CONFIG_WOLFSSL_HAVE_LIBZ=n +CONFIG_WOLFSSL_HAVE_OCSP=n +CONFIG_WOLFSSL_DES3=y +CONFIG_WOLFSSL_AES=y +CONFIG_WOLFSSL_HAVE_AESCCM=n +CONFIG_WOLFSSL_HAVE_AESGCM=n +CONFIG_WOLFSSL_DSA=y +CONFIG_WOLFSSL_HMAC=y +CONFIG_WOLFSSL_RC4=y +CONFIG_WOLFSSL_RABBIT=y +CONFIG_WOLFSSL_HC128=y +CONFIG_WOLFSSL_HAVE_CAMELLIA=n +CONFIG_WOLFSSL_MD4=y +CONFIG_WOLFSSL_SHA256=y +CONFIG_WOLFSSL_RIPEMD=n +CONFIG_WOLFSSL_SHA384=n +CONFIG_WOLFSSL_SHA512=n +CONFIG_WOLFSSL_SESSION_CACHE=y +CONFIG_WOLFSSL_SMALL_SESSION_CACHE=n +CONFIG_WOLFSSL_ERROR_STRINGS=y +CONFIG_WOLFSSL_WOLFSSL_CLIENT=y +CONFIG_WOLFSSL_WOLFSSL_SERVER=y +CONFIG_WOLFSSL_DEBUG_SUPPORT=n +CONFIG_WOLFSSL_OPENSSL_EXTRA=n +CONFIG_WOLFSSL_OLD_TLS_SUPPORT=y +# +# from $HARMONY_VERSION_PATH/third_party/tcpip/iniche/config/embtcp.hconfig +# +CONFIG_IN_EMB_TCPIP_USE_TCP=n +# +# from $HARMONY_VERSION_PATH/third_party/tcpip/iniche/config/embdual.hconfig +# +CONFIG_IN_EMB_DUAL_USE_TCP=n +# +# from $HARMONY_VERSION_PATH/third_party/tcpip/iniche/config/stack.hconfig +# +CONFIG_IN_TCPIP=n +# +# from $HARMONY_VERSION_PATH/third_party/gfx/config/gfxtp.hconfig +# +CONFIG_3RDPARTY_SEGGER_EMWIN_LIBRARY=n +# +# from $HARMONY_VERSION_PATH/config/harmony.hconfig +# +CONFIG_DEVICE_CONFIGURATION=y +# +# from $HARMONY_VERSION_PATH/utilities/mhc/config/PIC32MZ2048EFM064.hconfig +# +CONFIG_USERID=0xffff +CONFIG_FMIIEN="OFF" +CONFIG_FETHIO="ON" +CONFIG_PGL1WAY="ON" +CONFIG_PMDL1WAY="ON" +CONFIG_IOL1WAY="ON" +CONFIG_FUSBIDIO="ON" +CONFIG_FPLLIDIV="DIV_3" +CONFIG_FPLLRNG="RANGE_8_16_MHZ" +CONFIG_FPLLICLK="PLL_POSC" +CONFIG_FPLLMULT="MUL_50" +CONFIG_FPLLODIV="DIV_2" +CONFIG_UPLLFSEL="FREQ_24MHZ" +CONFIG_FNOSC="SPLL" +CONFIG_DMTINTV="WIN_127_128" +CONFIG_FSOSCEN="OFF" +CONFIG_IESO="OFF" +CONFIG_POSCMOD="EC" +CONFIG_OSCIOFNC="OFF" +CONFIG_FCKSM="CSECME" +CONFIG_WDTPS="PS1048576" +CONFIG_WDTSPGM="STOP" +CONFIG_WINDIS="NORMAL" +CONFIG_FWDTEN="OFF" +CONFIG_FWDTWINSZ="WINSZ_25" +CONFIG_DMTCNT="DMT31" +CONFIG_FDMTEN="OFF" +CONFIG_DEBUG="OFF" +CONFIG_JTAGEN="OFF" +CONFIG_ICESEL="ICS_PGx1" +CONFIG_TRCEN="OFF" +CONFIG_BOOTISA="MIPS32" +CONFIG_FECCCON="OFF_UNLOCKED" +CONFIG_FSLEEP="OFF" +CONFIG_FDBGWP="WP_DEBUG" +CONFIG_DBGPER="PG_ALL" +CONFIG_SMCLR="MCLR_NORM" +CONFIG_SOSCGAIN="GAIN_2X" +CONFIG_SOSCBOOST="ON" +CONFIG_POSCGAIN="GAIN_2X" +CONFIG_POSCBOOST="ON" +CONFIG_EJTAGBEN="NORMAL" +CONFIG_CP="OFF" +CONFIG_TSEQ=0x0000 +CONFIG_CSEQ=0xffff +# +# from $HARMONY_VERSION_PATH/utilities/mhc/config/project.hconfig +# +CONFIG_XC32_HEAP="262144" diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/config.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/config.h new file mode 100644 index 0000000..5a9c800 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/config.h @@ -0,0 +1,78 @@ +/******************************************************************************* + Application Header + + File Name: + config.h + + Summary: + config file for CyaSSL to avoid custom build options + + Description: + config file for CyaSSL to avoid custom build options + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2011-2012 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +//DOM-IGNORE-END + + +#ifndef CONFIG_H +#define CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(INLINE) +#undef INLINE +#define INLINE inline +#endif + +#define MICROCHIP_MPLAB_HARMONY +#define MICROCHIP_TCPIP +#define WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MAX + +#define MICROCHIP_PIC32_RNG +#define NEED_AES_TABLES +#define SIZEOF_LONG_LONG 8 +#define WOLFSSL_USER_IO +#define NO_WRITEV +#define NO_DEV_RANDOM +#define NO_FILESYSTEM +#define WOLFSSL_STATIC_RSA + + +#define SINGLE_THREADED + +#define USE_FAST_MATH +#define TFM_TIMING_RESISTANT + + + +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_H */ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/configuration.xml b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/configuration.xml new file mode 100644 index 0000000..e568b64 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/configuration.xml @@ -0,0 +1,1301 @@ + + + + + + + + + + sys_random.c + Source Files/framework/system/random/src + + + semphr.h + Header Files/FreeRTOS + + + ecc.c + Source Files/framework/crypto/src + + + zero_conf_helper.h + Header Files/framework/tcpip/stack + + + tcpip_heap_alloc.h + Header Files/framework/tcpip/stack + + + ge_low_mem.c + Source Files/third_party/wolfssl/wolfcrypt + + + chacha.h + Header Files/third_party/wolfssl/wolfcrypt + + + udp_private.h + Header Files/framework/tcpip/stack + + + tcpip_mac.h + Header Files/framework/tcpip + + + dsa.c + Source Files/third_party/wolfssl/wolfcrypt + + + portmacro.h + Header Files/FreeRTOS/portable/MPLAB/PIC32MZ + + + chacha20_poly1305.c + Source Files/third_party/wolfssl/wolfcrypt + + + random.h + Header Files/framework/crypto/src + + + list.h + Header Files/FreeRTOS + + + curve25519.c + Source Files/third_party/wolfssl/wolfcrypt + + + pkcs7.c + Source Files/third_party/wolfssl/wolfcrypt + + + usb_device.c + Source Files/framework/usb/src/dynamic + + + dns_manager.h + Header Files/framework/tcpip/stack + + + sys_command.c + Source Files/framework/system/command/src + + + blake2-impl.h + Header Files/third_party/wolfssl/wolfcrypt + + + sys_console_usb_cdc.c + Source Files/framework/system/console/src + + + sha512.c + Source Files/framework/crypto/src + + + tls.h + Header Files/framework/tcpip + + + system.h + Header Files/framework/system + + + tcpip_manager.h + Header Files/framework/tcpip + + + tcpip_common_ports.h + Header Files/framework/tcpip + + + http_manager.h + Header Files/framework/tcpip/stack + + + sys_fs_media_manager.h + Header Files/framework/system/fs + + + timers.h + Header Files/FreeRTOS + + + io.c + Source Files/third_party/wolfssl + + + task.h + Header Files/FreeRTOS + + + crl.h + Header Files/third_party/wolfssl + + + dhcp.h + Header Files/framework/tcpip + + + ipv4.h + Header Files/framework/tcpip + + + sys_fs_wrapper.h + Header Files/framework/tcpip/common + + + sys_reset.h + Header Files/framework/system/reset + + + ipv4_private.h + Header Files/framework/tcpip/stack + + + list.c + Source Files/FreeRTOS + + + drv_tmr.h + Header Files/framework/driver/tmr + + + tcp_manager.h + Header Files/framework/tcpip/stack + + + usb_device_cdc.h + Header Files/framework/usb + + + net_pres_certstore.h + Header Files/framework/net/pres + + + internal.h + Header Files/framework/crypto/src + + + zero_conf_multicast_dns.c + Source Files/framework/tcpip/stack + + + tcpip_manager.c + Source Files/framework/tcpip/stack + + + tcpip_notify.h + Header Files/framework/tcpip/stack + + + ISR_Support.h + Header Files/FreeRTOS/portable/MPLAB/PIC32MZ + + + chacha.c + Source Files/third_party/wolfssl/wolfcrypt + + + drv_ethphy_local.h + Header Files/framework/driver/ethphy + + + portable.h + Header Files/FreeRTOS + + + dns.h + Header Files/framework/tcpip + + + sys_command.h + Header Files/framework/system/command + + + tcpip_module_manager.h + Header Files/framework/tcpip/stack + + + zero_conf_link_local_private.h + Header Files/framework/tcpip/stack + + + error.c + Source Files/framework/crypto/src + + + drv_ethmac_local.h + Header Files/framework/driver/ethmac + + + hash.c + Source Files/framework/crypto/src + + + arp_private.h + Header Files/framework/tcpip/stack + + + logging.c + Source Files/framework/crypto/src + + + tcpip_manager_control.h + Header Files/framework/tcpip/stack + + + logging.h + Header Files/framework/crypto/src + + + sys_devcon.h + Header Files/framework/system/devcon + + + internal.c + Source Files/third_party/wolfssl + + + nbns.h + Header Files/framework/tcpip + + + sys_debug.h + Header Files/framework/system/debug + + + tls.c + Source Files/third_party/wolfssl + + + ipv4_manager.h + Header Files/framework/tcpip/stack + + + misc.h + Header Files/framework/crypto/src + + + timers.c + Source Files/FreeRTOS + + + net_pres_local.h + Header Files/framework/net/pres/priv + + + heap_2.c + Source Files/FreeRTOS/portable/MemMang + + + mpu_wrappers.h + Header Files/FreeRTOS + + + rabbit.h + Header Files/third_party/wolfssl/wolfcrypt + + + queue.c + Source Files/FreeRTOS + + + helpers.c + Source Files/framework/tcpip/common + + + zero_conf_manager.h + Header Files/framework/tcpip/stack + + + crypto.h + Header Files/framework/crypto + + + blake2-int.h + Header Files/third_party/wolfssl/wolfcrypt + + + md4.c + Source Files/third_party/wolfssl/wolfcrypt + + + queue.h + Header Files/FreeRTOS + + + settings.h + Header Files/framework/crypto/src + + + certs_test.h + Header Files/third_party/wolfssl + + + chacha20_poly1305.h + Header Files/third_party/wolfssl/wolfcrypt + + + sys_fs_media_manager.c + Source Files/framework/system/fs/src/dynamic + + + tcp.h + Header Files/framework/tcpip + + + drv_extphy_smsc8740.h + Header Files/framework/driver/ethphy + + + visibility.h + Header Files/framework/crypto/src + + + fips_test.h + Header Files/third_party/wolfssl/wolfcrypt + + + tfm.c + Source Files/framework/crypto/src + + + arp.h + Header Files/framework/tcpip + + + driver.h + Header Files/framework/driver + + + sys_int_pic32.c + Source Files/framework/system/int/src + + + md2.h + Header Files/third_party/wolfssl/wolfcrypt + + + coding.h + Header Files/framework/crypto/src + + + net_pres.h + Header Files/framework/net/pres + + + rsa.h + Header Files/framework/crypto/src + + + arc4.c + Source Files/framework/crypto/src + + + aes.h + Header Files/framework/crypto/src + + + usb_device.h + Header Files/framework/usb + + + asn_public.h + Header Files/third_party/wolfssl/wolfcrypt + + + types.h + Header Files/framework/crypto/src + + + sys_console_usb_cdc_local.h + Header Files/framework/system/console/src + + + tcpip_mac_object.h + Header Files/framework/tcpip + + + udp_manager.h + Header Files/framework/tcpip/stack + + + sys_fs.c + Source Files/framework/system/fs/src/dynamic + + + usb_cdc.h + Header Files/framework/usb + + + zero_conf_multicast_dns.h + Header Files/framework/tcpip + + + fe_low_mem.c + Source Files/third_party/wolfssl/wolfcrypt + + + mpfs.h + Header Files/framework/system/fs + + + ocsp.c + Source Files/third_party/wolfssl + + + port.c + Source Files/framework/crypto/src + + + sys_int.h + Header Files/framework/system/int + + + dns_private.h + Header Files/framework/tcpip/stack + + + drv_usb.h + Header Files/framework/driver/usb + + + http_private.h + Header Files/framework/tcpip/stack + + + blake2b.c + Source Files/third_party/wolfssl/wolfcrypt + + + error-crypt.h + Header Files/third_party/wolfssl/wolfcrypt + + + tcpip_notify.c + Source Files/framework/tcpip/stack + + + osal_freertos.c + Source Files/framework/osal/src + + + tasks.c + Source Files/FreeRTOS + + + link_list.h + Header Files/framework/tcpip/stack + + + sniffer_error.h + Header Files/third_party/wolfssl + + + camellia.h + Header Files/third_party/wolfssl/wolfcrypt + + + asn.h + Header Files/framework/crypto/src + + + hmac.c + Source Files/framework/crypto/src + + + tcp_private.h + Header Files/framework/tcpip/stack + + + des3.h + Header Files/framework/crypto/src + + + hash.h + Header Files/framework/crypto/src + + + dsa.h + Header Files/third_party/wolfssl/wolfcrypt + + + sys_common.h + Header Files/framework/system/common + + + udp.h + Header Files/framework/tcpip + + + oahash.h + Header Files/framework/tcpip/stack + + + oahash.c + Source Files/framework/tcpip/stack + + + tcpip_helpers.h + Header Files/framework/tcpip + + + misc.c + Source Files/framework/crypto/src + + + sys_devcon_cache_pic32mz.S + Source Files/framework/system/devcon/src + + + sys_devcon_cache.h + Header Files/framework/system/devcon + + + tcpip_private.h + Header Files/framework/tcpip/stack + + + ed25519.c + Source Files/third_party/wolfssl/wolfcrypt + + + pwdbased.h + Header Files/framework/crypto/src + + + md5.c + Source Files/framework/crypto/src + + + poly1305.h + Header Files/third_party/wolfssl/wolfcrypt + + + drv_nvm.h + Header Files/framework/driver/nvm + + + sys_module.h + Header Files/framework/system/common + + + sys_devcon_pic32mz.c + Source Files/framework/system/devcon/src + + + sntp_manager.h + Header Files/framework/tcpip/stack + + + tcpip.h + Header Files/framework/tcpip + + + sha.c + Source Files/framework/crypto/src + + + ge_operations.h + Header Files/third_party/wolfssl/wolfcrypt + + + coding.c + Source Files/framework/crypto/src + + + sys_fs_wrapper.c + Source Files/framework/tcpip/common + + + sys_console_local.h + Header Files/framework/system/console/src + + + md2.c + Source Files/third_party/wolfssl/wolfcrypt + + + sha.h + Header Files/framework/crypto/src + + + tcpip_helper_c32.S + Source Files/framework/tcpip/stack + + + ripemd.h + Header Files/third_party/wolfssl/wolfcrypt + + + arp.c + Source Files/framework/tcpip/stack + + + aes.c + Source Files/framework/crypto/src + + + net_pres_socketapi.h + Header Files/framework/net/pres + + + dh.c + Source Files/third_party/wolfssl/wolfcrypt + + + mpi_class.h + Header Files/third_party/wolfssl/wolfcrypt + + + mpfs.c + Source Files/framework/system/fs + + + tcpip_packet.c + Source Files/framework/tcpip/stack + + + sys_fs.h + Header Files/framework/system/fs + + + tcpip_heap_alloc.c + Source Files/framework/tcpip/stack + + + arp_manager.h + Header Files/framework/tcpip/stack + + + zero_conf_helper.c + Source Files/framework/tcpip/stack + + + zero_conf_link_local.h + Header Files/framework/tcpip + + + md4.h + Header Files/third_party/wolfssl/wolfcrypt + + + tcpip_packet.h + Header Files/framework/tcpip/stack + + + fe_operations.h + Header Files/third_party/wolfssl/wolfcrypt + + + tcpip_helpers_private.h + Header Files/framework/tcpip/stack + + + dns.c + Source Files/framework/tcpip/stack + + + _eth_dcpt_lists.h + Header Files/framework/driver/ethmac + + + ed25519.h + Header Files/third_party/wolfssl/wolfcrypt + + + nbns.c + Source Files/framework/tcpip/stack + + + sys_console.h + Header Files/framework/system/console + + + net_pres.c + Source Files/framework/net/pres + + + tcp.c + Source Files/framework/tcpip/stack + + + port.h + Header Files/framework/crypto/src + + + drv_ethphy.c + Source Files/framework/driver/ethphy + + + dhcp_manager.h + Header Files/framework/tcpip/stack + + + tcpip_helpers.c + Source Files/framework/tcpip/stack + + + hc128.c + Source Files/third_party/wolfssl/wolfcrypt + + + camellia.c + Source Files/third_party/wolfssl/wolfcrypt + + + net_pres_transportapi.h + Header Files/framework/net/pres + + + sys_devcon.c + Source Files/framework/system/devcon/src + + + error-ssl.h + Header Files/third_party/wolfssl + + + sys_reset.c + Source Files/framework/system/reset/src + + + sys_tmr.h + Header Files/framework/system/tmr + + + udp.c + Source Files/framework/tcpip/stack + + + tcpip_types.h + Header Files/framework/tcpip/stack + + + drv_extphy_regs.h + Header Files/framework/driver/ethphy + + + rsa.c + Source Files/framework/crypto/src + + + tcpip_heap_internal.c + Source Files/framework/tcpip/stack + + + ssl.c + Source Files/third_party/wolfssl + + + compress.h + Header Files/framework/crypto/src + + + ipv4.c + Source Files/framework/tcpip/stack + + + dhcp_private.h + Header Files/framework/tcpip/stack + + + projdefs.h + Header Files/FreeRTOS + + + sha256.h + Header Files/framework/crypto/src + + + event_groups.h + Header Files/FreeRTOS + + + poly1305.c + Source Files/third_party/wolfssl/wolfcrypt + + + tcpip_announce.c + Source Files/framework/tcpip/stack + + + sys_random.h + Header Files/framework/system/random + + + http.h + Header Files/framework/tcpip + + + hash_fnv.h + Header Files/framework/tcpip/stack + + + dhcp.c + Source Files/framework/tcpip/stack + + + drv_extphy_smsc8740.c + Source Files/framework/driver/ethphy + + + tcpip_heap.h + Header Files/framework/tcpip + + + drv_nvm.c + Source Files/framework/driver/nvm/src/dynamic + + + port_asm.S + Source Files/FreeRTOS/portable/MPLAB/PIC32MZ + + + usb_device_cdc_acm.c + Source Files/framework/usb/src/dynamic + + + random.c + Source Files/framework/crypto/src + + + drv_ethmac.h + Header Files/framework/driver/ethmac + + + usb_device_cdc.c + Source Files/framework/usb/src/dynamic + + + crypto.c + Source Files/framework/crypto/src + + + blake2.h + Header Files/third_party/wolfssl/wolfcrypt + + + sniffer.c + Source Files/third_party/wolfssl + + + sys_tmr.c + Source Files/framework/system/tmr/src + + + croutine.c + Source Files/FreeRTOS + + + ssl.h + Header Files/third_party/wolfssl + + + drv_usbhs.c + Source Files/framework/driver/usb/usbhs/src/dynamic + + + drv_ethmac_lib.h + Header Files/framework/driver/ethmac + + + drv_ethmac.c + Source Files/framework/driver/ethmac + + + test.h + Header Files/third_party/wolfssl + + + memory.c + Source Files/framework/crypto/src + + + asn.c + Source Files/framework/crypto/src + + + drv_ethmac_lib.c + Source Files/framework/driver/ethmac + + + des3.c + Source Files/framework/crypto/src + + + callbacks.h + Header Files/third_party/wolfssl + + + sntp.h + Header Files/framework/tcpip + + + ecc_fp.c + Source Files/third_party/wolfssl/wolfcrypt + + + ecc.h + Header Files/framework/crypto/src + + + hmac.h + Header Files/framework/crypto/src + + + dh.h + Header Files/third_party/wolfssl/wolfcrypt + + + drv_tmr.c + Source Files/framework/driver/tmr/src/dynamic + + + md5.h + Header Files/framework/crypto/src + + + lfsr.c + Source Files/framework/tcpip/common + + + helpers.h + Header Files/framework/tcpip/common + + + http.c + Source Files/framework/tcpip/stack + + + tcpip_ethernet.h + Header Files/framework/tcpip + + + net_pres_encryptionproviderapi.h + Header Files/framework/net/pres + + + mpi_superclass.h + Header Files/third_party/wolfssl/wolfcrypt + + + port.c + Source Files/FreeRTOS/portable/MPLAB/PIC32MZ + + + tcpip_announce_manager.h + Header Files/framework/tcpip/stack + + + pkcs7.h + Header Files/third_party/wolfssl/wolfcrypt + + + compress.c + Source Files/framework/crypto/src + + + crl.c + Source Files/third_party/wolfssl + + + ripemd.c + Source Files/third_party/wolfssl/wolfcrypt + + + memory.h + Header Files/framework/crypto/src + + + arc4.h + Header Files/framework/crypto/src + + + sys_console.c + Source Files/framework/system/console/src + + + drv_ethphy.h + Header Files/framework/driver/ethphy + + + hash_fnv.c + Source Files/framework/tcpip/stack + + + StackMacros.h + Header Files/FreeRTOS + + + integer.c + Source Files/framework/crypto/src + + + tfm.h + Header Files/framework/crypto/src + + + sha512.h + Header Files/framework/crypto/src + + + ge_operations.c + Source Files/third_party/wolfssl/wolfcrypt + + + sys_ports.h + Header Files/framework/system/ports + + + sniffer.h + Header Files/third_party/wolfssl + + + integer.h + Header Files/framework/crypto/src + + + croutine.h + Header Files/FreeRTOS + + + error-crypt.h + Header Files/framework/crypto/src + + + version.h + Header Files/framework/crypto/src + + + options.h + Header Files/third_party/wolfssl + + + nbns_manager.h + Header Files/framework/tcpip/stack + + + asm.c + Source Files/third_party/wolfssl/wolfcrypt + + + drv_usbhs_device.c + Source Files/framework/driver/usb/usbhs/src/dynamic + + + FreeRTOS.h + Header Files/FreeRTOS + + + drv_nvm_erasewrite.c + Source Files/framework/driver/nvm/src/dynamic + + + sys_ports.c + Source Files/framework/system/ports/src + + + rabbit.c + Source Files/third_party/wolfssl/wolfcrypt + + + curve25519.h + Header Files/third_party/wolfssl/wolfcrypt + + + fe_operations.c + Source Files/third_party/wolfssl/wolfcrypt + + + event_groups.c + Source Files/FreeRTOS + + + pwdbased.c + Source Files/framework/crypto/src + + + keys.c + Source Files/third_party/wolfssl + + + sys_debug.c + Source Files/framework/system/debug/src + + + sntp.c + Source Files/framework/tcpip/stack + + + ocsp.h + Header Files/third_party/wolfssl + + + zero_conf_link_local.c + Source Files/framework/tcpip/stack + + + lfsr.h + Header Files/framework/tcpip/common + + + hc128.h + Header Files/third_party/wolfssl/wolfcrypt + + + sha256.c + Source Files/framework/crypto/src + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/drv_adc_static.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/drv_adc_static.h new file mode 100644 index 0000000..84040db --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/drv_adc_static.h @@ -0,0 +1,105 @@ +/******************************************************************************* + ADC Driver Interface Declarations for Static Single Instance Driver + + Company: + Microchip Technology Inc. + + File Name: + drv_adc_static.h + + Summary: + ADC driver interface declarations for the static single instance driver. + + Description: + The ADC device driver provides a simple interface to manage the ADC + modules on Microchip microcontrollers. This file defines the interface + Declarations for the ADC driver. + + Remarks: + Static interfaces incorporate the driver instance number within the names + of the routines, eliminating the need for an object ID or object handle. + + Static single-open interfaces also eliminate the need for the open handle. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +//DOM-IGNORE-END + +#ifndef _DRV_ADC_STATIC_H +#define _DRV_ADC_STATIC_H + +#include +#include "system_config.h" +#include "peripheral/adchs/plib_adchs.h" + +typedef enum { + + DRV_ADC_ID_1 = ADCHS_ID_0, + DRV_ADCHS_NUMBER_OF_MODULES + +} DRV_ADC_MODULE_ID; + +// ***************************************************************************** +// ***************************************************************************** +// Section: Interface Headers for ADC Static Driver +// ***************************************************************************** +// ***************************************************************************** +void DRV_ADC_Initialize(void); + +inline void DRV_ADC_DeInitialize(void); + +inline void DRV_ADC0_Open(void); + +inline void DRV_ADC0_Close(void); + +inline void DRV_ADC_Start(void); + +inline void DRV_ADC_Stop(void); + + +uint32_t DRV_ADC_SamplesRead(uint8_t bufIndex); + +bool DRV_ADC_SamplesAvailable(uint8_t bufIndex); + + + + + +inline void DRV_ADC_DigitalFilter0_Open(void); + +inline void DRV_ADC_DigitalFilter0_Close(void); + +inline bool DRV_ADC_DigitalFilter0_DataIsReady(void); + +inline int16_t DRV_ADC_DigitalFilter0_DataRead(void); + + + + +#endif // #ifndef _DRV_ADC_STATIC_H + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/src/drv_adc_static.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/src/drv_adc_static.c new file mode 100644 index 0000000..2e07f73 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/adc/src/drv_adc_static.c @@ -0,0 +1,268 @@ +/******************************************************************************* + ADC Driver Initialization File + + File Name: + drv_adc_static_hs.c + + Summary: + This file contains source code necessary to initialize the IC driver. + + Description: + This file contains source code necessary to initialize the system. It + implements the "DRV_ADC_Initialize" function, configuration bits, and allocates + any necessary global system resources, such as the systemObjects structure + that contains the object handles to all the MPLAB Harmony module objects in + the system. + *******************************************************************************/ + +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ + +// ***************************************************************************** +// ***************************************************************************** +// Section: Include Files +// ***************************************************************************** +// ***************************************************************************** +#include "framework/driver/adc/drv_adc_static.h" + +// ***************************************************************************** +// ***************************************************************************** +// Section: ADC Static Driver Functions +// ***************************************************************************** +// ***************************************************************************** +void DRV_ADC_Initialize(void) +{ + /* Select Power Mode */ + PLIB_ADCHS_Setup( + DRV_ADC_ID_1, + ADCHS_VREF_AVDD_AVSS, + ADCHS_CHARGEPUMP_DISABLE, + ADCHS_OUTPUT_DATA_FORMAT_INTEGER, + false, + ADCHS_FAST_SYNC_SYSTEM_CLOCK_DISABLE, + ADCHS_FAST_SYNC_PERIPHERAL_CLOCK_DISABLE, + 0, + 0, + ADCHS_CLOCK_SOURCE_PBCLK, + 16, + ADCHS_WARMUP_CLOCK_32768 + ); + + PLIB_ADCHS_ChannelSetup( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3, + ADCHS_DATA_RESOLUTION_12BIT, + 4, + 32, + 0 + ); + + if(false == PLIB_ADCHS_ChannelTriggerSampleSelect( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3, + ADCHS_CHANNEL_UNSYNC_TRIGGER_UNSYNC_SAMPLING + )) + { while(1);} +/* Since configuration of analog inputs (dedicated and alternate) for dedicated ADC channel */ +/* is done via selection of dedicated channel only, here, the analog input for a dedicated */ +/* ADC channel number is fixed */ + + if(false == PLIB_ADCHS_ChannelInputSelect( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3, + (ADCHS_CHANNEL_INP_SEL)ADCHS_DEFAULT_CLASS1_AN3 + )) + { while(1);} + + + PLIB_ADCHS_AnalogInputModeSelect( + DRV_ADC_ID_1, + ADCHS_AN3, + ADCHS_INPUT_MODE_SINGLE_ENDED_UNIPOLAR + ); + + PLIB_ADCHS_AnalogInputEdgeTriggerSet( DRV_ADC_ID_1, ADCHS_CLASS12_AN3 ); + + PLIB_ADCHS_AnalogInputTriggerSourceSelect( + DRV_ADC_ID_1, + ADCHS_CLASS12_AN3, + ADCHS_TRIGGER_SOURCE_GLOBAL_SOFTWARE_EDGE + ); + + + + + + + + + /* Digital filter initialization */ + PLIB_ADCHS_DigitalFilterOversamplingModeSetup + ( + DRV_ADC_ID_1, + ADCHS_DIGITAL_FILTER_1, + ADCHS_AN3, + ADCHS_DIGITAL_FILTER_SIGNIFICANT_ALL_16BITS, + ADCHS_DIGITAL_FILTER_OVERSAMPLE_RATIO_256X, + false + ); + + + + + /* Enable ADC */ + PLIB_ADCHS_Enable(DRV_ADC_ID_1); + + /* Check Vref to be ready */ + while(!PLIB_ADCHS_VREFIsReady(DRV_ADC_ID_1)); + + /* Check for Vref Fault */ + while(PLIB_ADCHS_VREFFaultHasOccurred(DRV_ADC_ID_1)); + + + + + /* Enable analog feature for the specified channel */ + PLIB_ADCHS_ChannelAnalogFeatureEnable + ( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3 + ); + + /* Wait for the modules to be ready */ + while(!PLIB_ADCHS_ChannelIsReady + ( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3 + ) + ); + +} + + +inline void DRV_ADC_DeInitialize(void) +{ + /* Enable ADC */ + PLIB_ADCHS_Disable(DRV_ADC_ID_1); +} + + +inline void DRV_ADC0_Open(void) +{ + /* Enable digital feature for the specified channel */ + PLIB_ADCHS_ChannelDigitalFeatureEnable + ( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3 + ); +} + +inline void DRV_ADC0_Close(void) +{ + /* Disable digital feature for the specified channel */ + PLIB_ADCHS_ChannelDigitalFeatureDisable + ( + DRV_ADC_ID_1, + ADCHS_CHANNEL_3 + ); +} + + +inline void DRV_ADC_Start(void) +{ + /* Start ADC */ + //PLIB_ADCHS_SoftwareSamplingStart(DRV_ADC_ID_1); + PLIB_ADCHS_GlobalSoftwareTriggerEnable(DRV_ADC_ID_1); +} + +inline void DRV_ADC_Stop(void) +{ + /* Stop ADC */ + PLIB_ADCHS_SoftwareSamplingStop(DRV_ADC_ID_1); +} + +uint32_t DRV_ADC_SamplesRead(uint8_t bufIndex) +{ + /* Read Result */ + return PLIB_ADCHS_AnalogInputResultGet + ( + DRV_ADC_ID_1, + (ADCHS_AN0 + bufIndex) + ); +} + +bool DRV_ADC_SamplesAvailable(uint8_t bufIndex) +{ + /* Check if data is available or not */ + return PLIB_ADCHS_AnalogInputDataIsReady + ( + DRV_ADC_ID_1, + (ADCHS_AN0 + bufIndex) + ); +} + + + + +inline void DRV_ADC_DigitalFilter0_Open(void) +{ + /* Enable digital comparator */ + PLIB_ADCHS_DigitalFilterEnable + ( + DRV_ADC_ID_1, + ADCHS_DIGITAL_FILTER_1 + ); +} + +inline void DRV_ADC_DigitalFilter0_Close(void) +{ + /* Disable digital comparator */ + PLIB_ADCHS_DigitalFilterDisable + ( + DRV_ADC_ID_1, + ADCHS_DIGITAL_FILTER_1 + ); +} + +inline bool DRV_ADC_DigitalFilter0_DataIsReady(void) +{ + + return(PLIB_ADCHS_DigitalFilterDataIsReady + ( + DRV_ADC_ID_1, + ADCHS_DIGITAL_FILTER_1 + )); +} + +inline int16_t DRV_ADC_DigitalFilter0_DataRead(void) +{ + + return(PLIB_ADCHS_DigitalFilterDataGet + ( + DRV_ADC_ID_1, + ADCHS_DIGITAL_FILTER_1 + )); +} + + + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/drv_cmp_static.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/drv_cmp_static.h new file mode 100644 index 0000000..ec74d98 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/drv_cmp_static.h @@ -0,0 +1,65 @@ +/******************************************************************************* + CMP Driver Interface Declarations for Static Single Instance Driver + + Company: + Microchip Technology Inc. + + File Name: + drv_cmp_static.h + + Summary: + CMP driver interface declarations for the static single instance driver. + + Description: + The CMP device driver provides a simple interface to manage the CMP + modules on Microchip microcontrollers. This file defines the interface + Declarations for the IC driver. + + Remarks: + Static interfaces incorporate the driver instance number within the names + of the routines, eliminating the need for an object ID or object handle. + + Static single-open interfaces also eliminate the need for the open handle. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +//DOM-IGNORE-END + +#ifndef _DRV_CMP_STATIC_H +#define _DRV_CMP_STATIC_H + +// ***************************************************************************** +// ***************************************************************************** +// Section: Interface Headers for the static driver +// ***************************************************************************** +// ***************************************************************************** + +void DRV_CMP_Initialize(void); + +#endif // #ifndef _DRV_CMP_STATIC_H + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/src/drv_cmp_static.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/src/drv_cmp_static.c new file mode 100644 index 0000000..d7f07c5 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/driver/cmp/src/drv_cmp_static.c @@ -0,0 +1,111 @@ +/******************************************************************************* + CMP Driver Functions for Static Single Instance Driver + + Company: + Microchip Technology Inc. + + File Name: + drv_cmp_static.c + + Summary: + CMP driver implementation for the static single instance driver. + + Description: + The CMP device driver provides a simple interface to manage the CMP + modules on Microchip microcontrollers. + + Remarks: + Static interfaces incorporate the driver instance number within the names + of the routines, eliminating the need for an object ID or object handle. + Static single-open interfaces also eliminate the need for the open handle. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +//DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Header Includes +// ***************************************************************************** +// ***************************************************************************** +#include "peripheral/cmp/plib_cmp.h" +#include "peripheral/int/plib_int.h" + +// ***************************************************************************** +// ***************************************************************************** +// Section: CMP static driver functions +// ***************************************************************************** +// ***************************************************************************** +void DRV_CMP_Initialize(void) +{ + + /* Configure CVREF for comparator use. */ + PLIB_CMP_CVREF_SourceVoltageSelect(CMP_ID_1, CMP_CVREF_VOLTAGE_SOURCE_VDD); + #if defined(PLIB_CMP_ExistsCVREFRefVoltageRangeSelect ) + if ( PLIB_CMP_ExistsCVREFRefVoltageRangeSelect ( CMP_ID_1 ) ) + { + PLIB_CMP_CVREF_ReferenceVoltageSelect ( CMP_ID_1, CMP_CVREF_RESISTOR_LADDER_VOLTAGE ); + } + else + { + /* If Voltage reference selection for CVref feature doesn't exist + on CVREF module instance, + then by default Resister Latter Network is selected as reference, so do nothing */ + } + #endif + PLIB_CMP_CVREF_ValueSelect(CMP_ID_1, CMP_CVREF_VALUE_11); + #if defined(PLIB_CMP_ExistsCVREFBGRefVoltageRangeSelect ) + if ( PLIB_CMP_ExistsCVREFBGRefVoltageRangeSelect ( CMP_ID_1 ) ) + { + PLIB_CMP_CVREF_BandGapReferenceSourceSelect ( CMP_ID_1, CMP_CVREF_BANDGAP_1_2V ); + } + else + { + /* If Voltage reference selection for IVref feature doesn't exist + on CVREF module instance, + then by default internal 1.2V is selected as reference, so do nothing */ + } + #endif + PLIB_CMP_CVREF_Enable(CMP_ID_1); + + PLIB_CMP_NonInvertingInputChannelSelect(CMP_ID_2, CMP_NON_INVERTING_INPUT_CVREF); + PLIB_CMP_InvertingInputChannelSelect(CMP_ID_2, CMP_INVERTING_INPUT_EXTERNAL_PIN_B); + PLIB_CMP_OutputEnable(CMP_ID_2); + + PLIB_CMP_OutputInvertDisable(CMP_ID_2); + + /* Setup Interrupt */ + PLIB_CMP_InterruptEventSelect(CMP_ID_2, CMP_INTERRUPT_GENERATION_LOW_TO_HIGH); + PLIB_INT_SourceEnable(INT_ID_0, INT_SOURCE_COMPARATOR_2); + PLIB_INT_VectorPrioritySet(INT_ID_0, INT_VECTOR_CMP2, INT_PRIORITY_LEVEL1); + PLIB_INT_VectorSubPrioritySet(INT_ID_0, INT_VECTOR_CMP2, INT_SUBPRIORITY_LEVEL0); + + PLIB_CMP_Enable(CMP_ID_2); + +} + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_cert_store.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_cert_store.c new file mode 100644 index 0000000..88d1b31 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_cert_store.c @@ -0,0 +1,45 @@ +/******************************************************************************* + Source file for the Net Pres Certificate Store functions to work with Harmony + + + Summary: + + + Description: + +*******************************************************************************/ + +/******************************************************************************* +File Name: net_pres_cert_stroe.c +Copyright (c) 2015 released Microchip Technology Inc. All rights +reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED ?AS IS? WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +#include "net/pres/net_pres_certstore.h" +#define USE_CERT_BUFFERS_2048 +#include "ca-certs.h" + +bool NET_PRES_CertStoreGetCACerts(const uint8_t ** certPtr, int32_t * certSize, uint8_t certIndex) +{ + *certPtr = caCert; + *certSize = sizeof_caCert; + return true; +} diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.c new file mode 100644 index 0000000..deb8ba6 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.c @@ -0,0 +1,299 @@ +/******************************************************************************* + Source file for the Net Pres Encryption glue functions to work with Harmony + + + Summary: + + + Description: + +*******************************************************************************/ + +/******************************************************************************* +File Name: net_pres_enc_glue.c +Copyright (c) 2013 released Microchip Technology Inc. All rights +reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED ?AS IS? WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ + +#include "net_pres_enc_glue.h" +#include "net/pres/net_pres_transportapi.h" +#include "net/pres/net_pres_certstore.h" + +#include "config.h" +#include "wolfssl/ssl.h" +#include "wolfssl/wolfcrypt/logging.h" +#include "wolfssl/wolfcrypt/random.h" + +#include "app.h" + +extern APP_DATA appData; + +static uint8_t _net_pres_wolfsslUsers = 0; +typedef struct +{ + WOLFSSL_CTX* context; + NET_PRES_TransportObject * transObject; + bool isInited; +}net_pres_wolfsslInfo; + +// Temporary fix till crypto library is upgraded to recent wolfssl versions. +int InitRng(RNG* rng) +{ + return wc_InitRng(rng); +} + + +NET_PRES_EncProviderObject net_pres_EncProviderStreamClient0 = +{ + .fpInit = NET_PRES_EncProviderStreamClientInit0, + .fpDeinit = NET_PRES_EncProviderStreamClientDeinit0, + .fpOpen = NET_PRES_EncProviderStreamClientOpen0, + .fpConnect = NET_PRES_EncProviderClientConnect0, + .fpClose = NET_PRES_EncProviderConnectionClose0, + .fpWrite = NET_PRES_EncProviderWrite0, + .fpWriteReady = NET_PRES_EncProviderWriteReady0, + .fpRead = NET_PRES_EncProviderRead0, + .fpReadReady = NET_PRES_EncProviderReadReady0, + .fpPeek = NET_PRES_EncProviderPeek0, + .fpIsInited = NET_PRES_EncProviderStreamClientIsInited0, +}; +net_pres_wolfsslInfo net_pres_wolfSSLInfoStreamClient0; +int NET_PRES_EncGlue_StreamClientReceiveCb0(void *sslin, char *buf, int sz, void *ctx) +{ + int fd = *(int *)ctx; + uint16_t bufferSize; + bufferSize = (*net_pres_wolfSSLInfoStreamClient0.transObject->fpReadyToRead)((uintptr_t)fd); + if (bufferSize == 0) + { + return WOLFSSL_CBIO_ERR_WANT_READ; + } + bufferSize = (*net_pres_wolfSSLInfoStreamClient0.transObject->fpRead)((uintptr_t)fd, (uint8_t*)buf, sz); + return bufferSize; +} +int NET_PRES_EncGlue_StreamClientSendCb0(void *sslin, char *buf, int sz, void *ctx) +{ + int fd = *(int *)ctx; + uint16_t bufferSize; + bufferSize = (*net_pres_wolfSSLInfoStreamClient0.transObject->fpReadyToWrite)((uintptr_t)fd); + if (bufferSize == 0) + { + return WOLFSSL_CBIO_ERR_WANT_WRITE; + } + + bufferSize = (*net_pres_wolfSSLInfoStreamClient0.transObject->fpWrite)((uintptr_t)fd, (uint8_t*)buf, (uint16_t)sz); + return bufferSize; +} +bool NET_PRES_EncProviderStreamClientInit0(NET_PRES_TransportObject * transObject) +{ + const uint8_t * caCertsPtr; + int32_t caCertsLen; + if (!NET_PRES_CertStoreGetCACerts(&caCertsPtr, &caCertsLen, 0)) + { + return false; + } + if (_net_pres_wolfsslUsers == 0) + { + wolfSSL_Init(); + _net_pres_wolfsslUsers++; + } + net_pres_wolfSSLInfoStreamClient0.transObject = transObject; + net_pres_wolfSSLInfoStreamClient0.context = wolfSSL_CTX_new(wolfSSLv23_client_method()); + if (net_pres_wolfSSLInfoStreamClient0.context == 0) + { + return false; + } + wolfSSL_SetIORecv(net_pres_wolfSSLInfoStreamClient0.context, (CallbackIORecv)&NET_PRES_EncGlue_StreamClientReceiveCb0); + wolfSSL_SetIOSend(net_pres_wolfSSLInfoStreamClient0.context, (CallbackIOSend)&NET_PRES_EncGlue_StreamClientSendCb0); + + // Turn off verification, because SNTP is usually blocked by a firewall + wolfSSL_CTX_set_verify(net_pres_wolfSSLInfoStreamClient0.context, SSL_VERIFY_NONE, 0); + + if (wolfSSL_CTX_load_verify_buffer(net_pres_wolfSSLInfoStreamClient0.context, caCertsPtr, caCertsLen, SSL_FILETYPE_ASN1) != SSL_SUCCESS) + { + // Couldn't load the certificates + SYS_CONSOLE_MESSAGE("Something went wrong loading the certificates\r\n"); + wolfSSL_CTX_free(net_pres_wolfSSLInfoStreamClient0.context); + return false; + } + + if(wolfSSL_CTX_use_PrivateKey_buffer(net_pres_wolfSSLInfoStreamClient0.context, appData.clientKey, strlen((char *)appData.clientKey), SSL_FILETYPE_PEM) != SSL_SUCCESS) + { + // Couldn't load the private key + SYS_CONSOLE_MESSAGE("Something went wrong loading the private key\r\n"); + wolfSSL_CTX_free(net_pres_wolfSSLInfoStreamClient0.context); + return false; + } + + // Loading the client cert so that the server can authenticate us (client authentication)) + if(wolfSSL_CTX_use_certificate_buffer(net_pres_wolfSSLInfoStreamClient0.context, appData.clientCert, strlen((char *)appData.clientCert), SSL_FILETYPE_PEM) != SSL_SUCCESS) + { + // Couldn't load the client certificate + SYS_CONSOLE_MESSAGE("Something went wrong loading the client certificate\r\n"); + wolfSSL_CTX_free(net_pres_wolfSSLInfoStreamClient0.context); + return false; + } + + // Turn off verification, because SNTP is usually blocked by a firewall + wolfSSL_CTX_set_verify(net_pres_wolfSSLInfoStreamClient0.context, SSL_VERIFY_NONE, 0); + net_pres_wolfSSLInfoStreamClient0.isInited = true; + return true; +} +bool NET_PRES_EncProviderStreamClientDeinit0() +{ + wolfSSL_CTX_free(net_pres_wolfSSLInfoStreamClient0.context); + net_pres_wolfSSLInfoStreamClient0.isInited = false; + _net_pres_wolfsslUsers--; + if (_net_pres_wolfsslUsers == 0) + { + wolfSSL_Cleanup(); + } + return true; +} +bool NET_PRES_EncProviderStreamClientOpen0(uintptr_t transHandle, void * providerData) +{ + WOLFSSL* ssl = wolfSSL_new(net_pres_wolfSSLInfoStreamClient0.context); + if (ssl == NULL) + { + return false; + } + if (wolfSSL_set_fd(ssl, transHandle) != SSL_SUCCESS) + { + wolfSSL_free(ssl); + return false; + } + memcpy(providerData, &ssl, sizeof(WOLFSSL*)); + return true; +} +bool NET_PRES_EncProviderStreamClientIsInited0() +{ + return net_pres_wolfSSLInfoStreamClient0.isInited; +} +NET_PRES_EncSessionStatus NET_PRES_EncProviderClientConnect0(void * providerData) +{ + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + int result = wolfSSL_connect(ssl); + switch (result) + { + case SSL_SUCCESS: + return NET_PRES_ENC_SS_OPEN; + default: + { + int error = wolfSSL_get_error(ssl, result); + switch (error) + { + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + return NET_PRES_ENC_SS_CLIENT_NEGOTIATING; + default: + return NET_PRES_ENC_SS_FAILED; + } + } + } +} +NET_PRES_EncSessionStatus NET_PRES_EncProviderConnectionClose0(void * providerData) +{ + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + wolfSSL_free(ssl); + return NET_PRES_ENC_SS_CLOSED; +} +int32_t NET_PRES_EncProviderWrite0(void * providerData, const uint8_t * buffer, uint16_t size) +{ + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + int ret = wolfSSL_write(ssl, buffer, size); + if (ret < 0) + { + return ret; // DGC_modified + } + return ret; +} +uint16_t NET_PRES_EncProviderWriteReady0(void * providerData, uint16_t reqSize, uint16_t minSize) +{ + extern int CheckAvailableSize(WOLFSSL *ssl, int size); + char buffer; + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + + int ret = wolfSSL_write(ssl, &buffer, 0); + if(ret < 0) + { + return ret; // DGC_modified + } + + ret = CheckAvailableSize(ssl, reqSize); + if(ret == 0) + { // success + return reqSize; + } + if(minSize != 0) + { + ret = CheckAvailableSize(ssl, minSize); + if(ret == 0) + { // success + return minSize; + } + } + + return 0; +} +int32_t NET_PRES_EncProviderRead0(void * providerData, uint8_t * buffer, uint16_t size) +{ + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + int ret = wolfSSL_read(ssl, buffer, size); + if (ret < 0) + { + return 0; + } + return ret; +} + +int32_t NET_PRES_EncProviderReadReady0(void * providerData) +{ + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + int32_t ret = wolfSSL_pending(ssl); + if (ret == 0) // wolfSSL_pending() doesn't check the underlying layer. + { + char buffer; + if (wolfSSL_peek(ssl, &buffer, 1) == 0) + { + return 0; + } + ret = wolfSSL_pending(ssl); + } + return ret; +} + +int32_t NET_PRES_EncProviderPeek0(void * providerData, uint8_t * buffer, uint16_t size) +{ + WOLFSSL* ssl; + memcpy(&ssl, providerData, sizeof(WOLFSSL*)); + int ret = wolfSSL_peek(ssl, buffer, size); + if (ret < 0) + { + return 0; + } + return ret; +} diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.h new file mode 100644 index 0000000..deded9c --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/net/pres/net_pres_enc_glue.h @@ -0,0 +1,61 @@ +/******************************************************************************* + Header file for the wolfSSL glue functions to work with Harmony + + + Summary: + + + Description: + +*******************************************************************************/ + +/******************************************************************************* +File Name: net_tls_wolfssl_glue.h +Copyright (c) 2013 released Microchip Technology Inc. All rights +reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED ?AS IS? WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ + +#ifndef _NET_TLS_WOLFSSL_GLUE_H_ +#define _NET_TLS_WOLFSSL_GLUE_H_ + +#include "system_config.h" +#include "net/pres/net_pres.h" +#include "net/pres/net_pres_encryptionproviderapi.h" +#ifdef __CPLUSPLUS +extern "c" { +#endif +extern NET_PRES_EncProviderObject net_pres_EncProviderStreamClient0; +bool NET_PRES_EncProviderStreamClientInit0(struct _NET_PRES_TransportObject * transObject); +bool NET_PRES_EncProviderStreamClientDeinit0(); +bool NET_PRES_EncProviderStreamClientOpen0(uintptr_t transHandle, void * providerData); +bool NET_PRES_EncProviderStreamClientIsInited0(); +NET_PRES_EncSessionStatus NET_PRES_EncProviderClientConnect0(void * providerData); +NET_PRES_EncSessionStatus NET_PRES_EncProviderConnectionClose0(void * providerData); +int32_t NET_PRES_EncProviderWrite0(void * providerData, const uint8_t * buffer, uint16_t size); +uint16_t NET_PRES_EncProviderWriteReady0(void * providerData, uint16_t reqSize, uint16_t minSize); +int32_t NET_PRES_EncProviderRead0(void * providerData, uint8_t * buffer, uint16_t size); +int32_t NET_PRES_EncProviderReadReady0(void * providerData); +int32_t NET_PRES_EncProviderPeek0(void * providerData, uint8_t * buffer, uint16_t size); +#ifdef __CPLUSPLUS +} +#endif +#endif //_NET_TLS_WOLFSSL_GLUE_H_ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/src/sys_clk_static.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/src/sys_clk_static.c new file mode 100644 index 0000000..f7f0835 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/src/sys_clk_static.c @@ -0,0 +1,371 @@ +/******************************************************************************* + SYS CLK Static Functions for Clock System Service + + Company: + Microchip Technology Inc. + + File Name: + sys_clk_static.c + + Summary: + SYS CLK static function implementations for the Clock System Service. + + Description: + The Clock System Service provides a simple interface to manage the oscillators + on Microchip microcontrollers. This file defines the static implementation for the + Clock System Service. + + Remarks: + Static functions incorporate all system clock configuration settings as + determined by the user via the Microchip Harmony Configurator GUI. It provides + static version of the routines, eliminating the need for an object ID or + object handle. + + Static single-open interfaces also eliminate the need for the open handle. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +//DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: Include Files +// ***************************************************************************** +// ***************************************************************************** + +#include "system_config.h" +#include "system_definitions.h" +#include "peripheral/osc/plib_osc.h" +#include "system/devcon/sys_devcon.h" + +// ***************************************************************************** +// ***************************************************************************** +// Section: File Scope Functions +// ***************************************************************************** +// ***************************************************************************** + +// ***************************************************************************** +/* Function: + void SYS_CLK_Static_Initialize ( const SYS_CLK_INIT const * clkInit ) + + Summary: + Initializes hardware and internal data structure of the System Clock. + + Description: + This function initializes the hardware and internal data structure of System + Clock Service. + + Remarks: + This is configuration values for the static version of the Clock System Service + module is determined by the user via the Microchip Harmony Configurator GUI. + This template will build a sys_clk_static.h and sys_clk_static.c file with + the configuration per the user's choice. + + The objective is to eliminate the user's need to be knowledgeable in the function of + the 'configuration bits' to configure the system oscillators. +*/ + +void SYS_CLK_Initialize( const SYS_CLK_INIT const * clkInit ) +{ + SYS_DEVCON_SystemUnlock ( ); + + PLIB_OSC_FRCDivisorSelect( OSC_ID_0, OSC_FRC_DIV_1); + + /* Enable Peripheral Bus 1 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 0, 2 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 0 ); + /* Enable Peripheral Bus 2 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 1, 2 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 1 ); + /* Enable Peripheral Bus 3 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 2, 2 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 2 ); + /* Enable Peripheral Bus 4 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 3, 2 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 3 ); + /* Enable Peripheral Bus 5 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 4, 2 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 4 ); + /* Enable Peripheral Bus 7 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 6, 1 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 6 ); + /* Enable Peripheral Bus 8 */ + PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 7, 1 ); + PLIB_OSC_PBOutputClockEnable (OSC_ID_0, 7 ); + /* Disable REFCLKO1*/ + PLIB_OSC_ReferenceOscDisable ( OSC_ID_0, OSC_REFERENCE_1 ); + /* Disable REFCLK1_OE*/ + PLIB_OSC_ReferenceOutputDisable ( OSC_ID_0, OSC_REFERENCE_1 ); + /* Disable REFCLKO2*/ + PLIB_OSC_ReferenceOscDisable ( OSC_ID_0, OSC_REFERENCE_2 ); + /* Disable REFCLK2_OE*/ + PLIB_OSC_ReferenceOutputDisable ( OSC_ID_0, OSC_REFERENCE_2 ); + /* Disable REFCLKO3*/ + PLIB_OSC_ReferenceOscDisable ( OSC_ID_0, OSC_REFERENCE_3 ); + /* Disable REFCLK3_OE*/ + PLIB_OSC_ReferenceOutputDisable ( OSC_ID_0, OSC_REFERENCE_3 ); + /* Disable REFCLKO4*/ + PLIB_OSC_ReferenceOscDisable ( OSC_ID_0, OSC_REFERENCE_4 ); + /* Disable REFCLK4_OE*/ + PLIB_OSC_ReferenceOutputDisable ( OSC_ID_0, OSC_REFERENCE_4 ); + + SYS_DEVCON_SystemLock ( ); +} + +//****************************************************************************** +/* Function: + inline uint32_t SYS_CLK_SystemFrequencyGet ( void ) + + Summary: + Gets the system clock frequency in Hertz. + + Description: + This function gets the System clock frequency in Hertz. + + Precondition: + None. + + Parameters: + None. + + Returns: + System clock frequency in Hertz. + + Example: + + uint32_t sysClockHz; + + sysClockHz = SYS_CLK_SystemFrequencyGet ( ); + + + Remarks: + */ + +inline uint32_t SYS_CLK_SystemFrequencyGet ( void ) +{ + return SYS_CLK_FREQ; +} + +//****************************************************************************** +/* Function: + inline uint32_t SYS_CLK_PeripheralFrequencyGet ( CLK_BUSES_PERIPHERAL peripheralBus ) + + Summary: + Gets the selected clock peripheral bus frequency in Hertz. + + Description: + This function gets the selected peripheral bus clock frequency in Hertz. + + Precondition: + None. + + Parameters: + peripheralBus - Reference clock bus selection. One of the possible value from + CLK_BUSES_PERIPHERAL enum. For devices that do not have multiple + clock channels for Reference clock, CLK_BUS_PERIPHERAL_1 should be + the selection. + + Returns: + Clock frequency in Hertz. + + Example: + + unsigned long peripheralClockHz; + + peripheralClockHz = SYS_CLK_PeripheralFrequencyGet ( CLK_BUS_PERIPHERAL_5 ); + + + Remarks: + Most of the devices doesn't have multiple Peripheral clock buses. In that case, + pass CLK_USB_PERIPHERAL_1 as the bus number. + */ + +inline uint32_t SYS_CLK_PeripheralFrequencyGet ( CLK_BUSES_PERIPHERAL peripheralBus ) +{ + uint32_t freq = 0; + + switch (peripheralBus) + { + case CLK_BUS_PERIPHERAL_1: + freq = SYS_CLK_BUS_PERIPHERAL_1; + break; + case CLK_BUS_PERIPHERAL_2: + freq = SYS_CLK_BUS_PERIPHERAL_2; + break; + case CLK_BUS_PERIPHERAL_3: + freq = SYS_CLK_BUS_PERIPHERAL_3; + break; + case CLK_BUS_PERIPHERAL_4: + freq = SYS_CLK_BUS_PERIPHERAL_4; + break; + case CLK_BUS_PERIPHERAL_5: + freq = SYS_CLK_BUS_PERIPHERAL_5; + break; + case CLK_BUS_PERIPHERAL_6: + break; + case CLK_BUS_PERIPHERAL_7: + freq = SYS_CLK_BUS_PERIPHERAL_7; + break; + case CLK_BUS_PERIPHERAL_8: + freq = SYS_CLK_BUS_PERIPHERAL_8; + break; + default: + break; + } + + return freq; +} + + +//****************************************************************************** +/* Function: + inline uint32_t SYS_CLK_ReferenceClockFrequencyGet ( CLK_BUSES_REFERENCE referenceBus ) + + Summary: + Gets the selected Reference clock bus frequency in Hertz. + + Description: + This function gets frequency of the selected Reference clock bus in Hertz. + + Precondition: + None. + + Parameters: + peripheralBus - Reference clock bus selection. One of the possible value from + CLK_BUSES_REFERENCE enum. For devices that do not have multiple + clock channels for Reference clock, CLK_BUS_REFERENCE_1 should be + the selection. + + Returns: + Clock frequency in Hz. + + Example: + + unsigned long sysClockOutputHz; + + sysClockOutputHz = SYS_CLK_ReferenceClockFrequencyGet ( CLK_BUS_REFERENCE_3 ); + + + Remarks: + */ + +inline uint32_t SYS_CLK_ReferenceClockFrequencyGet ( CLK_BUSES_REFERENCE referenceBus ) +{ + uint32_t freq = 0; + + switch (referenceBus) + { + case CLK_BUS_REFERENCE_1: + break; + case CLK_BUS_REFERENCE_2: + break; + case CLK_BUS_REFERENCE_3: + break; + case CLK_BUS_REFERENCE_4: + break; + case CLK_BUS_REFERENCE_5: + break; + default: + break; + } + + return freq; +} + +/****************************************************************************** + Function: + void SYS_CLK_SecondaryOscillatorEnable ( void ) + + Summary: + Enables the secondary oscillator. + + Description: + This function enables the secondary oscillator. + + Remarks: + For more details refer sys_clk.h. +*/ + +void SYS_CLK_SecondaryOscillatorEnable ( void ) +{ + /* Check for secondary oscillator status */ + if (!PLIB_OSC_SecondaryIsEnabled(OSC_ID_0)) + { + /* Unlock and enable secondary oscillator */ + SYS_DEVCON_SystemUnlock(); + + PLIB_OSC_SecondaryEnable(OSC_ID_0); + + SYS_DEVCON_SystemLock(); + } +} + +/****************************************************************************** + Function: + void SYS_CLK_SecondaryOscillatorDisable ( void ) + + Summary: + Disables the secondary oscillator. + + Description: + This function disables the secondary oscillator. + + Remarks: + For more details refer sys_clk.h. +*/ + +void SYS_CLK_SecondaryOscillatorDisable ( void ) +{ + /* Check for secondary oscillator status */ + if (PLIB_OSC_SecondaryIsEnabled(OSC_ID_0)) + { + /* Unlock and disable secondary oscillator*/ + SYS_DEVCON_SystemUnlock(); + + PLIB_OSC_SecondaryDisable(OSC_ID_0); + + SYS_DEVCON_SystemLock(); + } +} + +/****************************************************************************** + Function: + bool SYS_CLK_SecondaryOscillatorIsEnabled ( void ) + + Summary: + Identifies whether secondary oscillator is enabled or disabled. + + Description: + This function identifies whether the secondary oscillator is enabled or + disabled. + + Remarks: + For more details refer sys_clk.h. +*/ + +bool SYS_CLK_SecondaryOscillatorIsEnabled ( void ) +{ + return (PLIB_OSC_SecondaryIsEnabled(OSC_ID_0)); +} \ No newline at end of file diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/sys_clk_static.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/sys_clk_static.h new file mode 100644 index 0000000..34500a7 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/clk/sys_clk_static.h @@ -0,0 +1,81 @@ +/******************************************************************************* + SYS CLK Static Interface Declarations for Clock System Service + + Company: + Microchip Technology Inc. + + File Name: + sys_clk_static.h + + Summary: + SYS CLK interface declarations for the static system service. + + Description: + The Clock System Service provides a simple interface to manage the oscillators + on Microchip microcontrollers. This file defines the interface + Declarations for the SYS CLK system service. + + Remarks: + Static interfaces incorporate all system clock configuration settings as + determined by the user via the Microchip Harmony Configurator GUI. It provides + static version of the routines, eliminating the need for an object ID or + object handle. + + Static single-open interfaces also eliminate the need for the open handle. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +//DOM-IGNORE-END + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + + extern "C" { + +#endif +// DOM-IGNORE-END + + +#ifndef _SYS_CLK_STATIC_H +#define _SYS_CLK_STATIC_H + +// ***************************************************************************** +// ***************************************************************************** +// Section: SYS CLK Module Initialization Routine (Static Version) +// ***************************************************************************** +// ***************************************************************************** + +#endif // #ifndef _SYS_CLK_STATIC_H + +//DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +//DOM-IGNORE-END + + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/ports/src/sys_ports_static.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/ports/src/sys_ports_static.c new file mode 100644 index 0000000..8395480 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/framework/system/ports/src/sys_ports_static.c @@ -0,0 +1,111 @@ +/******************************************************************************* + SYS PORTS Static Functions for PORTS System Service + + Company: + Microchip Technology Inc. + + File Name: + sys_ports_static.c + + Summary: + SYS PORTS static function implementations for the Ports System Service. + + Description: + The Ports System Service provides a simple interface to manage the ports + on Microchip microcontrollers. This file defines the static implementation for the + Ports System Service. + + Remarks: + Static functions incorporate all system ports configuration settings as + determined by the user via the Microchip Harmony Configurator GUI. It provides + static version of the routines, eliminating the need for an object ID or + object handle. + +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +//DOM-IGNORE-END + +#include "system_config.h" +#include "peripheral/ports/plib_ports.h" +#include "peripheral/int/plib_int.h" + + +void SYS_PORTS_Initialize(void) +{ + + /* PORT B Initialization */ + PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_ODC); + PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_LAT); + PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_TRIS ^ 0xFFFF); + PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_B); + PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL); + PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_CNEN); + PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_CNPU); + PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_CNPD); + + /* PORT C Initialization */ + PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_ODC); + PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_LAT); + PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_TRIS ^ 0xFFFF); + PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_C); + PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL); + PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_CNEN); + PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_CNPU); + PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_C, SYS_PORT_C_CNPD); + + /* PORT E Initialization */ + PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_ODC); + PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_LAT); + PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_TRIS ^ 0xFFFF); + PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_E); + PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL); + PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_CNEN); + PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_CNPU); + PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_CNPD); + + /* PORT F Initialization */ + PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_ODC); + PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_LAT); + PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_TRIS ^ 0xFFFF); + PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_F); + PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL); + PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_CNEN); + PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_CNPU); + PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_F, SYS_PORT_F_CNPD); + + + /* PPS Input Remapping */ + + /* PPS Output Remapping */ + PLIB_PORTS_RemapOutput(PORTS_ID_0, OUTPUT_FUNC_C2OUT, OUTPUT_PIN_RPB9 ); + + +} + + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/rtos_hooks.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/rtos_hooks.c new file mode 100644 index 0000000..d3a9efb --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/rtos_hooks.c @@ -0,0 +1,118 @@ +/******************************************************************************* + System Tasks File + + File Name: + rtos_hooks.c + + Summary: + This file contains source code necessary for rtos hooks + + Description: + + Remarks: + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END +#include "FreeRTOS.h" +#include "task.h" + +/* +********************************************************************************************************* +* vApplicationStackOverflowHook() +* +* Description : Hook function called by FreeRTOS if a stack overflow happens. +* +* Argument(s) : none +* +* Return(s) : none +* +* Caller(s) : APP_StateReset() +* +* Note(s) : none. +********************************************************************************************************* +*/ +void vApplicationStackOverflowHook( TaskHandle_t pxTask, signed char *pcTaskName ) +{ + ( void ) pcTaskName; + ( void ) pxTask; + + /* Run time task stack overflow checking is performed if + configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is + called if a task stack overflow is detected. Note the system/interrupt + stack is not checked. */ + taskDISABLE_INTERRUPTS(); + for( ;; ); +} + +/* +********************************************************************************************************* +* vApplicationMallocFailedHook() +* +* Description : vApplicationMallocFailedHook() will only be called if +* configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. +* It is a hook function that will get called if a call to +* pvPortMalloc() fails. pvPortMalloc() is called internally by +* the kernel whenever a task, queue, timer or semaphore is +* created. It is also called by various parts of the demo +* application. If heap_1.c or heap_2.c are used, then the size of +* the heap available to pvPortMalloc() is defined by +* configTOTAL_HEAP_SIZE in FreeRTOSConfig.h, and the +* xPortGetFreeHeapSize() API function can be used to query the +* size of free heap space that remains (although it does not +* provide information on how the remaining heap might be +* fragmented). +* +* Argument(s) : none +* +* Return(s) : none +* +* Caller(s) : APP_StateReset() +* +* Note(s) : none. +********************************************************************************************************* +*/ + +void vApplicationMallocFailedHook( void ) +{ + /* vApplicationMallocFailedHook() will only be called if + configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook + function that will get called if a call to pvPortMalloc() fails. + pvPortMalloc() is called internally by the kernel whenever a task, queue, + timer or semaphore is created. It is also called by various parts of the + demo application. If heap_1.c or heap_2.c are used, then the size of the + heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in + FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used + to query the size of free heap space that remains (although it does not + provide information on how the remaining heap might be fragmented). */ + taskDISABLE_INTERRUPTS(); + for( ;; ); +} + + + +/******************************************************************************* + End of File + */ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_config.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_config.h new file mode 100644 index 0000000..063d7dd --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_config.h @@ -0,0 +1,614 @@ +/******************************************************************************* + MPLAB Harmony System Configuration Header + + File Name: + system_config.h + + Summary: + Build-time configuration header for the system defined by this MPLAB Harmony + project. + + Description: + An MPLAB Project may have multiple configurations. This file defines the + build-time options for a single configuration. + + Remarks: + This configuration header must not define any prototypes or data + definitions (or include any files that do). It only provides macro + definitions for build-time configuration options that are not instantiated + until used by another MPLAB Harmony module or application. + + Created with MPLAB Harmony Version 1.07 +*******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2015 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _SYSTEM_CONFIG_H +#define _SYSTEM_CONFIG_H + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** +/* This section Includes other configuration headers necessary to completely + define this configuration. +*/ + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + +extern "C" { + +#endif +// DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: System Service Configuration +// ***************************************************************************** +// ***************************************************************************** +// ***************************************************************************** +/* Common System Service Configuration Options +*/ +#define SYS_VERSION_STR "1.07" +#define SYS_VERSION 10700 + +// ***************************************************************************** +/* Clock System Service Configuration Options +*/ +#define SYS_CLK_FREQ 200000000ul +#define SYS_CLK_BUS_PERIPHERAL_1 100000000ul +#define SYS_CLK_BUS_PERIPHERAL_2 100000000ul +#define SYS_CLK_BUS_PERIPHERAL_3 100000000ul +#define SYS_CLK_BUS_PERIPHERAL_4 100000000ul +#define SYS_CLK_BUS_PERIPHERAL_5 100000000ul +#define SYS_CLK_BUS_PERIPHERAL_7 200000000ul +#define SYS_CLK_BUS_PERIPHERAL_8 200000000ul +#define SYS_CLK_CONFIG_PRIMARY_XTAL 24000000ul +#define SYS_CLK_CONFIG_SECONDARY_XTAL 0ul + +/*** Interrupt System Service Configuration ***/ +#define SYS_INT true + +/*** Ports System Service Configuration ***/ + +#define SYS_PORT_B_ANSEL 0x1f +#define SYS_PORT_B_TRIS 0x8f3f +#define SYS_PORT_B_LAT 0x4000 +#define SYS_PORT_B_ODC 0x0 +#define SYS_PORT_B_CNPU 0x0 +#define SYS_PORT_B_CNPD 0x0 +#define SYS_PORT_B_CNEN 0x0 + +#define SYS_PORT_C_ANSEL 0x6000 +#define SYS_PORT_C_TRIS 0x7000 +#define SYS_PORT_C_LAT 0x0 +#define SYS_PORT_C_ODC 0x0 +#define SYS_PORT_C_CNPU 0x0 +#define SYS_PORT_C_CNPD 0x0 +#define SYS_PORT_C_CNEN 0x0 + +#define SYS_PORT_E_ANSEL 0x0 +#define SYS_PORT_E_TRIS 0xff +#define SYS_PORT_E_LAT 0x0 +#define SYS_PORT_E_ODC 0x0 +#define SYS_PORT_E_CNPU 0x0 +#define SYS_PORT_E_CNPD 0x0 +#define SYS_PORT_E_CNEN 0x0 + +#define SYS_PORT_F_ANSEL 0x0 +#define SYS_PORT_F_TRIS 0x39 +#define SYS_PORT_F_LAT 0x0 +#define SYS_PORT_F_ODC 0x0 +#define SYS_PORT_F_CNPU 0x0 +#define SYS_PORT_F_CNPD 0x0 +#define SYS_PORT_F_CNEN 0x0 +/*** Timer System Service Configuration ***/ +#define SYS_TMR_POWER_STATE SYS_MODULE_POWER_RUN_FULL +#define SYS_TMR_DRIVER_INDEX DRV_TMR_INDEX_0 +#define SYS_TMR_MAX_CLIENT_OBJECTS 5 +#define SYS_TMR_FREQUENCY 1000 +#define SYS_TMR_FREQUENCY_TOLERANCE 10 +#define SYS_TMR_UNIT_RESOLUTION 10000 +#define SYS_TMR_CLIENT_TOLERANCE 10 +#define SYS_TMR_INTERRUPT_NOTIFICATION false + +/*** Console System Service Configuration ***/ + +#define SYS_CONSOLE_OVERRIDE_STDIO +#define SYS_CONSOLE_DEVICE_MAX_INSTANCES 1 +#define SYS_CONSOLE_INSTANCES_NUMBER 1 +#define SYS_CONSOLE_USB_CDC_INSTANCE USB_DEVICE_CDC_INDEX_0 +#define SYS_CONSOLE_USB_CDC_COMM_BAUD_RATE 230400 +#define SYS_CONSOLE_USB_CDC_RD_QUEUE_DEPTH 1 +#define SYS_CONSOLE_USB_CDC_WR_QUEUE_DEPTH 128 +#define SYS_CONSOLE_USB_CDC_READ_BUFFER_SIZE 512 +#define SYS_CONSOLE_BUFFER_DMA_READY __attribute__((coherent)) __attribute__((aligned(16))) + + + +/*** Debug System Service Configuration ***/ +#define SYS_DEBUG_ENABLE +#define DEBUG_PRINT_BUFFER_SIZE 1024 +#define SYS_DEBUG_BUFFER_DMA_READY __attribute__((coherent)) __attribute__((aligned(16))) +#define SYS_DEBUG_USE_CONSOLE + +/*** Command Processor System Service Configuration ***/ +#define SYS_CMD_ENABLE +#define SYS_CMD_DEVICE_MAX_INSTANCES SYS_CONSOLE_DEVICE_MAX_INSTANCES +#define SYS_CMD_PRINT_BUFFER_SIZE 2048 +#define SYS_CMD_BUFFER_DMA_READY __attribute__((coherent)) __attribute__((aligned(16))) +#define SYS_CMD_REMAP_SYS_CONSOLE_MESSAGE +#define SYS_CMD_REMAP_SYS_DEBUG_MESSAGE + +/*** File System Service Configuration ***/ + +#define SYS_FS_MEDIA_NUMBER 1 + +#define SYS_FS_VOLUME_NUMBER 1 + +#define SYS_FS_AUTOMOUNT_ENABLE false +#define SYS_FS_MAX_FILES 25 +#define SYS_FS_MAX_FILE_SYSTEM_TYPE 1 +#define SYS_FS_MEDIA_MAX_BLOCK_SIZE 512 +#define SYS_FS_MEDIA_MANAGER_BUFFER_SIZE 2048 + + +#define SYS_FS_MEDIA_TYPE_IDX0 +#define SYS_FS_TYPE_IDX0 + + + + + + + + +// ***************************************************************************** +/* Random System Service Configuration Options +*/ + +#define SYS_RANDOM_CRYPTO_SEED_SIZE 32 + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Driver Configuration +// ***************************************************************************** +// ***************************************************************************** +/*** Timer Driver Configuration ***/ +#define DRV_TMR_INTERRUPT_MODE true +#define DRV_TMR_INSTANCES_NUMBER 1 +#define DRV_TMR_CLIENTS_NUMBER 1 + +/*** Timer Driver 0 Configuration ***/ +#define DRV_TMR_PERIPHERAL_ID_IDX0 TMR_ID_2 +#define DRV_TMR_INTERRUPT_SOURCE_IDX0 INT_SOURCE_TIMER_2 +#define DRV_TMR_INTERRUPT_VECTOR_IDX0 INT_VECTOR_T2 +#define DRV_TMR_ISR_VECTOR_IDX0 _TIMER_2_VECTOR +#define DRV_TMR_INTERRUPT_PRIORITY_IDX0 INT_PRIORITY_LEVEL1 +#define DRV_TMR_INTERRUPT_SUB_PRIORITY_IDX0 INT_SUBPRIORITY_LEVEL0 +#define DRV_TMR_CLOCK_SOURCE_IDX0 DRV_TMR_CLKSOURCE_INTERNAL +#define DRV_TMR_PRESCALE_IDX0 TMR_PRESCALE_VALUE_256 +#define DRV_TMR_OPERATION_MODE_IDX0 DRV_TMR_OPERATION_MODE_16_BIT +#define DRV_TMR_ASYNC_WRITE_ENABLE_IDX0 false +#define DRV_TMR_POWER_STATE_IDX0 SYS_MODULE_POWER_RUN_FULL + + +/*** NVM Driver Configuration ***/ + +#define DRV_NVM_INSTANCES_NUMBER 1 +#define DRV_NVM_CLIENTS_NUMBER 2 +#define DRV_NVM_BUFFER_OBJECT_NUMBER 5 + +#define DRV_NVM_INTERRUPT_MODE true +#define DRV_NVM_INTERRUPT_SOURCE INT_SOURCE_FLASH_CONTROL + +#define DRV_NVM_MEDIA_SIZE 80 +#define DRV_NVM_MEDIA_START_ADDRESS 0x9D100000 + +#define DRV_NVM_ERASE_WRITE_ENABLE + + +#define DRV_NVM_SYS_FS_REGISTER + + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Middleware & Other Library Configuration +// ***************************************************************************** +// ***************************************************************************** +/*** USB Driver Configuration ***/ + + +/* Enables Device Support */ +#define DRV_USBHS_DEVICE_SUPPORT true + +/* Disable Device Support */ +#define DRV_USBHS_HOST_SUPPORT false + +/* Maximum USB driver instances */ +#define DRV_USBHS_INSTANCES_NUMBER 1 + + +/* Interrupt mode enabled */ +#define DRV_USBHS_INTERRUPT_MODE true + + +/* Number of Endpoints used */ +#define DRV_USBHS_ENDPOINTS_NUMBER 3 + + + + +/*** USB Device Stack Configuration ***/ + + + + + + + + + + +/* The USB Device Layer will not initialize the USB Driver */ +#define USB_DEVICE_DRIVER_INITIALIZE_EXPLICIT + +/* Maximum device layer instances */ +#define USB_DEVICE_INSTANCES_NUMBER 1 + +/* EP0 size in bytes */ +#define USB_DEVICE_EP0_BUFFER_SIZE 64 + + + + + + + + + + +/* Maximum instances of CDC function driver */ +#define USB_DEVICE_CDC_INSTANCES_NUMBER 1 + + + + + + + + + + +/* CDC Transfer Queue Size for both read and + write. Applicable to all instances of the + function driver */ +#define USB_DEVICE_CDC_QUEUE_DEPTH_COMBINED 130 + + + + +// ***************************************************************************** +// ***************************************************************************** +// Section: TCPIP Stack Configuration +// ***************************************************************************** +// ***************************************************************************** +#define TCPIP_STACK_USE_IPV4 +#define TCPIP_STACK_USE_TCP +#define TCPIP_STACK_USE_UDP + +#define TCPIP_STACK_TICK_RATE 5 +#define TCPIP_STACK_SECURE_PORT_ENTRIES 10 + +/* TCP/IP stack event notification */ +#define TCPIP_STACK_USE_EVENT_NOTIFICATION +#define TCPIP_STACK_USER_NOTIFICATION false +#define TCPIP_STACK_DOWN_OPERATION true +#define TCPIP_STACK_IF_UP_DOWN_OPERATION true +#define TCPIP_STACK_MAC_DOWN_OPERATION true +#define TCPIP_STACK_CONFIGURATION_SAVE_RESTORE true +/*** TCPIP Heap Configuration ***/ +#define TCPIP_STACK_USE_INTERNAL_HEAP +#define TCPIP_STACK_DRAM_SIZE 39250 +#define TCPIP_STACK_DRAM_RUN_LIMIT 2048 +#define TCPIP_STACK_MALLOC_FUNC malloc + +#define TCPIP_STACK_CALLOC_FUNC calloc + +#define TCPIP_STACK_FREE_FUNC free + + + +#define TCPIP_STACK_HEAP_USE_FLAGS TCPIP_STACK_HEAP_FLAG_ALLOC_UNCACHED + +#define TCPIP_STACK_HEAP_USAGE_CONFIG TCPIP_STACK_HEAP_USE_DEFAULT + +#define TCPIP_STACK_SUPPORTED_HEAPS 1 + +/*** ARP Configuration ***/ +#define TCPIP_ARP_CACHE_ENTRIES 5 +#define TCPIP_ARP_CACHE_DELETE_OLD true +#define TCPIP_ARP_CACHE_SOLVED_ENTRY_TMO 1200 +#define TCPIP_ARP_CACHE_PENDING_ENTRY_TMO 60 +#define TCPIP_ARP_CACHE_PENDING_RETRY_TMO 2 +#define TCPIP_ARP_CACHE_PERMANENT_QUOTA 50 +#define TCPIP_ARP_CACHE_PURGE_THRESHOLD 75 +#define TCPIP_ARP_CACHE_PURGE_QUANTA 1 +#define TCPIP_ARP_CACHE_ENTRY_RETRIES 3 +#define TCPIP_ARP_GRATUITOUS_PROBE_COUNT 1 +#define TCPIP_ARP_TASK_PROCESS_RATE 2 + +/*** DHCP Configuration ***/ +#define TCPIP_STACK_USE_DHCP_CLIENT +#define TCPIP_DHCP_TIMEOUT 10 +#define TCPIP_DHCP_TASK_TICK_RATE 5 +#define TCPIP_DHCP_HOST_NAME_SIZE 20 +#define TCPIP_DHCP_CLIENT_CONNECT_PORT 68 +#define TCPIP_DHCP_SERVER_LISTEN_PORT 67 +#define TCPIP_DHCP_CLIENT_ENABLED true + + + +/*** DNS Client Configuration ***/ +#define TCPIP_STACK_USE_DNS +#define TCPIP_DNS_CLIENT_SERVER_TMO 60 +#define TCPIP_DNS_CLIENT_TASK_PROCESS_RATE 200 +#define TCPIP_DNS_CLIENT_CACHE_ENTRIES 5 +#define TCPIP_DNS_CLIENT_CACHE_ENTRY_TMO 0 +#define TCPIP_DNS_CLIENT_CACHE_PER_IPV4_ADDRESS 5 +#define TCPIP_DNS_CLIENT_CACHE_PER_IPV6_ADDRESS 1 +#define TCPIP_DNS_CLIENT_ADDRESS_TYPE IP_ADDRESS_TYPE_IPV4 +#define TCPIP_DNS_CLIENT_CACHE_DEFAULT_TTL_VAL 1200 +#define TCPIP_DNS_CLIENT_CACHE_UNSOLVED_ENTRY_TMO 10 +#define TCPIP_DNS_CLIENT_LOOKUP_RETRY_TMO 3 +#define TCPIP_DNS_CLIENT_MAX_HOSTNAME_LEN 256 +#define TCPIP_DNS_CLIENT_MAX_SELECT_INTERFACES 4 +#define TCPIP_DNS_CLIENT_DELETE_OLD_ENTRIES true +#define TCPIP_DNS_CLIENT_USER_NOTIFICATION false + + + +/*** HTTP Configuration ***/ +#define TCPIP_STACK_USE_HTTP_SERVER +#define TCPIP_HTTP_MAX_HEADER_LEN 15 +#define TCPIP_HTTP_CACHE_LEN "600" +#define TCPIP_HTTP_TIMEOUT 45 +#define TCPIP_HTTP_MAX_CONNECTIONS 1 +#define TCPIP_HTTP_MAX_TLS_CONNECTIONS 0 +#define TCPIP_HTTP_DEFAULT_FILE "index.htm" +#define TCPIP_HTTPS_DEFAULT_FILE "index.htm" +#define TCPIP_HTTP_DEFAULT_LEN 10 +#define TCPIP_HTTP_MAX_DATA_LEN 4096 +#define TCPIP_HTTP_MIN_CALLBACK_FREE 16 +#define TCPIP_HTTP_SKT_TX_BUFF_SIZE 0 +#define TCPIP_HTTP_SKT_RX_BUFF_SIZE 0 +#define TCPIP_HTTP_TLS_SKT_TX_BUFF_SIZE 0 +#define TCPIP_HTTP_TLS_SKT_RX_BUFF_SIZE 0 +#define TCPIP_HTTP_CONFIG_FLAGS 1 +#define TCPIP_HTTP_USE_POST +#define TCPIP_HTTP_TASK_RATE 33 + + + + +/*** NBNS Configuration ***/ +#define TCPIP_STACK_USE_NBNS +#define TCPIP_NBNS_TASK_TICK_RATE 110 + + +/*** SNTP Configuration ***/ +#define TCPIP_STACK_USE_SNTP_CLIENT +#define TCPIP_NTP_DEFAULT_IF "PIC32INT" +#define TCPIP_NTP_VERSION 4 +#define TCPIP_NTP_DEFAULT_CONNECTION_TYPE IP_ADDRESS_TYPE_IPV4 +#define TCPIP_NTP_EPOCH 2208988800ul +#define TCPIP_NTP_REPLY_TIMEOUT 6 +#define TCPIP_NTP_MAX_STRATUM 15 +#define TCPIP_NTP_TIME_STAMP_TMO 660 +#define TCPIP_NTP_SERVER "pool.ntp.org" +#define TCPIP_NTP_SERVER_MAX_LENGTH 30 +#define TCPIP_NTP_QUERY_INTERVAL 600 +#define TCPIP_NTP_FAST_QUERY_INTERVAL 14 +#define TCPIP_NTP_TASK_TICK_RATE 1100 +#define TCPIP_NTP_RX_QUEUE_LIMIT 2 + + + + +/*** TCP Configuration ***/ +#define TCPIP_TCP_MAX_SEG_SIZE_TX 1460 +#define TCPIP_TCP_MAX_SEG_SIZE_RX_LOCAL 1460 +#define TCPIP_TCP_MAX_SEG_SIZE_RX_NON_LOCAL 536 +#define TCPIP_TCP_SOCKET_DEFAULT_TX_SIZE 512 +#define TCPIP_TCP_SOCKET_DEFAULT_RX_SIZE 4096 +#define TCPIP_TCP_DYNAMIC_OPTIONS true +#define TCPIP_TCP_START_TIMEOUT_VAL 1000 +#define TCPIP_TCP_DELAYED_ACK_TIMEOUT 100 +#define TCPIP_TCP_FIN_WAIT_2_TIMEOUT 5000 +#define TCPIP_TCP_KEEP_ALIVE_TIMEOUT 10000 +#define TCPIP_TCP_CLOSE_WAIT_TIMEOUT 200 +#define TCPIP_TCP_MAX_RETRIES 5 +#define TCPIP_TCP_MAX_UNACKED_KEEP_ALIVES 6 +#define TCPIP_TCP_MAX_SYN_RETRIES 3 +#define TCPIP_TCP_AUTO_TRANSMIT_TIMEOUT_VAL 40 +#define TCPIP_TCP_WINDOW_UPDATE_TIMEOUT_VAL 200 +#define TCPIP_TCP_MAX_SOCKETS 15 +#define TCPIP_TCP_TASK_TICK_RATE 5 + +/*** announce Configuration ***/ +#define TCPIP_STACK_USE_ANNOUNCE +#define TCPIP_ANNOUNCE_MAX_PAYLOAD 512 +#define TCPIP_ANNOUNCE_TASK_RATE 333 + +/*** TCPIP MAC Configuration ***/ +#define TCPIP_EMAC_TX_DESCRIPTORS 8 +#define TCPIP_EMAC_RX_DESCRIPTORS 10 +#define TCPIP_EMAC_RX_DEDICATED_BUFFERS 4 +#define TCPIP_EMAC_RX_INIT_BUFFERS 0 +#define TCPIP_EMAC_RX_LOW_THRESHOLD 1 +#define TCPIP_EMAC_RX_LOW_FILL 2 +#define TCPIP_EMAC_RX_BUFF_SIZE 1536 +#define TCPIP_EMAC_RX_MAX_FRAME 1536 +#define TCPIP_EMAC_RX_FRAGMENTS 1 +#define TCPIP_EMAC_ETH_OPEN_FLAGS \ + TCPIP_ETH_OPEN_AUTO |\ + TCPIP_ETH_OPEN_FDUPLEX |\ + TCPIP_ETH_OPEN_HDUPLEX |\ + TCPIP_ETH_OPEN_100 |\ + TCPIP_ETH_OPEN_10 |\ + TCPIP_ETH_OPEN_RMII |\ + 0 +#define TCPIP_EMAC_PHY_CONFIG_FLAGS \ + DRV_ETHPHY_CFG_RMII | \ + 0 +#define TCPIP_EMAC_PHY_LINK_INIT_DELAY 500 +#define TCPIP_EMAC_PHY_ADDRESS 0 +#define TCPIP_EMAC_INTERRUPT_MODE true +#define DRV_ETHPHY_INSTANCES_NUMBER 1 +#define DRV_ETHPHY_CLIENTS_NUMBER 1 +#define DRV_ETHPHY_INDEX 1 +#define DRV_ETHPHY_PERIPHERAL_ID 1 +#define DRV_ETHPHY_NEG_INIT_TMO 1 +#define DRV_ETHPHY_NEG_DONE_TMO 2000 +#define DRV_ETHPHY_RESET_CLR_TMO 500 +#define DRV_ETHMAC_INSTANCES_NUMBER 1 +#define DRV_ETHMAC_CLIENTS_NUMBER 1 +#define DRV_ETHMAC_INDEX 1 +#define DRV_ETHMAC_PERIPHERAL_ID 1 +#define DRV_ETHMAC_INTERRUPT_VECTOR INT_VECTOR_ETHERNET +#define DRV_ETHMAC_INTERRUPT_SOURCE INT_SOURCE_ETH_1 +#define DRV_ETHMAC_POWER_STATE SYS_MODULE_POWER_RUN_FULL + +#define DRV_ETHMAC_INTERRUPT_MODE true + + + +/*** UDP Configuration ***/ +#define TCPIP_UDP_MAX_SOCKETS 10 +#define TCPIP_UDP_SOCKET_DEFAULT_TX_SIZE 512 +#define TCPIP_UDP_SOCKET_DEFAULT_TX_QUEUE_LIMIT 3 +#define TCPIP_UDP_SOCKET_DEFAULT_RX_QUEUE_LIMIT 3 +#define TCPIP_UDP_USE_POOL_BUFFERS false +#define TCPIP_UDP_USE_TX_CHECKSUM true + +#define TCPIP_UDP_USE_RX_CHECKSUM true + +#define TCPIP_STACK_USE_ZEROCONF_LINK_LOCAL +#define TCPIP_ZC_LL_PROBE_WAIT 1 +#define TCPIP_ZC_LL_PROBE_MIN 1 +#define TCPIP_ZC_LL_PROBE_MAX 2 +#define TCPIP_ZC_LL_PROBE_NUM 3 +#define TCPIP_ZC_LL_ANNOUNCE_WAIT 2 +#define TCPIP_ZC_LL_ANNOUNCE_NUM 2 +#define TCPIP_ZC_LL_ANNOUNCE_INTERVAL 2 +#define TCPIP_ZC_LL_MAX_CONFLICTS 10 +#define TCPIP_ZC_LL_RATE_LIMIT_INTERVAL 60 +#define TCPIP_ZC_LL_DEFEND_INTERVAL 10 +#define TCPIP_ZC_LL_IPV4_LLBASE 0xa9fe0100 +#define TCPIP_ZC_LL_IPV4_LLBASE_MASK 0x0000FFFF +#define TCPIP_ZC_LL_TASK_TICK_RATE 333 +#define TCPIP_STACK_USE_ZEROCONF_MDNS_SD +#define TCPIP_ZC_MDNS_TASK_TICK_RATE 63 +#define TCPIP_ZC_MDNS_PORT 5353 +#define TCPIP_ZC_MDNS_MAX_HOST_NAME_SIZE 32 +#define TCPIP_ZC_MDNS_MAX_LABEL_SIZE 64 +#define TCPIP_ZC_MDNS_MAX_RR_NAME_SIZE 256 +#define TCPIP_ZC_MDNS_MAX_SRV_TYPE_SIZE 32 +#define TCPIP_ZC_MDNS_MAX_SRV_NAME_SIZE 64 +#define TCPIP_ZC_MDNS_MAX_TXT_DATA_SIZE 128 +#define TCPIP_ZC_MDNS_RESOURCE_RECORD_TTL_VAL 3600 +#define TCPIP_ZC_MDNS_MAX_RR_NUM 4 +#define TCPIP_ZC_MDNS_PROBE_WAIT 750 +#define TCPIP_ZC_MDNS_PROBE_INTERVAL 250 +#define TCPIP_ZC_MDNS_PROBE_NUM 3 +#define TCPIP_ZC_MDNS_MAX_PROBE_CONFLICT_NUM 30 +#define TCPIP_ZC_MDNS_ANNOUNCE_NUM 3 +#define TCPIP_ZC_MDNS_ANNOUNCE_INTERVAL 250 +#define TCPIP_ZC_MDNS_ANNOUNCE_WAIT 250 + + +/*** Network Configuration Index 0 ***/ +#define TCPIP_NETWORK_DEFAULT_INTERFACE_NAME "PIC32INT" +#define TCPIP_IF_PIC32INT +#define TCPIP_NETWORK_DEFAULT_HOST_NAME "AWS_IOT_ETHERNET" +#define TCPIP_NETWORK_DEFAULT_MAC_ADDR 0 +#define TCPIP_NETWORK_DEFAULT_IP_ADDRESS "0.0.0.0" +#define TCPIP_NETWORK_DEFAULT_IP_MASK "255.255.255.0" +#define TCPIP_NETWORK_DEFAULT_GATEWAY "192.168.100.1" +#define TCPIP_NETWORK_DEFAULT_DNS "192.168.100.1" +#define TCPIP_NETWORK_DEFAULT_SECOND_DNS "0.0.0.0" +#define TCPIP_NETWORK_DEFAULT_POWER_MODE "full" +#define TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS TCPIP_NETWORK_CONFIG_DHCP_CLIENT_ON +#define TCPIP_NETWORK_DEFAULT_MAC_DRIVER DRV_ETHMAC_PIC32MACObject +#define TCPIP_NETWORK_DEFAULT_IPV6_ADDRESS 0 +#define TCPIP_NETWORK_DEFAULT_IPV6_PREFIX_LENGTH 0 +#define TCPIP_NETWORK_DEFAULT_IPV6_GATEWAY 0 + + +/*** TCPIP SYS FS Wrapper ***/ +#define SYS_FS_MAX_PATH 80 +#define LOCAL_WEBSITE_PATH_FS "/mnt/mchpSite1" +#define LOCAL_WEBSITE_PATH "/mnt/mchpSite1/" +#define SYS_FS_DRIVE "FLASH" +#define SYS_FS_NVM_VOL "/dev/nvma1" +#define SYS_FS_FATFS_STRING "FATFS" +#define SYS_FS_MPFS_STRING "MPFS2" + +/*** OSAL Configuration ***/ +#define OSAL_USE_RTOS 1 + +/* MPLAB Harmony Net Presentation Layer Definitions*/ +#define NET_PRES_NUM_INSTANCE 1 +#define NET_PRES_NUM_SOCKETS 10 + + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Application Configuration +// ***************************************************************************** +// ***************************************************************************** + +/*** Application Instance 0 Configuration ***/ + +/*** Application Instance 1 Configuration ***/ + +//DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +//DOM-IGNORE-END + + +#endif // _SYSTEM_CONFIG_H +/******************************************************************************* + End of File +*/ + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_definitions.h b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_definitions.h new file mode 100644 index 0000000..a10e570 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_definitions.h @@ -0,0 +1,158 @@ +/******************************************************************************* + System Definitions + + File Name: + system_definitions.h + + Summary: + MPLAB Harmony project system definitions. + + Description: + This file contains the system-wide prototypes and definitions for an MPLAB + Harmony project. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +//DOM-IGNORE-END + +#ifndef _SYS_DEFINITIONS_H +#define _SYS_DEFINITIONS_H + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include +#include +#include +#include "system/common/sys_common.h" +#include "system/common/sys_module.h" +#include "system/clk/sys_clk.h" +#include "system/clk/sys_clk_static.h" +#include "system/devcon/sys_devcon.h" +#include "system/int/sys_int.h" +#include "system/fs/sys_fs.h" +#include "system/fs/sys_fs_media_manager.h" +#include "system/console/sys_console.h" +#include "system/random/sys_random.h" +#include "system/fs/mpfs/mpfs.h" +#include "system/tmr/sys_tmr.h" +#include "system/reset/sys_reset.h" +#include "driver/adc/drv_adc_static.h" +#include "driver/tmr/drv_tmr.h" +#include "driver/cmp/drv_cmp_static.h" +#include "driver/nvm/drv_nvm.h" +#include "system/ports/sys_ports.h" +#include "system/debug/sys_debug.h" +#include "system/command/sys_command.h" +#include "driver/usb/usbhs/drv_usbhs.h" +#include "usb/usb_device.h" + + +#include "usb/usb_device_cdc.h" +#include "tcpip/tcpip.h" +#include "driver/ethmac/drv_ethmac.h" +#include "FreeRTOS.h" +#include "task.h" +#include "net/pres/net_pres.h" +#include "net/pres/net_pres_encryptionproviderapi.h" +#include "net/pres/net_pres_transportapi.h" +#include "net/pres/net_pres_socketapi.h" +#include "app.h" +#include "app1.h" + + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + +extern "C" { + +#endif +// DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: Type Definitions +// ***************************************************************************** +// ***************************************************************************** + +// ***************************************************************************** +/* System Objects + + Summary: + Structure holding the system's object handles + + Description: + This structure contains the object handles for all objects in the + MPLAB Harmony project's system configuration. + + Remarks: + These handles are returned from the "Initialize" functions for each module + and must be passed into the "Tasks" function for each module. +*/ + +typedef struct +{ + SYS_MODULE_OBJ sysDevcon; + SYS_MODULE_OBJ sysTmr; + SYS_MODULE_OBJ drvTmr0; + SYS_MODULE_OBJ drvNvm; + SYS_MODULE_OBJ sysDebug; + SYS_MODULE_OBJ sysConsole0; + SYS_MODULE_OBJ drvUSBObject; + + SYS_MODULE_OBJ usbDevObject0; + + + SYS_MODULE_OBJ tcpip; + SYS_MODULE_OBJ netPres; + +} SYSTEM_OBJECTS; + + +// ***************************************************************************** +// ***************************************************************************** +// Section: extern declarations +// ***************************************************************************** +// ***************************************************************************** + +extern SYSTEM_OBJECTS sysObj; + + + +//DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +//DOM-IGNORE-END + +#endif /* _SYS_DEFINITIONS_H */ +/******************************************************************************* + End of File +*/ + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_exceptions.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_exceptions.c new file mode 100644 index 0000000..73a2380 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_exceptions.c @@ -0,0 +1,143 @@ +/******************************************************************************* + MPLAB Harmony Exceptions Source File + + File Name: + system_exceptions.c + + Summary: + This file contains a function which overrides the deafult _weak_ exception + handler provided by the XC32 compiler. + + Description: + This file redefines the default _weak_ exception handler with a more debug + friendly one. If an unexpected exception occurs the code will stop in a + while(1) loop. The debugger can be halted and two variables _excep_code and + _except_addr can be examined to determine the cause and address where the + exception occured. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2015 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + + +#include /* Defines special funciton registers, CP0 regs */ +#include "system_config.h" +#include "system_definitions.h" +#include "system/debug/sys_debug.h" + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Global Data Definitions +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Exception Reason Data + + + + Remarks: + These global static items are used instead of local variables in the + _general_exception_handler function because the stack may not be available + if an exception has occured. +*/ + +/* Code identifying the cause of the exception (CP0 Cause register). */ +static unsigned int _excep_code; + +/* Address of instruction that caused the exception. */ +static unsigned int _excep_addr; + +/* Pointer to the string describing the cause of the exception. */ +static char *_cause_str; + +/* Array identifying the cause (indexed by _exception_code). */ +static char *cause[] = +{ + "Interrupt", + "Undefined", + "Undefined", + "Undefined", + "Load/fetch address error", + "Store address error", + "Instruction bus error", + "Data bus error", + "Syscall", + "Breakpoint", + "Reserved instruction", + "Coprocessor unusable", + "Arithmetic overflow", + "Trap", + "Reserved", + "Reserved", + "Reserved", + "Reserved", + "Reserved" +}; + +// + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Exception Handling +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void _general_exception_handler ( void ) + + Summary: + Overrides the XC32 _weak_ _generic_exception_handler. + + Description: + This function overrides the XC32 default _weak_ _generic_exception_handler. + + Remarks: + Refer to the XC32 User's Guide for additional information. + */ + +void _general_exception_handler ( void ) +{ + /* Mask off Mask of the ExcCode Field from the Cause Register + Refer to the MIPs Software User's manual */ + _excep_code = (_CP0_GET_CAUSE() & 0x0000007C) >> 2; + _excep_addr = _CP0_GET_EPC(); + _cause_str = cause[_excep_code]; + + SYS_DEBUG_PRINT(SYS_ERROR_ERROR, "\nGeneral Exception %s (cause=%d, addr=%x).\n", + _cause_str, _excep_code, _excep_addr); + + while (1) + { + SYS_DEBUG_BreakPoint(); + } +} + +/******************************************************************************* + End of File +*/ diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_init.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_init.c new file mode 100644 index 0000000..4e49502 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_init.c @@ -0,0 +1,1072 @@ +/******************************************************************************* + System Initialization File + + File Name: + system_init.c + + Summary: + This file contains source code necessary to initialize the system. + + Description: + This file contains source code necessary to initialize the system. It + implements the "SYS_Initialize" function, defines the configuration bits, + and allocates any necessary global system resources, such as the + sysObj structure that contains the object handles to all the MPLAB Harmony + module objects in the system. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2015 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include "system_config.h" +#include "system_definitions.h" + + +// **************************************************************************** +// **************************************************************************** +// Section: Configuration Bits +// **************************************************************************** +// **************************************************************************** +// + +/*** DEVCFG0 ***/ + +#pragma config DEBUG = OFF +#pragma config JTAGEN = OFF +#pragma config ICESEL = ICS_PGx1 +#pragma config TRCEN = OFF +#pragma config BOOTISA = MIPS32 +#pragma config FECCCON = OFF_UNLOCKED +#pragma config FSLEEP = OFF +#pragma config DBGPER = PG_ALL +#pragma config SMCLR = MCLR_NORM +#pragma config SOSCGAIN = GAIN_2X +#pragma config SOSCBOOST = ON +#pragma config POSCGAIN = GAIN_2X +#pragma config POSCBOOST = ON +#pragma config EJTAGBEN = NORMAL +#pragma config CP = OFF + +/*** DEVCFG1 ***/ + +#pragma config FNOSC = SPLL +#pragma config DMTINTV = WIN_127_128 +#pragma config FSOSCEN = OFF +#pragma config IESO = OFF +#pragma config POSCMOD = EC +#pragma config OSCIOFNC = OFF +#pragma config FCKSM = CSECME +#pragma config WDTPS = PS1048576 +#pragma config WDTSPGM = STOP +#pragma config FWDTEN = OFF +#pragma config WINDIS = NORMAL +#pragma config FWDTWINSZ = WINSZ_25 +#pragma config DMTCNT = DMT31 +#pragma config FDMTEN = OFF +/*** DEVCFG2 ***/ + +#pragma config FPLLIDIV = DIV_3 +#pragma config FPLLRNG = RANGE_8_16_MHZ +#pragma config FPLLICLK = PLL_POSC +#pragma config FPLLMULT = MUL_50 +#pragma config FPLLODIV = DIV_2 +#pragma config UPLLFSEL = FREQ_24MHZ +/*** DEVCFG3 ***/ + +#pragma config USERID = 0xffff +#pragma config FMIIEN = OFF +#pragma config FETHIO = ON +#pragma config PGL1WAY = ON +#pragma config PMDL1WAY = ON +#pragma config IOL1WAY = ON +#pragma config FUSBIDIO = ON + +/*** BF1SEQ0 ***/ + +#pragma config TSEQ = 0x0000 +#pragma config CSEQ = 0xffff +// + +// ***************************************************************************** +// ***************************************************************************** +// Section: Driver Initialization Data +// ***************************************************************************** +// ***************************************************************************** +// +/*** FLASH Driver Initialization Data ***/ +extern const uint8_t NVM_MEDIA_DATA[]; +SYS_FS_MEDIA_REGION_GEOMETRY NVMGeometryTable[3] = +{ + { + .blockSize = 1, + .numBlocks = (DRV_NVM_MEDIA_SIZE * 1024), + }, + { + .blockSize = DRV_NVM_ROW_SIZE, + .numBlocks = ((DRV_NVM_MEDIA_SIZE * 1024)/DRV_NVM_ROW_SIZE) + }, + { + .blockSize = DRV_NVM_PAGE_SIZE, + .numBlocks = ((DRV_NVM_MEDIA_SIZE * 1024)/DRV_NVM_PAGE_SIZE) + } +}; + +const SYS_FS_MEDIA_GEOMETRY NVMGeometry = +{ + .mediaProperty = SYS_FS_MEDIA_WRITE_IS_BLOCKING, + .numReadRegions = 1, + .numWriteRegions = 1, + .numEraseRegions = 1, + .geometryTable = (SYS_FS_MEDIA_REGION_GEOMETRY *)&NVMGeometryTable +}; + +const DRV_NVM_INIT drvNvmInit = +{ + .moduleInit.sys.powerState = SYS_MODULE_POWER_RUN_FULL, + .nvmID = NVM_ID_0, + .interruptSource = INT_SOURCE_FLASH_CONTROL, + + .mediaStartAddress = 0x9D100000, + .nvmMediaGeometry = (SYS_FS_MEDIA_GEOMETRY *)&NVMGeometry + +}; + + +// +// +/*** TMR Driver Initialization Data ***/ + +const DRV_TMR_INIT drvTmr0InitData = +{ + .moduleInit.sys.powerState = DRV_TMR_POWER_STATE_IDX0, + .tmrId = DRV_TMR_PERIPHERAL_ID_IDX0, + .clockSource = DRV_TMR_CLOCK_SOURCE_IDX0, + .prescale = DRV_TMR_PRESCALE_IDX0, + .mode = DRV_TMR_OPERATION_MODE_IDX0, + .interruptSource = DRV_TMR_INTERRUPT_SOURCE_IDX0, + .asyncWriteEnable = false, +}; +// +// +/****************************************************** + * USB Driver Initialization + ******************************************************/ +const DRV_USBHS_INIT drvUSBInit = +{ + /* Interrupt Source for USB module */ + .interruptSource = INT_SOURCE_USB_1, + + /* Interrupt Source for USB module */ + .interruptSourceUSBDma = INT_SOURCE_USB_1_DMA, + + /* System module initialization */ + .moduleInit = {SYS_MODULE_POWER_RUN_FULL}, + + .operationMode = DRV_USBHS_OPMODE_DEVICE, + + .operationSpeed = USB_SPEED_HIGH, + + /* Stop in idle */ + .stopInIdle = false, + + /* Suspend in sleep */ + .suspendInSleep = false, + + /* Identifies peripheral (PLIB-level) ID */ + .usbID = 0, +}; +// + +// ***************************************************************************** +// ***************************************************************************** +// Section: System Data +// ***************************************************************************** +// ***************************************************************************** + +/* Structure to hold the object handles for the modules in the system. */ +SYSTEM_OBJECTS sysObj; + +// ***************************************************************************** +// ***************************************************************************** +// Section: Module Initialization Data +// ***************************************************************************** +// ***************************************************************************** +/* Net Presentation Layer Data Definitions */ +#include "framework/net/pres/net_pres_enc_glue.h" + +static const NET_PRES_TransportObject netPresTransObject0SC = { + .fpOpen = (NET_PRES_TransOpen)TCPIP_TCP_ClientOpen, + .fpLocalBind = (NET_PRES_TransBind)TCPIP_TCP_Bind, + .fpRemoteBind = (NET_PRES_TransBind)TCPIP_TCP_RemoteBind, + .fpOptionGet = (NET_PRES_TransOption)TCPIP_TCP_OptionsGet, + .fpOptionSet = (NET_PRES_TransOption)TCPIP_TCP_OptionsSet, + .fpIsConnected = (NET_PRES_TransBool)TCPIP_TCP_IsConnected, + .fpWasReset = (NET_PRES_TransBool)TCPIP_TCP_WasReset, + .fpDisconnect = (NET_PRES_TransBool)TCPIP_TCP_Disconnect, + .fpConnect = (NET_PRES_TransBool)TCPIP_TCP_Connect, + .fpClose = (NET_PRES_TransClose)TCPIP_TCP_Close, + .fpSocketInfoGet = (NET_PRES_TransSocketInfoGet)TCPIP_TCP_SocketInfoGet, + .fpFlush = (NET_PRES_TransBool)TCPIP_TCP_Flush, + .fpPeek = (NET_PRES_TransPeek)TCPIP_TCP_ArrayPeek, + .fpDiscard = (NET_PRES_TransDiscard)TCPIP_TCP_Discard, + .fpHandlerRegister = (NET_PRES_TransHandlerRegister)TCPIP_TCP_SignalHandlerRegister, + .fpHandlerDeregister = (NET_PRES_TransSignalHandlerDeregister)TCPIP_TCP_SignalHandlerDeregister, + .fpRead = (NET_PRES_TransRead)TCPIP_TCP_ArrayGet, + .fpWrite = (NET_PRES_TransWrite)TCPIP_TCP_ArrayPut, + .fpReadyToRead = (NET_PRES_TransReady)TCPIP_TCP_GetIsReady, + .fpReadyToWrite = (NET_PRES_TransReady)TCPIP_TCP_PutIsReady, + .fpIsPortDefaultSecure = (NET_PRES_TransIsPortDefaultSecured)TCPIP_Helper_TCPSecurePortGet, +}; +static const NET_PRES_INST_DATA netPresCfgs[] = +{ + { + .pTransObject_sc = &netPresTransObject0SC, + .pProvObject_ss = NULL, + .pProvObject_sc = &net_pres_EncProviderStreamClient0, + .pProvObject_ds = NULL, + .pProvObject_dc = NULL, + }, +}; + +static const NET_PRES_INIT_DATA netPresInitData = +{ + .numLayers = sizeof(netPresCfgs) / sizeof(NET_PRES_INST_DATA), + .pInitData = netPresCfgs +}; + + +// +/*** System Command Initialization Data ***/ + +SYS_CMD_INIT sysCmdInit = +{ + .moduleInit = {0}, + .consoleCmdIOParam = SYS_CMD_SINGLE_CHARACTER_READ_CONSOLE_IO_PARAM, +}; +// +// +/*** System Console Initialization Data ***/ + +SYS_MODULE_OBJ sysConsoleObjects[] = { SYS_MODULE_OBJ_INVALID }; + +/* Declared in console device implementation (sys_console_usb_cdc.c) */ +extern SYS_CONSOLE_DEV_DESC consUsbCdcDevDesc; + +SYS_CONSOLE_INIT consUsbInit0 = +{ + .moduleInit = {0}, + .consDevDesc = &consUsbCdcDevDesc, +}; +// +// +/*** System Debug Initialization Data ***/ + +SYS_DEBUG_INIT debugInit = +{ + .moduleInit = {0}, + .errorLevel = SYS_ERROR_FATAL +}; +// +// +/******************************************************************************* + Device Control System Service Initialization Data +*/ + +const SYS_DEVCON_INIT sysDevconInit = +{ + .moduleInit = {0}, +}; + +// +// +/*** File System Initialization Data ***/ + +const SYS_FS_MEDIA_MOUNT_DATA sysfsMountTable[SYS_FS_VOLUME_NUMBER] = +{ + {NULL} +}; + + + +const SYS_FS_REGISTRATION_TABLE sysFSInit [ SYS_FS_MAX_FILE_SYSTEM_TYPE ] = +{ + { + .nativeFileSystemType = MPFS2, + .nativeFileSystemFunctions = &MPFSFunctions + } +}; + +// +// +/*** TMR Service Initialization Data ***/ +const SYS_TMR_INIT sysTmrInitData = +{ + .moduleInit = {SYS_MODULE_POWER_RUN_FULL}, + .drvIndex = DRV_TMR_INDEX_0, + .tmrFreq = 1000, +}; +// + +// ***************************************************************************** +// ***************************************************************************** +// Section: Library/Stack Initialization Data +// ***************************************************************************** +// ***************************************************************************** +// +// ***************************************************************************** +// ***************************************************************************** +// Section: TCPIP Data +// ***************************************************************************** +// ***************************************************************************** + +/*** ARP Service Initialization Data ***/ +const TCPIP_ARP_MODULE_CONFIG tcpipARPInitData = +{ + .cacheEntries = TCPIP_ARP_CACHE_ENTRIES, + .deleteOld = TCPIP_ARP_CACHE_DELETE_OLD, + .entrySolvedTmo = TCPIP_ARP_CACHE_SOLVED_ENTRY_TMO, + .entryPendingTmo = TCPIP_ARP_CACHE_PENDING_ENTRY_TMO, + .entryRetryTmo = TCPIP_ARP_CACHE_PENDING_RETRY_TMO, + .permQuota = TCPIP_ARP_CACHE_PERMANENT_QUOTA, + .purgeThres = TCPIP_ARP_CACHE_PURGE_THRESHOLD, + .purgeQuanta = TCPIP_ARP_CACHE_PURGE_QUANTA, + .retries = TCPIP_ARP_CACHE_ENTRY_RETRIES, + .gratProbeCount = TCPIP_ARP_GRATUITOUS_PROBE_COUNT, +}; + + +/*** Announce Discovery Initialization Data ***/ +const TCPIP_ANNOUNCE_MODULE_CONFIG tcpipAnnounceInitData = +{ +}; + +/*** UDP Sockets Initialization Data ***/ +const TCPIP_UDP_MODULE_CONFIG tcpipUDPInitData = +{ + .nSockets = TCPIP_UDP_MAX_SOCKETS, + .sktTxBuffSize = TCPIP_UDP_SOCKET_DEFAULT_TX_SIZE, +}; + +/*** TCP Sockets Initialization Data ***/ +const TCPIP_TCP_MODULE_CONFIG tcpipTCPInitData = +{ + .nSockets = TCPIP_TCP_MAX_SOCKETS, + .sktTxBuffSize = TCPIP_TCP_SOCKET_DEFAULT_TX_SIZE, + .sktRxBuffSize = TCPIP_TCP_SOCKET_DEFAULT_RX_SIZE, +}; + +/*** HTTP Server Initialization Data ***/ +const TCPIP_HTTP_MODULE_CONFIG tcpipHTTPInitData = +{ + .nConnections = TCPIP_HTTP_MAX_CONNECTIONS, + .nTlsConnections = TCPIP_HTTP_MAX_TLS_CONNECTIONS, + .dataLen = TCPIP_HTTP_MAX_DATA_LEN, + .sktTxBuffSize = TCPIP_HTTP_SKT_TX_BUFF_SIZE, + .sktRxBuffSize = TCPIP_HTTP_SKT_RX_BUFF_SIZE, + .tlsSktTxBuffSize = TCPIP_HTTP_TLS_SKT_TX_BUFF_SIZE, + .tlsSktRxBuffSize = TCPIP_HTTP_TLS_SKT_RX_BUFF_SIZE, + .configFlags = TCPIP_HTTP_CONFIG_FLAGS, +}; + + +/*** SNTP Client Initialization Data ***/ +const TCPIP_SNTP_MODULE_CONFIG tcpipSNTPInitData = +{ + .ntp_server = TCPIP_NTP_SERVER, + .ntp_interface = TCPIP_NTP_DEFAULT_IF, + .ntp_connection_type = TCPIP_NTP_DEFAULT_CONNECTION_TYPE, + .ntp_reply_timeout = TCPIP_NTP_REPLY_TIMEOUT, + .ntp_stamp_timeout = TCPIP_NTP_TIME_STAMP_TMO, + .ntp_success_interval = TCPIP_NTP_QUERY_INTERVAL, + .ntp_error_interval = TCPIP_NTP_FAST_QUERY_INTERVAL, +}; + + +/*** DHCP client Initialization Data ***/ +const TCPIP_DHCP_MODULE_CONFIG tcpipDHCPInitData = +{ + .dhcpEnable = TCPIP_DHCP_CLIENT_ENABLED, + .dhcpTmo = TCPIP_DHCP_TIMEOUT, + .dhcpCliPort = TCPIP_DHCP_CLIENT_CONNECT_PORT, + .dhcpSrvPort = TCPIP_DHCP_SERVER_LISTEN_PORT, + +}; + + + +/*** NBNS Server Initialization Data ***/ +const TCPIP_NBNS_MODULE_CONFIG tcpipNBNSInitData = +{ +}; + +/*** ETH MAC Initialization Data ***/ +const TCPIP_MODULE_MAC_PIC32INT_CONFIG tcpipMACPIC32INTInitData = +{ + .nTxDescriptors = TCPIP_EMAC_TX_DESCRIPTORS, + .rxBuffSize = TCPIP_EMAC_RX_BUFF_SIZE, + .nRxDescriptors = TCPIP_EMAC_RX_DESCRIPTORS, + .nRxDedicatedBuffers = TCPIP_EMAC_RX_DEDICATED_BUFFERS, + .nRxInitBuffers = TCPIP_EMAC_RX_INIT_BUFFERS, + .rxLowThreshold = TCPIP_EMAC_RX_LOW_THRESHOLD, + .rxLowFill = TCPIP_EMAC_RX_LOW_FILL, + .ethFlags = TCPIP_EMAC_ETH_OPEN_FLAGS, + .phyFlags = TCPIP_EMAC_PHY_CONFIG_FLAGS, + .linkInitDelay = TCPIP_EMAC_PHY_LINK_INIT_DELAY, + .phyAddress = TCPIP_EMAC_PHY_ADDRESS, + .pPhyObject = &DRV_ETHPHY_OBJECT_SMSC_LAN8740, + .pPhyBase = &DRV_ETHPHY_OBJECT_BASE_Default, +}; + + + +/*** Zeroconfig initialization data ***/ +const ZCLL_MODULE_CONFIG tcpipZCLLInitData = +{ +}; + + + + +/*** DNS Client Initialization Data ***/ +const TCPIP_DNS_CLIENT_MODULE_CONFIG tcpipDNSClientInitData = +{ + .deleteOldLease = TCPIP_DNS_CLIENT_DELETE_OLD_ENTRIES, + .cacheEntries = TCPIP_DNS_CLIENT_CACHE_ENTRIES, + .entrySolvedTmo = TCPIP_DNS_CLIENT_CACHE_ENTRY_TMO, + .nIPv4Entries = TCPIP_DNS_CLIENT_CACHE_PER_IPV4_ADDRESS, + .ipAddressType = TCPIP_DNS_CLIENT_ADDRESS_TYPE, + .nIPv6Entries = TCPIP_DNS_CLIENT_CACHE_PER_IPV6_ADDRESS, +}; + + + + +TCPIP_STACK_HEAP_INTERNAL_CONFIG tcpipHeapConfig = +{ + .heapType = TCPIP_STACK_HEAP_TYPE_INTERNAL_HEAP, + .heapFlags = TCPIP_STACK_HEAP_USE_FLAGS, + .heapUsage = TCPIP_STACK_HEAP_USAGE_CONFIG, + .malloc_fnc = TCPIP_STACK_MALLOC_FUNC, + .calloc_fnc = TCPIP_STACK_CALLOC_FUNC, + .free_fnc = TCPIP_STACK_FREE_FUNC, + .heapSize = TCPIP_STACK_DRAM_SIZE, +}; + +TCPIP_NETWORK_CONFIG __attribute__((unused)) TCPIP_HOSTS_CONFIGURATION[] = +{ +/*** Network Configuration Index 0 ***/ + { + TCPIP_NETWORK_DEFAULT_INTERFACE_NAME, // interface + TCPIP_NETWORK_DEFAULT_HOST_NAME, // hostName + TCPIP_NETWORK_DEFAULT_MAC_ADDR, // macAddr + TCPIP_NETWORK_DEFAULT_IP_ADDRESS, // ipAddr + TCPIP_NETWORK_DEFAULT_IP_MASK, // ipMask + TCPIP_NETWORK_DEFAULT_GATEWAY, // gateway + TCPIP_NETWORK_DEFAULT_DNS, // priDNS + TCPIP_NETWORK_DEFAULT_SECOND_DNS, // secondDNS + TCPIP_NETWORK_DEFAULT_POWER_MODE, // powerMode + TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS, // startFlags + &TCPIP_NETWORK_DEFAULT_MAC_DRIVER, // pMacObject + }, +}; + +const TCPIP_STACK_MODULE_CONFIG TCPIP_STACK_MODULE_CONFIG_TBL [] = +{ + {TCPIP_MODULE_IPV4, 0}, + {TCPIP_MODULE_ARP, &tcpipARPInitData}, // TCPIP_MODULE_ARP + {TCPIP_MODULE_UDP, &tcpipUDPInitData}, // TCPIP_MODULE_UDP, + {TCPIP_MODULE_TCP, &tcpipTCPInitData}, // TCPIP_MODULE_TCP, + {TCPIP_MODULE_DHCP_CLIENT, &tcpipDHCPInitData}, // TCPIP_MODULE_DHCP_CLIENT, + {TCPIP_MODULE_ANNOUNCE, &tcpipAnnounceInitData}, // TCPIP_MODULE_ANNOUNCE, + {TCPIP_MODULE_DNS_CLIENT,&tcpipDNSClientInitData}, // TCPIP_MODULE_DNS_CLIENT, + {TCPIP_MODULE_NBNS, &tcpipNBNSInitData}, // TCPIP_MODULE_NBNS + {TCPIP_MODULE_SNTP, &tcpipSNTPInitData}, // TCPIP_MODULE_SNTP, + + {TCPIP_MODULE_HTTP_SERVER, &tcpipHTTPInitData}, // TCPIP_MODULE_HTTP_SERVER, + {TCPIP_MODULE_ZCLL, 0}, // TCPIP_MODULE_ZCLL, + {TCPIP_MODULE_MDNS, 0}, // TCPIP_MODULE_MDNS, + { TCPIP_MODULE_MANAGER, & tcpipHeapConfig }, // TCPIP_MODULE_MANAGER + // MAC modules + {TCPIP_MODULE_MAC_PIC32INT, &tcpipMACPIC32INTInitData}, // TCPIP_MODULE_MAC_PIC32INT + +}; + +/********************************************************************* + * Function: SYS_MODULE_OBJ TCPIP_STACK_Init() + * + * PreCondition: None + * + * Input: + * + * Output: valid system module object if Stack and its componets are initialized + * SYS_MODULE_OBJ_INVALID otherwise + * + * Overview: The function starts the initialization of the stack. + * If an error occurs, the SYS_ERROR() is called + * and the function de-initialize itself and will return false. + * + * Side Effects: None + * + * Note: This function must be called before any of the + * stack or its component routines are used. + * + ********************************************************************/ + +char hostNameTest[11] = "xxxxxx_ECM\0"; + +SYS_MODULE_OBJ TCPIP_STACK_Init() +{ + TCPIP_STACK_INIT tcpipInit; + + //Modifying the host name real time to include unique mac address, may cause issues with stack + sprintf((char *)&hostNameTest, "%02X%02X%02X_IoT-E", EMAC1SA1bits.STNADDR4, EMAC1SA0bits.STNADDR5, EMAC1SA0bits.STNADDR6); + TCPIP_HOSTS_CONFIGURATION[0].hostName = hostNameTest; + + tcpipInit.moduleInit.sys.powerState = SYS_MODULE_POWER_RUN_FULL; + tcpipInit.pNetConf = TCPIP_HOSTS_CONFIGURATION; + tcpipInit.nNets = sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION); + tcpipInit.pModConfig = TCPIP_STACK_MODULE_CONFIG_TBL; + tcpipInit.nModules = sizeof (TCPIP_STACK_MODULE_CONFIG_TBL) / sizeof (*TCPIP_STACK_MODULE_CONFIG_TBL); + + return TCPIP_STACK_Initialize(0, &tcpipInit.moduleInit); +} +// +// + + +/************************************************** + * USB Device Function Driver Init Data + **************************************************/ + const USB_DEVICE_CDC_INIT cdcInit0 = + { + .queueSizeRead = 1, + .queueSizeWrite = 128, + .queueSizeSerialStateNotification = 1 + }; +/************************************************** + * USB Device Layer Function Driver Registration + * Table + **************************************************/ +const USB_DEVICE_FUNCTION_REGISTRATION_TABLE funcRegistrationTable[1] = +{ + /* Function 1 */ + { + .configurationValue = 1, /* Configuration value */ + .interfaceNumber = 0, /* First interfaceNumber of this function */ + .speed = USB_SPEED_HIGH|USB_SPEED_FULL, /* Function Speed */ + .numberOfInterfaces = 2, /* Number of interfaces */ + .funcDriverIndex = 0, /* Index of CDC Function Driver */ + .driver = (void*)USB_DEVICE_CDC_FUNCTION_DRIVER, /* USB CDC function data exposed to device layer */ + .funcDriverInit = (void*)&cdcInit0 /* Function driver init data */ + }, +}; + +/******************************************* + * USB Device Layer Descriptors + *******************************************/ +/******************************************* + * USB Device Descriptor + *******************************************/ +const USB_DEVICE_DESCRIPTOR deviceDescriptor = +{ + 0x12, // Size of this descriptor in bytes + USB_DESCRIPTOR_DEVICE, // DEVICE descriptor type + 0x0200, // USB Spec Release Number in BCD format + USB_CDC_CLASS_CODE, // Class Code + USB_CDC_SUBCLASS_CODE, // Subclass code + 0x00, // Protocol code + USB_DEVICE_EP0_BUFFER_SIZE, // Max packet size for EP0, see system_config.h + 0x04D8, // Vendor ID + 0x000A, // Product ID + 0x0100, // Device release number in BCD format + 0x01, // Manufacturer string index + 0x02, // Product string index + 0x00, // Device serial number string index + 0x01 // Number of possible configurations +}; + +/******************************************* + * USB Device Qualifier Descriptor for this + * demo. + *******************************************/ +const USB_DEVICE_QUALIFIER deviceQualifierDescriptor1 = +{ + 0x0A, // Size of this descriptor in bytes + USB_DESCRIPTOR_DEVICE_QUALIFIER, // Device Qualifier Type + 0x0200, // USB Specification Release number + USB_CDC_CLASS_CODE, // Class Code + USB_CDC_SUBCLASS_CODE, // Subclass code + 0x00, // Protocol code + USB_DEVICE_EP0_BUFFER_SIZE, // Maximum packet size for endpoint 0 + 0x01, // Number of possible configurations + 0x00 // Reserved for future use. +}; + +/******************************************* + * USB High Speed Configuration Descriptor + *******************************************/ + +const uint8_t highSpeedConfigurationDescriptor[]= +{ + /* Configuration Descriptor */ + + 0x09, // Size of this descriptor in bytes + USB_DESCRIPTOR_CONFIGURATION, // Descriptor Type + 67,0, //(67 Bytes)Size of the Config descriptor.e + 2, // Number of interfaces in this cfg + 0x01, // Index value of this configuration + 0x00, // Configuration string index + USB_ATTRIBUTE_DEFAULT | USB_ATTRIBUTE_SELF_POWERED, // Attributes + 50, // Max power consumption (2X mA) + + /* Descriptor for Function 1 - CDC */ + + /* Interface Descriptor */ + + 0x09, // Size of this descriptor in bytes + USB_DESCRIPTOR_INTERFACE, // Descriptor Type + 0, // Interface Number + 0x00, // Alternate Setting Number + 0x01, // Number of endpoints in this interface + USB_CDC_COMMUNICATIONS_INTERFACE_CLASS_CODE, // Class code + USB_CDC_SUBCLASS_ABSTRACT_CONTROL_MODEL, // Subclass code + USB_CDC_PROTOCOL_AT_V250, // Protocol code + 0x00, // Interface string index + + /* CDC Class-Specific Descriptors */ + + sizeof(USB_CDC_HEADER_FUNCTIONAL_DESCRIPTOR), // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_HEADER, // Type of functional descriptor + 0x20,0x01, // CDC spec version + + sizeof(USB_CDC_ACM_FUNCTIONAL_DESCRIPTOR), // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_ABSTRACT_CONTROL_MANAGEMENT, // Type of functional descriptor + USB_CDC_ACM_SUPPORT_LINE_CODING_LINE_STATE_AND_NOTIFICATION,// bmCapabilities of ACM + + sizeof(USB_CDC_UNION_FUNCTIONAL_DESCRIPTOR_HEADER) + 1, // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_UNION, // Type of functional descriptor + 0, // com interface number + 1, + + sizeof(USB_CDC_CALL_MANAGEMENT_DESCRIPTOR), // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_CALL_MANAGEMENT, // Type of functional descriptor + 0x00, // bmCapabilities of CallManagement + 1, // Data interface number + + /* Interrupt Endpoint (IN)Descriptor */ + + 0x07, // Size of this descriptor + USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor + 1| USB_EP_DIRECTION_IN, // EndpointAddress ( EP1 IN INTERRUPT) + USB_TRANSFER_TYPE_INTERRUPT, // Attributes type of EP (INTERRUPT) + 0x10,0x00, // Max packet size of this EP + 0x02, // Interval (in ms) + + /* Interface Descriptor */ + + 0x09, // Size of this descriptor in bytes + USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type + 1, // Interface Number + 0x00, // Alternate Setting Number + 0x02, // Number of endpoints in this interface + USB_CDC_DATA_INTERFACE_CLASS_CODE, // Class code + 0x00, // Subclass code + USB_CDC_PROTOCOL_NO_CLASS_SPECIFIC, // Protocol code + 0x00, // Interface string index + + /* Bulk Endpoint (OUT)Descriptor */ + + 0x07, // Size of this descriptor + USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor + 2|USB_EP_DIRECTION_OUT, // EndpointAddress ( EP2 OUT) + USB_TRANSFER_TYPE_BULK, // Attributes type of EP (BULK) + 0x00, 0x02, // Max packet size of this EP + 0x00, // Interval (in ms) + + /* Bulk Endpoint (IN)Descriptor */ + + 0x07, // Size of this descriptor + USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor + 2|USB_EP_DIRECTION_IN, // EndpointAddress ( EP2 IN ) + 0x02, // Attributes type of EP (BULK) + 0x00, 0x02, // Max packet size of this EP + 0x00, // Interval (in ms) + +}; + +/******************************************* + * Array of High speed config descriptors + *******************************************/ +USB_DEVICE_CONFIGURATION_DESCRIPTORS_TABLE highSpeedConfigDescSet[1] = +{ + highSpeedConfigurationDescriptor +}; + +/******************************************* + * USB Full Speed Configuration Descriptor + *******************************************/ +const uint8_t fullSpeedConfigurationDescriptor[]= +{ + /* Configuration Descriptor */ + + 0x09, // Size of this descriptor in bytes + USB_DESCRIPTOR_CONFIGURATION, // Descriptor Type + 67,0, //(67 Bytes)Size of the Config descriptor.e + 2, // Number of interfaces in this cfg + 0x01, // Index value of this configuration + 0x00, // Configuration string index + USB_ATTRIBUTE_DEFAULT | USB_ATTRIBUTE_SELF_POWERED, // Attributes + 50, // Max power consumption (2X mA) + /* Descriptor for Function 1 - CDC */ + + /* Interface Descriptor */ + + 0x09, // Size of this descriptor in bytes + USB_DESCRIPTOR_INTERFACE, // Descriptor Type + 0, // Interface Number + 0x00, // Alternate Setting Number + 0x01, // Number of endpoints in this interface + USB_CDC_COMMUNICATIONS_INTERFACE_CLASS_CODE, // Class code + USB_CDC_SUBCLASS_ABSTRACT_CONTROL_MODEL, // Subclass code + USB_CDC_PROTOCOL_AT_V250, // Protocol code + 0x00, // Interface string index + + /* CDC Class-Specific Descriptors */ + + sizeof(USB_CDC_HEADER_FUNCTIONAL_DESCRIPTOR), // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_HEADER, // Type of functional descriptor + 0x20,0x01, // CDC spec version + + sizeof(USB_CDC_ACM_FUNCTIONAL_DESCRIPTOR), // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_ABSTRACT_CONTROL_MANAGEMENT, // Type of functional descriptor + USB_CDC_ACM_SUPPORT_LINE_CODING_LINE_STATE_AND_NOTIFICATION,// bmCapabilities of ACM + + sizeof(USB_CDC_UNION_FUNCTIONAL_DESCRIPTOR_HEADER) + 1, // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_UNION, // Type of functional descriptor + 0, // com interface number + 1, + + sizeof(USB_CDC_CALL_MANAGEMENT_DESCRIPTOR), // Size of the descriptor + USB_CDC_DESC_CS_INTERFACE, // CS_INTERFACE + USB_CDC_FUNCTIONAL_CALL_MANAGEMENT, // Type of functional descriptor + 0x00, // bmCapabilities of CallManagement + 1, // Data interface number + + /* Interrupt Endpoint (IN)Descriptor */ + + 0x07, // Size of this descriptor + USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor + 1| USB_EP_DIRECTION_IN, // EndpointAddress ( EP1 IN INTERRUPT) + USB_TRANSFER_TYPE_INTERRUPT, // Attributes type of EP (INTERRUPT) + 0x10,0x00, // Max packet size of this EP + 0x02, // Interval (in ms) + + /* Interface Descriptor */ + + 0x09, // Size of this descriptor in bytes + USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type + 1, // Interface Number + 0x00, // Alternate Setting Number + 0x02, // Number of endpoints in this interface + USB_CDC_DATA_INTERFACE_CLASS_CODE, // Class code + 0x00, // Subclass code + USB_CDC_PROTOCOL_NO_CLASS_SPECIFIC, // Protocol code + 0x00, // Interface string index + + /* Bulk Endpoint (OUT)Descriptor */ + + 0x07, // Size of this descriptor + USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor + 2|USB_EP_DIRECTION_OUT, // EndpointAddress ( EP2 OUT) + USB_TRANSFER_TYPE_BULK, // Attributes type of EP (BULK) + 0x40,0x00, // Max packet size of this EP + 0x00, // Interval (in ms) + + /* Bulk Endpoint (IN)Descriptor */ + + 0x07, // Size of this descriptor + USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor + 2|USB_EP_DIRECTION_IN, // EndpointAddress ( EP2 IN ) + 0x02, // Attributes type of EP (BULK) + 0x40,0x00, // Max packet size of this EP + 0x00, // Interval (in ms) + + +}; + +/******************************************* + * Array of Full speed config descriptors + *******************************************/ +USB_DEVICE_CONFIGURATION_DESCRIPTORS_TABLE fullSpeedConfigDescSet[1] = +{ + fullSpeedConfigurationDescriptor +}; + + +/************************************** + * String descriptors. + *************************************/ + + /******************************************* + * Language code string descriptor + *******************************************/ + const struct + { + uint8_t bLength; + uint8_t bDscType; + uint16_t string[1]; + } + sd000 = + { + sizeof(sd000), // Size of this descriptor in bytes + USB_DESCRIPTOR_STRING, // STRING descriptor type + {0x0409} // Language ID + }; +/******************************************* + * Manufacturer string descriptor + *******************************************/ + const struct + { + uint8_t bLength; // Size of this descriptor in bytes + uint8_t bDscType; // STRING descriptor type + uint16_t string[25]; // String + } + sd001 = + { + sizeof(sd001), + USB_DESCRIPTOR_STRING, + {'M','i','c','r','o','c','h','i','p',' ','T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'} + + }; + +/******************************************* + * Product string descriptor + *******************************************/ + const struct + { + uint8_t bLength; // Size of this descriptor in bytes + uint8_t bDscType; // STRING descriptor type + uint16_t string[22]; // String + } + sd002 = + { + sizeof(sd002), + USB_DESCRIPTOR_STRING, + {'S','i','m','p','l','e',' ','C','D','C',' ','D','e','v','i','c','e',' ','D','e','m','o'} + }; + +/*************************************** + * Array of string descriptors + ***************************************/ +USB_DEVICE_STRING_DESCRIPTORS_TABLE stringDescriptors[3]= +{ + (const uint8_t *const)&sd000, + (const uint8_t *const)&sd001, + (const uint8_t *const)&sd002 +}; + +/******************************************* + * USB Device Layer Master Descriptor Table + *******************************************/ +const USB_DEVICE_MASTER_DESCRIPTOR usbMasterDescriptor = +{ + &deviceDescriptor, /* Full speed descriptor */ + 1, /* Total number of full speed configurations available */ + fullSpeedConfigDescSet, /* Pointer to array of full speed configurations descriptors*/ + &deviceDescriptor, /* High speed device descriptor*/ + 1, /* Total number of high speed configurations available */ + highSpeedConfigDescSet, /* Pointer to array of high speed configurations descriptors. */ + 3, // Total number of string descriptors available. + stringDescriptors, // Pointer to array of string descriptors. + &deviceQualifierDescriptor1,// Pointer to full speed dev qualifier. + &deviceQualifierDescriptor1 // Pointer to high speed dev qualifier. +}; + + +/**************************************************** + * USB Device Layer Initialization Data + ****************************************************/ +const USB_DEVICE_INIT usbDevInitData = +{ + /* System module initialization */ + .moduleInit = {SYS_MODULE_POWER_RUN_FULL}, + + /* Number of function drivers registered to this instance of the + USB device layer */ + .registeredFuncCount = 1, + + /* Function driver table registered to this instance of the USB device layer*/ + .registeredFunctions = (USB_DEVICE_FUNCTION_REGISTRATION_TABLE*)funcRegistrationTable, + + /* Pointer to USB Descriptor structure */ + .usbMasterDescriptor = (USB_DEVICE_MASTER_DESCRIPTOR*)&usbMasterDescriptor, + + /* USB Device Speed */ + .deviceSpeed = USB_SPEED_HIGH, + + /* Index of the USB Driver to be used by this Device Layer Instance */ + .driverIndex = DRV_USBHS_INDEX_0, + + /* Pointer to the USB Driver Functions. */ + .usbDriverInterface = DRV_USBHS_DEVICE_INTERFACE, + +}; +// + +// ***************************************************************************** +// ***************************************************************************** +// Section: Static Initialization Functions +// ***************************************************************************** +// ***************************************************************************** + + +// ***************************************************************************** +// ***************************************************************************** +// Section: System Initialization +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void SYS_Initialize ( void *data ) + + Summary: + Initializes the board, services, drivers, application and other modules. + + Remarks: + See prototype in system/common/sys_module.h. + */ + +void SYS_Initialize ( void* data ) +{ + /* Core Processor Initialization */ + SYS_CLK_Initialize( NULL ); + sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit); + SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet()); + SYS_PORTS_Initialize(); + + /* Initialize Drivers */ + + /* Initialize ADC */ + DRV_ADC_Initialize(); + + /*Initialize CMP/CVREF */ + DRV_CMP_Initialize(); + /* Configure the Flash Controller Interrupt Priority */ + SYS_INT_VectorPrioritySet(INT_VECTOR_FLASH, INT_PRIORITY_LEVEL3); + + /* Configure the Flash Controller Interrupt Sub Priority */ + SYS_INT_VectorSubprioritySet(INT_VECTOR_FLASH, INT_SUBPRIORITY_LEVEL0); + + /* Initialize the NVM Driver */ + sysObj.drvNvm = DRV_NVM_Initialize(DRV_NVM_INDEX_0, (SYS_MODULE_INIT *)&drvNvmInit); + + sysObj.drvTmr0 = DRV_TMR_Initialize(DRV_TMR_INDEX_0, (SYS_MODULE_INIT *)&drvTmr0InitData); + + SYS_INT_VectorPrioritySet(INT_VECTOR_T2, INT_PRIORITY_LEVEL1); + SYS_INT_VectorSubprioritySet(INT_VECTOR_T2, INT_SUBPRIORITY_LEVEL0); + + + /* Initialize USB Driver */ + sysObj.drvUSBObject = DRV_USBHS_Initialize(DRV_USBHS_INDEX_0, (SYS_MODULE_INIT *) &drvUSBInit); + + /* Initialize System Services */ + + /*** Command Service Initialization Code ***/ + SYS_CMD_Initialize((SYS_MODULE_INIT*)&sysCmdInit); + sysObj.sysConsole0 = SYS_CONSOLE_Initialize(SYS_CONSOLE_INDEX_0, (SYS_MODULE_INIT *)&consUsbInit0); + + + /*** Debug Service Initialization Code ***/ + sysObj.sysDebug = SYS_DEBUG_Initialize(SYS_DEBUG_INDEX_0, (SYS_MODULE_INIT*)&debugInit); + + /*** File System Service Initialization Code ***/ + SYS_FS_Initialize( (const void *) sysFSInit ); + + /*** Interrupt Service Initialization Code ***/ + SYS_INT_Initialize(); + + /*** Random Service Initialization Code ***/ + SYS_RANDOM_Initialize(0, 0); + + /*** TMR Service Initialization Code ***/ + sysObj.sysTmr = SYS_TMR_Initialize(SYS_TMR_INDEX_0, (const SYS_MODULE_INIT * const)&sysTmrInitData); + + /* Initialize Middleware */ + sysObj.netPres = NET_PRES_Initialize(0, (SYS_MODULE_INIT*)&netPresInitData); + + /* set priority for ETHERNET interrupt source */ + SYS_INT_VectorPrioritySet(INT_VECTOR_ETH, INT_PRIORITY_LEVEL5); + + /* set sub-priority for ETHERNET interrupt source */ + SYS_INT_VectorSubprioritySet(INT_VECTOR_ETH, INT_SUBPRIORITY_LEVEL3); + + /* TCPIP Stack Initialization */ + sysObj.tcpip = TCPIP_STACK_Init(); + if (sysObj.tcpip == SYS_MODULE_OBJ_INVALID) + { + return; + } + + /* Set priority of USB interrupt source */ + SYS_INT_VectorPrioritySet(INT_VECTOR_USB1, INT_PRIORITY_LEVEL4); + + /* Set Sub-priority of USB interrupt source */ + SYS_INT_VectorSubprioritySet(INT_VECTOR_USB1, INT_SUBPRIORITY_LEVEL0); + + /* Set the priority of the USB DMA Interrupt */ + SYS_INT_VectorPrioritySet(INT_VECTOR_USB1_DMA, INT_PRIORITY_LEVEL4); + + /* Set Sub-priority of the USB DMA Interrupt */ + SYS_INT_VectorSubprioritySet(INT_VECTOR_USB1_DMA, INT_SUBPRIORITY_LEVEL0); + + + /* Initialize the USB device layer */ + sysObj.usbDevObject0 = USB_DEVICE_Initialize (USB_DEVICE_INDEX_0 , ( SYS_MODULE_INIT* ) & usbDevInitData); + + + /* Initialize the Application */ + APP_Initialize(); + APP1_Initialize(); +} + + +/******************************************************************************* + End of File +*/ + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt.c new file mode 100644 index 0000000..027e395 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt.c @@ -0,0 +1,142 @@ +/******************************************************************************* + System Interrupts File + + File Name: + system_interrupt.c + + Summary: + Raw ISR definitions. + + Description: + This file contains a definitions of the raw ISRs required to support the + interrupt sub-system. + + Summary: + This file contains source code for the interrupt vector functions in the + system. + + Description: + This file contains source code for the interrupt vector functions in the + system. It implements the system and part specific vector "stub" functions + from which the individual "Tasks" functions are called for any modules + executing interrupt-driven in the MPLAB Harmony system. + + Remarks: + This file requires access to the systemObjects global data structure that + contains the object handles to all MPLAB Harmony module objects executing + interrupt-driven in the system. These handles are passed into the individual + module "Tasks" functions to identify the instance of the module to maintain. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2011-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include +#include +#include "app.h" +#include "app1.h" +#include "system_definitions.h" +#include "peripheral/cmp/plib_cmp.h" + + +// ***************************************************************************** +// ***************************************************************************** +// Section: System Interrupt Vector Functions +// ***************************************************************************** +// ***************************************************************************** + + + +extern APP1_DATA app1Data; + +void IntHandlerDrvTmrInstance0(void) +{ + DRV_TMR_Tasks(sysObj.drvTmr0); +} + +void IntHandlerDrvNvm (void) + +{ + DRV_NVM_Tasks(sysObj.drvNvm); + +} + + +void IntHandlerDrvCMPInstance0(void) +{ + if(app1Data.currIsLVD){ + app1Data.currIsLVD = false; + PLIB_CMP_InterruptEventSelect(CMP_ID_2, CMP_INTERRUPT_GENERATION_HIGH_TO_LOW); + PLIB_CMP_CVREF_ValueSelect(CMP_ID_1, CMP_CVREF_VALUE_13); + } else{ + app1Data.currIsLVD = true; + PLIB_CMP_InterruptEventSelect(CMP_ID_2, CMP_INTERRUPT_GENERATION_LOW_TO_HIGH); + PLIB_CMP_CVREF_ValueSelect(CMP_ID_1, CMP_CVREF_VALUE_11); + } + PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_COMPARATOR_2); +} + + + + +void IntHandlerUSBInstance0(void) +{ + DRV_USBHS_Tasks_ISR(sysObj.drvUSBObject); +} + +void IntHandlerUSBInstance0_USBDMA ( void ) +{ + DRV_USBHS_Tasks_ISR_USBDMA(sysObj.drvUSBObject); +} + + +void IntHandler_ETHMAC(void) +{ + DRV_ETHMAC_Tasks_ISR((SYS_MODULE_OBJ)0); +} + +/* This function is used by ETHMAC driver */ +bool SYS_INT_SourceRestore(INT_SOURCE src, int level) +{ + if(level) + { + SYS_INT_SourceEnable(src); + } + + return level; +} + + + +/******************************************************************************* + End of File +*/ + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt_a.S b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt_a.S new file mode 100644 index 0000000..3438ee8 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_interrupt_a.S @@ -0,0 +1,184 @@ +/******************************************************************************* + System Interrupt Source File + + File Name: + sys_interrupt_a.S + + Summary: + Raw ISR definitions. + + Description: + This file contains a definitions of the raw ISRs required to support the + interrupt sub-system. +*******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2011-2014 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END +/* +********************************************************************************************************* +* INCLUDES +********************************************************************************************************* +*/ +#include + + + +#include "ISR_Support.h" + + + +/* TMR Instance 0 Interrupt */ + .extern IntHandlerDrvTmrInstance0 + + .section .vector_9,code, keep + .equ __vector_dispatch_9, IntVectorDrvTmrInstance0 + .global __vector_dispatch_9 + .set nomicromips + .set noreorder + .set nomips16 + .set noat + .ent IntVectorDrvTmrInstance0 + +IntVectorDrvTmrInstance0: + portSAVE_CONTEXT + la s6, IntHandlerDrvTmrInstance0 + jalr s6 + nop + portRESTORE_CONTEXT + .end IntVectorDrvTmrInstance0 + + + +/* NVM Interrupt */ + .extern IntHandlerDrvNvm + + .section .vector_167,code, keep + .equ __vector_dispatch_167, IntVectorDrvNvm + .global __vector_dispatch_167 + .set nomicromips + .set noreorder + .set nomips16 + .set noat + .ent IntVectorDrvNvm + +IntVectorDrvNvm: + portSAVE_CONTEXT + la s6, IntHandlerDrvNvm + jalr s6 + nop + portRESTORE_CONTEXT + .end IntVectorDrvNvm + + +/* CMP Instance 0 Interrupt */ + .extern IntHandlerDrvCMPInstance0 + + .section .vector_131,code, keep + .equ __vector_dispatch_131, IntVectorDrvCMPInstance0 + .global __vector_dispatch_131 + .set nomicromips + .set noreorder + .set nomips16 + .set noat + .ent IntVectorDrvCMPInstance0 + +IntVectorDrvCMPInstance0: + portSAVE_CONTEXT + la s6, IntHandlerDrvCMPInstance0 + jalr s6 + nop + portRESTORE_CONTEXT + .end IntVectorDrvCMPInstance0 + + + +/* USB Device Interrupt */ + .extern IntHandlerUSBInstance0 + + .section .vector_132,code, keep + .equ __vector_dispatch_132, IntVectorUSBInstance0 + .global __vector_dispatch_132 + .set nomicromips + .set noreorder + .set nomips16 + .set noat + .ent IntVectorUSBInstance0 + +IntVectorUSBInstance0: + portSAVE_CONTEXT + la s6, IntHandlerUSBInstance0 + jalr s6 + nop + portRESTORE_CONTEXT + .end IntVectorUSBInstance0 + + + .extern IntHandlerUSBInstance0_USBDMA + + .section .vector_133,code, keep + .equ __vector_dispatch_133, IntVectorUSBInstance0_USBDMA + .global __vector_dispatch_133 + .set nomicromips + .set noreorder + .set nomips16 + .set noat + .ent IntVectorUSBInstance0_USBDMA + +IntVectorUSBInstance0_USBDMA: + portSAVE_CONTEXT + la s6, IntHandlerUSBInstance0_USBDMA + jalr s6 + nop + portRESTORE_CONTEXT + .end IntVectorUSBInstance0_USBDMA + + + +/* ETHMAC Interrupt */ + .extern IntHandler_ETHMAC + + .section .vector_153,code, keep + .equ __vector_dispatch_153, IntVector_ETHMAC + .global __vector_dispatch_153 + .set nomicromips + .set noreorder + .set nomips16 + .set noat + .ent IntVector_ETHMAC + +IntVector_ETHMAC: + portSAVE_CONTEXT + la s6, IntHandler_ETHMAC + jalr s6 + nop + portRESTORE_CONTEXT + .end IntVector_ETHMAC + + + +/******************************************************************************* + End of File + */ + diff --git a/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_tasks.c b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_tasks.c new file mode 100644 index 0000000..a7332f4 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/system_config/IoT-Ethernet/system_tasks.c @@ -0,0 +1,195 @@ +/******************************************************************************* + System Tasks File + + File Name: + system_tasks.c + + Summary: + This file contains source code necessary to maintain system's polled state + machines. + + Description: + This file contains source code necessary to maintain system's polled state + machines. It implements the "SYS_Tasks" function that calls the individual + "Tasks" functions for all the MPLAB Harmony modules in the system. + + Remarks: + This file requires access to the systemObjects global data structure that + contains the object handles to all MPLAB Harmony module objects executing + polled in the system. These handles are passed into the individual module + "Tasks" functions to identify the instance of the module to maintain. + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +Copyright (c) 2013-2015 released Microchip Technology Inc. All rights reserved. + +Microchip licenses to you the right to use, modify, copy and distribute +Software only when embedded on a Microchip microcontroller or digital signal +controller that is integrated into your product or third party product +(pursuant to the sublicense terms in the accompanying license agreement). + +You should refer to the license agreement accompanying this Software for +additional information regarding your rights and obligations. + +SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF +MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. +IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER +CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR +OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + *******************************************************************************/ +// DOM-IGNORE-END + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Included Files +// ***************************************************************************** +// ***************************************************************************** + +#include "system_config.h" +#include "system_definitions.h" +#include "app.h" +#include "app1.h" + + +// ***************************************************************************** +// ***************************************************************************** +// Section: Local Prototypes +// ***************************************************************************** +// ***************************************************************************** + + + +static void _SYS_Tasks ( void ); + +static void _APP_Tasks(void); +static void _APP1_Tasks(void); + + +// ***************************************************************************** +// ***************************************************************************** +// Section: System "Tasks" Routine +// ***************************************************************************** +// ***************************************************************************** + +/******************************************************************************* + Function: + void SYS_Tasks ( void ) + + Remarks: + See prototype in system/common/sys_module.h. +*/ + +void SYS_Tasks ( void ) +{ + /* Create OS Thread for Sys Tasks. */ + xTaskCreate((TaskFunction_t) _SYS_Tasks, + "Sys Tasks", + 4096, NULL, 2, NULL); + + + /* Create OS Thread for APP Tasks. */ + xTaskCreate((TaskFunction_t) _APP_Tasks, + "APP Tasks", + 2048, NULL, 1, NULL); + + /* Create OS Thread for APP1 Tasks. */ + xTaskCreate((TaskFunction_t) _APP1_Tasks, + "APP1 Tasks", + 512, NULL, 2, NULL); + + /************** + * Start RTOS * + **************/ + vTaskStartScheduler(); /* This function never returns. */ +} + + +/******************************************************************************* + Function: + void _SYS_Tasks ( void ) + + Summary: + Maintains state machines of system modules. +*/ +static void _SYS_Tasks ( void) +{ + while(1) + { + /* Maintain system services */ + SYS_DEVCON_Tasks(sysObj.sysDevcon); + /* Maintain the file system state machine. */ + SYS_FS_Tasks(); + SYS_CONSOLE_Tasks(sysObj.sysConsole0); + /* SYS_COMMAND layer tasks routine */ + SYS_CMD_Tasks(); + /* SYS_TMR Device layer tasks routine */ + SYS_TMR_Tasks(sysObj.sysTmr); + + /* Maintain Device Drivers */ + + /* Maintain Middleware */ + NET_PRES_Tasks(sysObj.netPres); + + /* USB HS Driver Task Routine */ + DRV_USBHS_Tasks(sysObj.drvUSBObject); + + /* USB Device layer tasks routine */ + USB_DEVICE_Tasks(sysObj.usbDevObject0); + + /* Maintain the TCP/IP Stack*/ + TCPIP_STACK_Task(sysObj.tcpip); + + /* Task Delay */ + vTaskDelay(1 / portTICK_PERIOD_MS); + } +} + + + +/******************************************************************************* + Function: + void _APP_Tasks ( void ) + + Summary: + Maintains state machine of APP. +*/ + +static void _APP_Tasks(void) +{ + while(1) + { + APP_Tasks(); + vTaskDelay(1 / portTICK_PERIOD_MS); + } +} + + +/******************************************************************************* + Function: + void _APP1_Tasks ( void ) + + Summary: + Maintains state machine of APP1. +*/ + +static void _APP1_Tasks(void) +{ + while(1) + { + APP1_Tasks(); + vTaskDelay(10 / portTICK_PERIOD_MS); + } +} + + +/******************************************************************************* + End of File + */ + diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/include.am b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/include.am new file mode 100755 index 0000000..385b644 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/include.am @@ -0,0 +1,14 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + + +lib_LTLIBRARIES+= src/libwolfmqtt.la +src_libwolfmqtt_la_SOURCES = src/mqtt_client.c \ + src/mqtt_packet.c \ + src/mqtt_socket.c +src_libwolfmqtt_la_CFLAGS = -DBUILDING_WOLFMQTT $(AM_CFLAGS) +src_libwolfmqtt_la_CPPFLAGS = -DBUILDING_WOLFMQTT $(AM_CPPFLAGS) +src_libwolfmqtt_la_LDFLAGS = ${AM_LDFLAGS} -no-undefined -version-info ${WOLFMQTT_LIBRARY_VERSION} +src_libwolfmqtt_la_DEPENDENCIES = +EXTRA_DIST += diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_client.c b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_client.c new file mode 100755 index 0000000..be1558a --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_client.c @@ -0,0 +1,506 @@ +/* mqtt_client.c + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Include the autoconf generated config.h */ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include "wolfmqtt/mqtt_client.h" + +/* Options */ +//#define WOLFMQTT_DEBUG_CLIENT +#ifdef WOLFMQTT_NO_STDIO + #undef WOLFMQTT_DEBUG_CLIENT +#endif + +/* Private functions */ +static int MqttClient_WaitType(MqttClient *client, int timeout_ms, + byte wait_type, word16 wait_packet_id, void* p_decode) +{ + int rc; + MqttPacket* header; + byte msg_type, msg_qos; + word16 packet_id = 0; + int packet_len; + + while (1) { + /* Wait for packet */ + rc = MqttPacket_Read(client, client->rx_buf, client->rx_buf_len, + timeout_ms); + if (rc <= 0) { return rc; } + packet_len = rc; + + /* Determine packet type */ + header = (MqttPacket*)client->rx_buf; + msg_type = MQTT_PACKET_TYPE_GET(header->type_flags); + msg_qos = MQTT_PACKET_FLAGS_GET_QOS(header->type_flags); + +#ifdef WOLFMQTT_DEBUG_CLIENT + printf("Read Packet: Len %d, Type %d, Qos %d\n", + packet_len, msg_type, msg_qos); +#endif + + switch(msg_type) { + case MQTT_PACKET_TYPE_CONNECT_ACK: + { + /* Decode connect ack */ + MqttConnectAck connect_ack, *p_connect_ack = &connect_ack; + if (p_decode) { + p_connect_ack = (MqttConnectAck*)p_decode; + } + rc = MqttDecode_ConenctAck(client->rx_buf, packet_len, + p_connect_ack); + if (rc <= 0) { return rc; } + break; + } + case MQTT_PACKET_TYPE_PUBLISH: + { + MqttMessage msg; + byte msg_new = 1; + byte msg_done; + + /* Decode publish message */ + rc = MqttDecode_Publish(client->rx_buf, packet_len, &msg); + if (rc <= 0) { return rc; } + + /* Handle packet callback and read remaining payload */ + do { + /* Determine if message is done */ + msg_done = + ((msg.buffer_pos + msg.buffer_len) >= msg.total_len) ? + 1 : 0; + + /* Issue callback for new message */ + if (client->msg_cb) { + if (!msg_new) { + /* Reset topic name since valid on new message only */ + msg.topic_name = NULL; + msg.topic_name_len = 0; + } + rc = client->msg_cb(client, &msg, msg_new, msg_done); + if (rc != MQTT_CODE_SUCCESS) { return rc; }; + } + + /* Read payload */ + if (!msg_done) { + int msg_len; + + msg.buffer_pos += msg.buffer_len; + msg.buffer_len = 0; + + msg_len = (msg.total_len - msg.buffer_pos); + if (msg_len > client->rx_buf_len) { + msg_len = client->rx_buf_len; + } + rc = MqttSocket_Read(client, client->rx_buf, msg_len, + timeout_ms); + if (rc != msg_len) { return rc; } + + /* Update message */ + msg.buffer = client->rx_buf; + msg.buffer_len = msg_len; + } + msg_new = 0; + } while (!msg_done); + + /* Handle Qos */ + if (msg_qos > MQTT_QOS_0) { + MqttPublishResp publish_resp; + MqttPacketType type; + + packet_id = msg.packet_id; + + /* Determine packet type to write */ + type = (msg_qos == MQTT_QOS_1) ? + MQTT_PACKET_TYPE_PUBLISH_ACK : + MQTT_PACKET_TYPE_PUBLISH_REC; + publish_resp.packet_id = packet_id; + + /* Encode publish response */ + rc = MqttEncode_PublishResp(client->tx_buf, + client->tx_buf_len, type, &publish_resp); + if (rc <= 0) { return rc; } + packet_len = rc; + + /* Send packet */ + rc = MqttPacket_Write(client, client->tx_buf, packet_len); + if (rc != packet_len) { return rc; } + } + break; + } + case MQTT_PACKET_TYPE_PUBLISH_ACK: + case MQTT_PACKET_TYPE_PUBLISH_REC: + case MQTT_PACKET_TYPE_PUBLISH_REL: + case MQTT_PACKET_TYPE_PUBLISH_COMP: + { + MqttPublishResp publish_resp, *p_publish_resp = &publish_resp; + if (p_decode) { + p_publish_resp = (MqttPublishResp*)p_decode; + } + + /* Decode publish response message */ + rc = MqttDecode_PublishResp(client->rx_buf, packet_len, + msg_type, p_publish_resp); + if (rc <= 0) { return rc; } + packet_id = p_publish_resp->packet_id; + + /* If Qos then send response */ + if (msg_type == MQTT_PACKET_TYPE_PUBLISH_REC || + msg_type == MQTT_PACKET_TYPE_PUBLISH_REL) { + + /* Encode publish response */ + publish_resp.packet_id = packet_id; + rc = MqttEncode_PublishResp(client->tx_buf, + client->tx_buf_len, msg_type+1, &publish_resp); + if (rc <= 0) { return rc; } + packet_len = rc; + + /* Send packet */ + rc = MqttPacket_Write(client, client->tx_buf, packet_len); + if (rc != packet_len) { return rc; } + } + break; + } + case MQTT_PACKET_TYPE_SUBSCRIBE_ACK: + { + /* Decode subscribe ack */ + MqttSubscribeAck subscribe_ack; + MqttSubscribeAck *p_subscribe_ack = &subscribe_ack; + if (p_decode) { + p_subscribe_ack = (MqttSubscribeAck*)p_decode; + } + rc = MqttDecode_SubscribeAck(client->rx_buf, packet_len, + p_subscribe_ack); + if (rc <= 0) { return rc; } + packet_id = p_subscribe_ack->packet_id; + break; + } + case MQTT_PACKET_TYPE_UNSUBSCRIBE_ACK: + { + /* Decode unsubscribe ack */ + MqttUnsubscribeAck unsubscribe_ack; + MqttUnsubscribeAck *p_unsubscribe_ack = &unsubscribe_ack; + + if (p_decode) { + p_unsubscribe_ack = (MqttUnsubscribeAck*)p_decode; + } + rc = MqttDecode_UnsubscribeAck(client->rx_buf, packet_len, + p_unsubscribe_ack); + if (rc <= 0) { return rc; } + packet_id = p_unsubscribe_ack->packet_id; + break; + } + case MQTT_PACKET_TYPE_PING_RESP: + /* Decode ping */ + rc = MqttDecode_Ping(client->rx_buf, packet_len); + if (rc <= 0) { return rc; } + break; + + default: + /* Other types are server side only, ignore */ +#ifdef WOLFMQTT_DEBUG_CLIENT + printf("MqttClient_WaitMessage: Invalid client packet type %u!\n", + msg_type); +#endif + break; + } + + /* Check for type and packet id */ + if (wait_type < MQTT_PACKET_TYPE_MAX) { + if (wait_type == msg_type) { + if (wait_packet_id == 0 || wait_packet_id == packet_id) { + /* We found the packet type and id */ + break; + } + } + } + else { + /* We got a message, so return now */ + break; + } + } + + return MQTT_CODE_SUCCESS; +} + +/* Public Functions */ +int MqttClient_Init(MqttClient *client, MqttNet* net, + MqttMsgCb msg_cb, + byte* tx_buf, int tx_buf_len, + byte* rx_buf, int rx_buf_len, + int cmd_timeout_ms) +{ + int rc = MQTT_CODE_SUCCESS; + + /* Check arguments */ + if (client == NULL || + tx_buf == NULL || tx_buf_len <= 0 || + rx_buf == NULL || rx_buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Initialize the client structure to zero */ + XMEMSET(client, 0, sizeof(MqttClient)); + + /* Setup client structure */ + client->msg_cb = msg_cb; + client->flags = 0; + client->tx_buf = tx_buf; + client->tx_buf_len = tx_buf_len; + client->rx_buf = rx_buf; + client->rx_buf_len = rx_buf_len; + client->cmd_timeout_ms = cmd_timeout_ms; + + /* Init socket */ + rc = MqttSocket_Init(client, net); + + return rc; +} + +int MqttClient_Connect(MqttClient *client, MqttConnect *connect) +{ + int rc, len; + + /* Validate required arguments */ + if (client == NULL || connect == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode the connect packet */ + rc = MqttEncode_Connect(client->tx_buf, client->tx_buf_len, connect); + if (rc <= 0) { return rc; } + len = rc; + + /* Send connect packet */ + rc = MqttPacket_Write(client, client->tx_buf, len); + if (rc != len) { return rc; } + + /* Wait for connect ack packet */ + rc = MqttClient_WaitType(client, client->cmd_timeout_ms, + MQTT_PACKET_TYPE_CONNECT_ACK, 0, &connect->ack); + + return rc; +} + +int MqttClient_Publish(MqttClient *client, MqttPublish *publish) +{ + int rc, len; + + /* Validate required arguments */ + if (client == NULL || publish == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode the publish packet */ + rc = MqttEncode_Publish(client->tx_buf, client->tx_buf_len, publish); + if (rc <= 0) { return rc; } + len = rc; + + /* Send packet and payload */ + do { + rc = MqttPacket_Write(client, client->tx_buf, len); + if (rc != len) { return rc; } + publish->buffer_pos += publish->buffer_len; + publish->buffer_len = 0; + + /* Check if there is anything left to send */ + if (publish->buffer_pos >= publish->total_len) { + rc = MQTT_CODE_SUCCESS; + break; + } + + /* Build packet payload to send */ + len = (publish->total_len - publish->buffer_pos); + if (len > client->tx_buf_len) { + len = client->tx_buf_len; + } + publish->buffer_len = len; + XMEMCPY(client->tx_buf, &publish->buffer[publish->buffer_pos], len); + } while (publish->buffer_pos < publish->total_len); + + /* Handle QoS */ + if (publish->qos > MQTT_QOS_0) { + /* Determine packet type to wait for */ + MqttPacketType type = (publish->qos == MQTT_QOS_1) ? + MQTT_PACKET_TYPE_PUBLISH_ACK : MQTT_PACKET_TYPE_PUBLISH_COMP; + + /* Wait for publish response packet */ + rc = MqttClient_WaitType(client, client->cmd_timeout_ms, + type, publish->packet_id, NULL); + } + + return rc; +} + +int MqttClient_Subscribe(MqttClient *client, MqttSubscribe *subscribe) +{ + int rc, len, i; + MqttSubscribeAck subscribe_ack; + MqttTopic* topic; + + /* Validate required arguments */ + if (client == NULL || subscribe == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode the subscribe packet */ + rc = MqttEncode_Subscribe(client->tx_buf, client->tx_buf_len, subscribe); + if (rc <= 0) { return rc; } + len = rc; + + /* Send subscribe packet */ + rc = MqttPacket_Write(client, client->tx_buf, len); + if (rc != len) { return rc; } + + /* Wait for subscribe ack packet */ + rc = MqttClient_WaitType(client, client->cmd_timeout_ms, + MQTT_PACKET_TYPE_SUBSCRIBE_ACK, subscribe->packet_id, &subscribe_ack); + + /* Populate return codes */ + if (rc == MQTT_CODE_SUCCESS) { + for (i = 0; i < subscribe->topic_count; i++) { + topic = &subscribe->topics[i]; + topic->return_code = subscribe_ack.return_codes[i]; + } + } + + return rc; +} + +int MqttClient_Unsubscribe(MqttClient *client, MqttUnsubscribe *unsubscribe) +{ + int rc, len; + MqttUnsubscribeAck unsubscribe_ack; + + /* Validate required arguments */ + if (client == NULL || unsubscribe == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode the subscribe packet */ + rc = MqttEncode_Unsubscribe(client->tx_buf, client->tx_buf_len, + unsubscribe); + if (rc <= 0) { return rc; } + len = rc; + + /* Send unsubscribe packet */ + rc = MqttPacket_Write(client, client->tx_buf, len); + if (rc != len) { return rc; } + + /* Wait for unsubscribe ack packet */ + rc = MqttClient_WaitType(client, client->cmd_timeout_ms, + MQTT_PACKET_TYPE_UNSUBSCRIBE_ACK, unsubscribe->packet_id, + &unsubscribe_ack); + + return rc; +} + +int MqttClient_Ping(MqttClient *client) +{ + int rc, len; + + /* Validate required arguments */ + if (client == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode the subscribe packet */ + rc = MqttEncode_Ping(client->tx_buf, client->tx_buf_len); + if (rc <= 0) { return rc; } + len = rc; + + /* Send ping req packet */ + rc = MqttPacket_Write(client, client->tx_buf, len); + if (rc != len) { return rc; } + + /* Wait for ping resp packet */ + rc = MqttClient_WaitType(client, client->cmd_timeout_ms, + MQTT_PACKET_TYPE_PING_RESP, 0, NULL); + + return rc; +} + +int MqttClient_Disconnect(MqttClient *client) +{ + int rc, len; + + /* Validate required arguments */ + if (client == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode the disconnect packet */ + rc = MqttEncode_Disconnect(client->tx_buf, client->tx_buf_len); + if (rc <= 0) { return rc; } + len = rc; + + /* Send disconnect packet */ + rc = MqttPacket_Write(client, client->tx_buf, len); + if (rc != len) { return rc; } + + /* No response for MQTT disconnect packet */ + + return MQTT_CODE_SUCCESS; +} + + +int MqttClient_WaitMessage(MqttClient *client, int timeout_ms) +{ + return MqttClient_WaitType(client, timeout_ms, MQTT_PACKET_TYPE_MAX, + 0, NULL); +} + +int MqttClient_NetConnect(MqttClient *client, const char* host, + word16 port, int timeout_ms, int use_tls, MqttTlsCb cb) +{ + return MqttSocket_Connect(client, host, port, timeout_ms, use_tls, cb); +} + +int MqttClient_NetDisconnect(MqttClient *client) +{ + return MqttSocket_Disconnect(client); +} + +const char* MqttClient_ReturnCodeToString(int return_code) +{ + switch(return_code) { + case MQTT_CODE_SUCCESS: + return "Success"; + case MQTT_CODE_ERROR_BAD_ARG: + return "Error (Bad argument)"; + case MQTT_CODE_ERROR_OUT_OF_BUFFER: + return "Error (Out of buffer)"; + case MQTT_CODE_ERROR_MALFORMED_DATA: + return "Error (Malformed Remaining Length)"; + case MQTT_CODE_ERROR_PACKET_TYPE: + return "Error (Packet Type Mismatch)"; + case MQTT_CODE_ERROR_PACKET_ID: + return "Error (Packet Id Mismatch)"; + case MQTT_CODE_ERROR_TLS_CONNECT: + return "Error (TLS Connect)"; + case MQTT_CODE_ERROR_TIMEOUT: + return "Error (Timeout)"; + case MQTT_CODE_ERROR_NETWORK: + return "Error (Network)"; + } + return "Unknown"; +} diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_packet.c b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_packet.c new file mode 100755 index 0000000..26915fd --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_packet.c @@ -0,0 +1,755 @@ +/* mqtt_packet.c + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Include the autoconf generated config.h */ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include "wolfmqtt/mqtt_packet.h" +#include "wolfmqtt/mqtt_client.h" + +/* Positive return value is header length, zero or negative indicates error */ +static int MqttEncode_FixedHeader(byte *tx_buf, int tx_buf_len, int remain_len, + byte type, byte retain, byte qos, byte duplicate) +{ + int header_len; + MqttPacket* header = (MqttPacket*)tx_buf; + + /* Encode fixed header */ + header->type_flags = MQTT_PACKET_TYPE_SET(type) | MQTT_PACKET_FLAGS_SET(0); + if (retain) { + header->type_flags |= MQTT_PACKET_FLAGS_SET(MQTT_PACKET_FLAG_RETAIN); + } + if (qos) { + header->type_flags |= MQTT_PACKET_FLAGS_SET_QOS(qos); + } + if (duplicate) { + header->type_flags |= + MQTT_PACKET_FLAGS_SET(MQTT_PACKET_FLAG_DUPLICATE); + } + + /* Encode the length remaining into the header */ + header_len = MqttEncode_RemainLen(header, tx_buf_len, remain_len); + if (header_len < 0) { + return header_len; + } + + return header_len; +} + +static int MqttDecode_FixedHeader(byte *rx_buf, int rx_buf_len, + int *remain_len, byte type, MqttQoS *p_qos, byte *p_retain, + byte *p_duplicate) +{ + int header_len; + MqttPacket* header = (MqttPacket*)rx_buf; + + /* Decode the length remaining */ + header_len = MqttDecode_RemainLen(header, rx_buf_len, remain_len); + if (header_len < 0) { + return header_len; + } + + /* Validate packet type */ + if (MQTT_PACKET_TYPE_GET(header->type_flags) != type) { + return MQTT_CODE_ERROR_PACKET_TYPE; + } + + /* Extract header flags */ + if (p_qos) { + *p_qos = (MqttQoS)MQTT_PACKET_FLAGS_GET_QOS(header->type_flags); + } + if (p_retain) { + *p_retain = (MQTT_PACKET_FLAGS_GET(header->type_flags) & + MQTT_PACKET_FLAG_RETAIN) ? 1 : 0; + } + if (p_duplicate) { + *p_duplicate = (MQTT_PACKET_FLAGS_GET(header->type_flags) & + MQTT_PACKET_FLAG_DUPLICATE) ? 1 : 0; + } + + return header_len; +} + + +/* Packet Element Encoders/Decoders */ +/* Returns number of decoded bytes, errors are negative value */ +int MqttDecode_RemainLen(MqttPacket *header, int buf_len, int *remain_len) +{ + int decode_bytes = 0; + int multiplier = 1; + byte tmp_len; + + if (header == NULL || remain_len == NULL || buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + *remain_len = 0; + do { + /* Check decoded length byte count */ + if ((decode_bytes + 1) >= buf_len) { + return 0; /* Zero incidates we need another byte */ + } + if (decode_bytes >= MQTT_PACKET_MAX_LEN_BYTES) { + return MQTT_CODE_ERROR_MALFORMED_DATA; + } + + /* Decode Length */ + tmp_len = header->len[decode_bytes++]; + *remain_len += (tmp_len & ~MQTT_PACKET_LEN_ENCODE_MASK) * multiplier; + multiplier *= MQTT_PACKET_LEN_ENCODE_MASK; + } while (tmp_len & MQTT_PACKET_LEN_ENCODE_MASK); + + return decode_bytes + 1; /* Add byte for header flags/type */ +} + +/* Returns number of encoded bytes, errors are negative value */ +int MqttEncode_RemainLen(MqttPacket *header, int buf_len, int remain_len) +{ + int encode_bytes = 0; + byte tmp_len; + + if (header == NULL || remain_len < 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + do { + /* Check decoded length byte count */ + if ((encode_bytes + 1) >= buf_len) { + return 0; /* Zero incidates we need another byte */ + } + if (encode_bytes >= MQTT_PACKET_MAX_LEN_BYTES) { + return MQTT_CODE_ERROR_MALFORMED_DATA; + } + + /* Encode length */ + tmp_len = (remain_len % MQTT_PACKET_LEN_ENCODE_MASK); + remain_len /= MQTT_PACKET_LEN_ENCODE_MASK; + + /* If more length, set the top bit of this byte */ + if (remain_len > 0) { + tmp_len |= MQTT_PACKET_LEN_ENCODE_MASK; + } + header->len[encode_bytes++] = tmp_len; + } while (remain_len > 0); + + return encode_bytes + 1; /* Add byte for header flags/type */ +} + +/* Returns number of buffer bytes decoded */ +int MqttDecode_Num(byte* buf, word16 *len) +{ + if (len) { + *len = buf[0]; + *len = (*len << 8) | buf[1]; + } + return MQTT_DATA_LEN_SIZE; +} + +/* Returns number of buffer bytes encoded */ +int MqttEncode_Num(byte *buf, word16 len) +{ + buf[0] = len >> 8; + buf[1] = len & 0xFF; + return MQTT_DATA_LEN_SIZE; +} + +/* Returns number of buffer bytes decoded */ +/* Returns pointer to string (which is not guarenteed to be null terminated) */ +int MqttDecode_String(byte *buf, const char **pstr, word16 *pstr_len) +{ + int len; + word16 str_len; + len = MqttDecode_Num(buf, &str_len); + buf += len; + if (pstr_len) { + *pstr_len = str_len; + } + if (pstr) { + *pstr = (char*)buf; + } + return len + str_len; +} + +/* Returns number of buffer bytes encoded */ +int MqttEncode_String(byte *buf, const char *str) +{ + int str_len = (int)XSTRLEN(str); + int len = MqttEncode_Num(buf, str_len); + buf += len; + XMEMCPY(buf, str, str_len); + return len + str_len; +} + +/* Returns number of buffer bytes encoded */ +int MqttEncode_Data(byte *buf, const byte *data, word16 data_len) +{ + int len = MqttEncode_Num(buf, data_len); + buf += len; + XMEMCPY(buf, data, data_len); + return len + data_len; +} + + +/* Packet Type Encoders/Decoders */ +int MqttEncode_Connect(byte *tx_buf, int tx_buf_len, MqttConnect *connect) +{ + int header_len, remain_len; + MqttConnectPacket packet = MQTT_CONNECT_INIT; + byte *tx_payload; + + /* Validate required arguments */ + if (tx_buf == NULL || connect == NULL || connect->client_id == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Determine packet length */ + /* MQTT Version 4 header is 10 bytes */ + remain_len = sizeof(MqttConnectPacket); + remain_len += (int)XSTRLEN(connect->client_id) + MQTT_DATA_LEN_SIZE; + if (connect->enable_lwt) { + /* Verify all required fields are present */ + if (connect->lwt_msg == NULL || + connect->lwt_msg->topic_name == NULL || + connect->lwt_msg->buffer == NULL || + connect->lwt_msg->total_len <= 0) + { + return MQTT_CODE_ERROR_BAD_ARG; + } + + remain_len += (int)XSTRLEN(connect->lwt_msg->topic_name); + remain_len += MQTT_DATA_LEN_SIZE; + remain_len += connect->lwt_msg->total_len; + remain_len += MQTT_DATA_LEN_SIZE; + } + if (connect->username) { + remain_len += (int)XSTRLEN(connect->username) + MQTT_DATA_LEN_SIZE; + } + if (connect->password) { + remain_len += (int)XSTRLEN(connect->password) + MQTT_DATA_LEN_SIZE; + } + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, remain_len, + MQTT_PACKET_TYPE_CONNECT, 0, 0, 0); + if (header_len < 0) { + return header_len; + } + tx_payload = &tx_buf[header_len]; + + /* Encode variable header */ + /* Set connection flags */ + if (connect->clean_session) { + packet.flags |= MQTT_CONNECT_FLAG_CLEAN_SESSION; + } + if (connect->enable_lwt) { + packet.flags |= MQTT_CONNECT_FLAG_WILL_FLAG; + + if (connect->lwt_msg->qos) { + packet.flags |= MQTT_CONNECT_FLAG_SET_QOS(connect->lwt_msg->qos); + } + if (connect->lwt_msg->retain) { + packet.flags |= MQTT_CONNECT_FLAG_WILL_RETAIN; + } + } + if (connect->username) { + packet.flags |= MQTT_CONNECT_FLAG_USERNAME; + } + if (connect->password) { + packet.flags |= MQTT_CONNECT_FLAG_PASSWORD; + } + MqttEncode_Num((byte*)&packet.keep_alive, connect->keep_alive_sec); + XMEMCPY(tx_payload, &packet, sizeof(MqttConnectPacket)); + tx_payload += sizeof(MqttConnectPacket); + + /* Encode payload */ + tx_payload += MqttEncode_String(tx_payload, connect->client_id); + if (connect->enable_lwt) { + tx_payload += MqttEncode_String(tx_payload, + connect->lwt_msg->topic_name); + tx_payload += MqttEncode_Data(tx_payload, + connect->lwt_msg->buffer, connect->lwt_msg->total_len); + } + if (connect->username) { + tx_payload += MqttEncode_String(tx_payload, connect->username); + } + if (connect->password) { + tx_payload += MqttEncode_String(tx_payload, connect->password); + } + (void)tx_payload; + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttDecode_ConenctAck(byte *rx_buf, int rx_buf_len, + MqttConnectAck *connect_ack) +{ + int header_len, remain_len; + byte *rx_payload; + + /* Validate required arguments */ + if (rx_buf == NULL || rx_buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Decode fixed header */ + header_len = MqttDecode_FixedHeader(rx_buf, rx_buf_len, &remain_len, + MQTT_PACKET_TYPE_CONNECT_ACK, NULL, NULL, NULL); + if (header_len < 0) { + return header_len; + } + rx_payload = &rx_buf[header_len]; + + /* Decode variable header */ + if (connect_ack) { + connect_ack->flags = rx_payload[0]; + connect_ack->return_code = rx_payload[1]; + } + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttEncode_Publish(byte *tx_buf, int tx_buf_len, MqttPublish *publish) +{ + int header_len, variable_len, payload_len = 0; + byte *tx_payload; + + /* Validate required arguments */ + if (tx_buf == NULL || publish == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Determine packet length */ + variable_len = (int)XSTRLEN(publish->topic_name) + MQTT_DATA_LEN_SIZE; + if (publish->qos > MQTT_QOS_0) { + if (publish->packet_id == 0) { + return MQTT_CODE_ERROR_PACKET_ID; + } + variable_len += MQTT_DATA_LEN_SIZE; /* For packet_id */ + } + if (publish->buffer && publish->total_len > 0) { + payload_len = publish->total_len; + } + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, + variable_len + payload_len, MQTT_PACKET_TYPE_PUBLISH, + publish->retain, publish->qos, publish->duplicate); + if (header_len < 0) { + return header_len; + } + tx_payload = &tx_buf[header_len]; + + /* Encode variable header */ + tx_payload += MqttEncode_String(tx_payload, publish->topic_name); + if (publish->qos > MQTT_QOS_0) { + tx_payload += MqttEncode_Num(tx_payload, publish->packet_id); + } + + /* Encode payload */ + if (payload_len > 0) { + + /* Determine max size to copy into tx_payload */ + if (payload_len > (tx_buf_len - (header_len + variable_len))) { + payload_len = (tx_buf_len - (header_len + variable_len)); + } + XMEMCPY(tx_payload, publish->buffer, payload_len); + } + publish->buffer_pos = 0; + publish->buffer_len = payload_len; + + /* Return length of packet placed into tx_buf */ + return header_len + variable_len + payload_len; +} + +int MqttDecode_Publish(byte *rx_buf, int rx_buf_len, MqttPublish *publish) +{ + int header_len, remain_len, variable_len, payload_len; + byte *rx_payload; + + /* Validate required arguments */ + if (rx_buf == NULL || rx_buf_len <= 0 || publish == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Decode fixed header */ + header_len = MqttDecode_FixedHeader(rx_buf, rx_buf_len, + &remain_len, MQTT_PACKET_TYPE_PUBLISH, &publish->qos, + &publish->retain, &publish->duplicate); + if (header_len < 0) { + return header_len; + } + rx_payload = &rx_buf[header_len]; + + /* Decode variable header */ + variable_len = MqttDecode_String(rx_payload, &publish->topic_name, + &publish->topic_name_len); + rx_payload += variable_len; + + /* If QoS > 0 then get packet Id */ + if (publish->qos > MQTT_QOS_0) { + variable_len += MqttDecode_Num(rx_payload, &publish->packet_id); + rx_payload += MQTT_DATA_LEN_SIZE; + } + + /* Decode Payload */ + payload_len = remain_len - variable_len; + publish->buffer = rx_payload; + publish->buffer_pos = 0; + publish->buffer_len = payload_len; + publish->total_len = payload_len; + + /* Only return the length provided in rx_buf_len */ + if ((int)publish->buffer_len > + (rx_buf_len - (header_len + variable_len))) + { + publish->buffer_len = (rx_buf_len - (header_len + variable_len)); + } + + return header_len + variable_len + payload_len; +} + +int MqttEncode_PublishResp(byte* tx_buf, int tx_buf_len, byte type, + MqttPublishResp *publish_resp) +{ + int header_len, remain_len; + byte *tx_payload; + MqttQoS qos; + + /* Validate required arguments */ + if (tx_buf == NULL || publish_resp == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Determine packet length */ + remain_len = MQTT_DATA_LEN_SIZE; /* For packet_id */ + + /* Determine Qos value */ + qos = (type == MQTT_PACKET_TYPE_PUBLISH_REL) ? MQTT_QOS_1 : MQTT_QOS_0; + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, remain_len, + type, 0, qos, 0); + if (header_len < 0) { + return header_len; + } + tx_payload = &tx_buf[header_len]; + + /* Encode variable header */ + tx_payload += MqttEncode_Num(&tx_buf[header_len], publish_resp->packet_id); + (void)tx_payload; + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttDecode_PublishResp(byte* rx_buf, int rx_buf_len, byte type, + MqttPublishResp *publish_resp) +{ + int header_len, remain_len; + byte *rx_payload; + + /* Validate required arguments */ + if (rx_buf == NULL || rx_buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Decode fixed header */ + header_len = MqttDecode_FixedHeader(rx_buf, rx_buf_len, &remain_len, + type, NULL, NULL, NULL); + if (header_len < 0) { + return header_len; + } + rx_payload = &rx_buf[header_len]; + + /* Decode variable header */ + if (publish_resp) { + rx_payload += MqttDecode_Num(rx_payload, &publish_resp->packet_id); + } + (void)rx_payload; + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttEncode_Subscribe(byte *tx_buf, int tx_buf_len, + MqttSubscribe *subscribe) +{ + int header_len, remain_len, i; + byte *tx_payload; + MqttTopic *topic; + + /* Validate required arguments */ + if (tx_buf == NULL || subscribe == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Determine packet length */ + remain_len = MQTT_DATA_LEN_SIZE; /* For packet_id */ + for (i = 0; i < subscribe->topic_count; i++) { + topic = &subscribe->topics[i]; + remain_len += (int)XSTRLEN(topic->topic_filter) + MQTT_DATA_LEN_SIZE; + remain_len++; /* For QoS */ + } + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, remain_len, + MQTT_PACKET_TYPE_SUBSCRIBE, 0, MQTT_QOS_1, 0); + if (header_len < 0) { + return header_len; + } + tx_payload = &tx_buf[header_len]; + + /* Encode variable header */ + tx_payload += MqttEncode_Num(&tx_buf[header_len], subscribe->packet_id); + + /* Encode payload */ + for (i = 0; i < subscribe->topic_count; i++) { + topic = &subscribe->topics[i]; + tx_payload += MqttEncode_String(tx_payload, topic->topic_filter); + *tx_payload = topic->qos; + tx_payload++; + } + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttDecode_SubscribeAck(byte* rx_buf, int rx_buf_len, + MqttSubscribeAck *subscribe_ack) +{ + int header_len, remain_len; + byte *rx_payload; + + /* Validate required arguments */ + if (rx_buf == NULL || rx_buf_len <= 0 || subscribe_ack == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Decode fixed header */ + header_len = MqttDecode_FixedHeader(rx_buf, rx_buf_len, &remain_len, + MQTT_PACKET_TYPE_SUBSCRIBE_ACK, NULL, NULL, NULL); + if (header_len < 0) { + return header_len; + } + rx_payload = &rx_buf[header_len]; + + /* Decode variable header */ + if (subscribe_ack) { + rx_payload += MqttDecode_Num(rx_payload, &subscribe_ack->packet_id); + subscribe_ack->return_codes = rx_payload; /* List of return codes */ + } + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttEncode_Unsubscribe(byte *tx_buf, int tx_buf_len, + MqttUnsubscribe *unsubscribe) +{ + int header_len, remain_len, i; + byte *tx_payload; + MqttTopic *topic; + + /* Validate required arguments */ + if (tx_buf == NULL || unsubscribe == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Determine packet length */ + remain_len = MQTT_DATA_LEN_SIZE; /* For packet_id */ + for (i = 0; i < unsubscribe->topic_count; i++) { + topic = &unsubscribe->topics[i]; + remain_len += (int)XSTRLEN(topic->topic_filter) + MQTT_DATA_LEN_SIZE; + } + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, remain_len, + MQTT_PACKET_TYPE_UNSUBSCRIBE, 0, MQTT_QOS_1, 0); + if (header_len < 0) { + return header_len; + } + tx_payload = &tx_buf[header_len]; + + /* Encode variable header */ + tx_payload += MqttEncode_Num(&tx_buf[header_len], unsubscribe->packet_id); + + /* Encode payload */ + for (i = 0; i < unsubscribe->topic_count; i++) { + topic = &unsubscribe->topics[i]; + tx_payload += MqttEncode_String(tx_payload, topic->topic_filter); + } + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttDecode_UnsubscribeAck(byte *rx_buf, int rx_buf_len, + MqttUnsubscribeAck *unsubscribe_ack) +{ + int header_len, remain_len; + byte *rx_payload; + + /* Validate required arguments */ + if (rx_buf == NULL || rx_buf_len <= 0 || unsubscribe_ack == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Decode fixed header */ + header_len = MqttDecode_FixedHeader(rx_buf, rx_buf_len, &remain_len, + MQTT_PACKET_TYPE_UNSUBSCRIBE_ACK, NULL, NULL, NULL); + if (header_len < 0) { + return header_len; + } + rx_payload = &rx_buf[header_len]; + + /* Decode variable header */ + if (unsubscribe_ack) { + rx_payload += MqttDecode_Num(rx_payload, &unsubscribe_ack->packet_id); + } + (void)rx_payload; + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttEncode_Ping(byte *tx_buf, int tx_buf_len) +{ + int header_len, remain_len = 0; + + /* Validate required arguments */ + if (tx_buf == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, remain_len, + MQTT_PACKET_TYPE_PING_REQ, 0, 0, 0); + if (header_len < 0) { + return header_len; + } + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttDecode_Ping(byte *rx_buf, int rx_buf_len) +{ + int header_len, remain_len; + + /* Validate required arguments */ + if (rx_buf == NULL || rx_buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Decode fixed header */ + header_len = MqttDecode_FixedHeader(rx_buf, rx_buf_len, &remain_len, + MQTT_PACKET_TYPE_PING_RESP, NULL, NULL, NULL); + if (header_len < 0) { + return header_len; + } + + /* Return total length of packet */ + return header_len + remain_len; +} + +int MqttEncode_Disconnect(byte *tx_buf, int tx_buf_len) +{ + int header_len; + + /* Validate required arguments */ + if (tx_buf == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Encode fixed header */ + header_len = MqttEncode_FixedHeader(tx_buf, tx_buf_len, 0, + MQTT_PACKET_TYPE_DISCONNECT, 0, 0, 0); + if (header_len < 0) { + return header_len; + } + + /* Return total length of packet */ + return header_len; +} + + +int MqttPacket_Write(MqttClient *client, byte* tx_buf, int tx_buf_len) +{ + int rc; + rc = MqttSocket_Write(client, tx_buf, tx_buf_len, client->cmd_timeout_ms); + return rc; +} + +/* Read return code is length when > 0 */ +int MqttPacket_Read(MqttClient *client, byte* rx_buf, int rx_buf_len, + int timeout_ms) +{ + int rc, len, header_len = 2, remain_len = 0; + MqttPacket* header = (MqttPacket*)rx_buf; + + /* Read fix header portion */ + rc = MqttSocket_Read(client, &rx_buf[0], header_len, timeout_ms); + if (rc != header_len) { + return rc; + } + + do { + /* Try and decode remaining length */ + rc = MqttDecode_RemainLen(header, header_len, &remain_len); + if (rc < 0) { /* Indicates error */ + return rc; + } + /* Indicates decode success and rc is len of header */ + else if (rc > 0) { + header_len = rc; + break; + } + + /* Read next byte and try decode again */ + len = 1; + rc = MqttSocket_Read(client, &rx_buf[header_len], len, timeout_ms); + if (rc != len) { + return rc; + } + header_len += len; + } while (header_len < MQTT_PACKET_MAX_SIZE); + + /* Make sure it does not overflow rx_buf */ + if (remain_len > (rx_buf_len - header_len)) { + remain_len = rx_buf_len - header_len; + } + + /* Read remaining */ + if (remain_len > 0) { + rc = MqttSocket_Read(client, &rx_buf[header_len], remain_len, + timeout_ms); + if (rc != remain_len) { + return rc; + } + } + + /* Return read packet length */ + return header_len + remain_len; +} diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_socket.c b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_socket.c new file mode 100755 index 0000000..1776f5c --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/src/mqtt_socket.c @@ -0,0 +1,345 @@ +/* mqtt_socket.c + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Include the autoconf generated config.h */ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include "wolfmqtt/mqtt_client.h" +#include "wolfmqtt/mqtt_socket.h" + +/* Options */ +//#define WOLFMQTT_DEBUG_SOCKET +#ifdef WOLFMQTT_NO_STDIO + #undef WOLFMQTT_DEBUG_SOCKET +#endif + + +/* Private Functions */ +#ifdef ENABLE_MQTT_TLS +static int MqttSocket_TlsSocketReceive(WOLFSSL* ssl, char *buf, int sz, + void *ptr) +{ + int rc; + MqttClient *client = (MqttClient*)ptr; + (void)ssl; /* Not used */ + rc = client->net->read(client->net->context, (byte*)buf, sz, + client->cmd_timeout_ms); + if (rc == 0) { + rc = WOLFSSL_CBIO_ERR_WANT_READ; + } + else if (rc < 0) { + rc = WOLFSSL_CBIO_ERR_GENERAL; + } + return rc; +} + +static int MqttSocket_TlsSocketSend(WOLFSSL* ssl, char *buf, int sz, + void *ptr) +{ + int rc; + MqttClient *client = (MqttClient*)ptr; + (void)ssl; /* Not used */ + rc = client->net->write(client->net->context, (byte*)buf, sz, + client->cmd_timeout_ms); + if (rc == 0) { + rc = WOLFSSL_CBIO_ERR_WANT_WRITE; + } + else if (rc < 0) { + rc = WOLFSSL_CBIO_ERR_GENERAL; + } + return rc; +} +#endif + + +/* Public Functions */ +int MqttSocket_Init(MqttClient *client, MqttNet *net) +{ + int rc = MQTT_CODE_ERROR_BAD_ARG; + if (client) { + client->net = net; + client->flags &= ~(MQTT_CLIENT_FLAG_IS_CONNECTED | + MQTT_CLIENT_FLAG_IS_TLS); +#ifdef ENABLE_MQTT_TLS + client->tls.ctx = NULL; + client->tls.ssl = NULL; +#endif + + /* Validate callbacks are not null! */ + if (net && net->connect && net->read && net->write && + net->disconnect) { + rc = MQTT_CODE_SUCCESS; + } + } + return rc; +} + +int MqttSocket_Write(MqttClient *client, const byte* buf, int buf_len, + int timeout_ms) +{ + int rc; + + /* Validate arguments */ + if (client == NULL || client->net == NULL || + client->net->write == NULL || buf == NULL || buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + +#ifdef ENABLE_MQTT_TLS + if (client->flags & MQTT_CLIENT_FLAG_IS_TLS) { + int error; + rc = wolfSSL_write(client->tls.ssl, (char*)buf, buf_len); + error = wolfSSL_get_error(client->tls.ssl, 0); +#ifdef WOLFMQTT_DEBUG_SOCKET + printf("MqttSocket_Write: Len=%d, Rc=%d, Error=%d\n", + buf_len, rc, error); +#endif + if (error == SSL_ERROR_WANT_WRITE) { + rc = 0; /* Timeout */ + } + } + else +#endif + { + rc = client->net->write(client->net->context, buf, buf_len, + timeout_ms); + +#ifdef WOLFMQTT_DEBUG_SOCKET + printf("MqttSocket_Write: Len=%d, Rc=%d\n", buf_len, rc); +#endif + } + + /* Check for error */ + if (rc < 0) { + rc = MQTT_CODE_ERROR_NETWORK; + } + + return rc; +} + +int MqttSocket_Read(MqttClient *client, byte* buf, int buf_len, int timeout_ms) +{ + int rc, pos, len; + + /* Validate arguments */ + if (client == NULL || client->net == NULL || client->net->read == NULL || + buf == NULL || buf_len <= 0) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + pos = 0; + len = buf_len; + do { +#ifdef ENABLE_MQTT_TLS + if (client->flags & MQTT_CLIENT_FLAG_IS_TLS) { + int error; + rc = wolfSSL_read(client->tls.ssl, (char*)&buf[pos], len); + error = wolfSSL_get_error(client->tls.ssl, 0); +#ifdef WOLFMQTT_DEBUG_SOCKET + printf("MqttSocket_Read: Len=%d, Rc=%d, Error=%d\n", + len, rc, error); +#endif + if (error == SSL_ERROR_WANT_READ) { + rc = 0; /* Timeout */ + } + } + else +#endif + { + rc = client->net->read(client->net->context, &buf[pos], len, + timeout_ms); + +#ifdef WOLFMQTT_DEBUG_SOCKET + printf("MqttSocket_Read: Len=%d, Rc=%d\n", len, rc); +#endif + } + + if (rc > 0) { + pos += rc; + len -= rc; + } + else { + break; + } + } while (len > 0); + + /* Check for timeout */ + if (rc == 0) { + rc = MQTT_CODE_ERROR_TIMEOUT; + } + else if (rc < 0) { + ; //rc = MQTT_CODE_ERROR_NETWORK; + } + else { + rc = pos; + } + + return rc; +} + +int MqttSocket_Connect(MqttClient *client, const char* host, word16 port, + int timeout_ms, int use_tls, MqttTlsCb cb) +{ + int rc; + + /* Validate arguments */ + if (client == NULL || client->net == NULL || + client->net->connect == NULL) { + return MQTT_CODE_ERROR_BAD_ARG; + } + + /* Validate port */ + if (port == 0) { + port = (use_tls) ? MQTT_SECURE_PORT : MQTT_DEFAULT_PORT; + } + + /* Connect to host */ + rc = client->net->connect(client->net->context, host, port, timeout_ms); + if (rc != 0) { + return rc; + } + client->flags |= MQTT_CLIENT_FLAG_IS_CONNECTED; + +#ifdef ENABLE_MQTT_TLS + if (use_tls) { + /* Setup the WolfSSL library */ + wolfSSL_Init(); + + /* Issue callback to allow setup of the wolfSSL_CTX and cert + verification settings */ + rc = SSL_SUCCESS; + if (cb) { + rc = cb(client); + } + if (rc == SSL_SUCCESS) { + /* Create and initialize the WOLFSSL_CTX structure */ + if (client->tls.ctx == NULL) { + /* Use defaults */ + client->tls.ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method()); + if (client->tls.ctx) { + wolfSSL_CTX_set_verify(client->tls.ctx, SSL_VERIFY_NONE, 0); + } + } + if (client->tls.ctx) { + /* Seutp the async IO callbacks */ + wolfSSL_SetIORecv(client->tls.ctx, + MqttSocket_TlsSocketReceive); + wolfSSL_SetIOSend(client->tls.ctx, + MqttSocket_TlsSocketSend); + + client->tls.ssl = wolfSSL_new(client->tls.ctx); + if (client->tls.ssl) { + wolfSSL_SetIOReadCtx(client->tls.ssl, (void *)client); + wolfSSL_SetIOWriteCtx(client->tls.ssl, (void *)client); + + rc = wolfSSL_connect(client->tls.ssl); + if (rc == SSL_SUCCESS) { + client->flags |= MQTT_CLIENT_FLAG_IS_TLS; + rc = MQTT_CODE_SUCCESS; + } + } + else { +#ifndef WOLFMQTT_NO_STDIO + printf("MqttSocket_TlsConnect: wolfSSL_new error!\n"); +#endif + rc = -1; + } + } + else { +#ifndef WOLFMQTT_NO_STDIO + printf("MqttSocket_TlsConnect: wolfSSL_CTX_new error!\n"); +#endif + rc = -1; + } + } + else { +#ifndef WOLFMQTT_NO_STDIO + printf("MqttSocket_TlsConnect: TLS callback error!\n"); +#endif + rc = -1; + } + + /* Handle error case */ + if (rc) { +#ifndef WOLFMQTT_NO_STDIO + const char* errstr = NULL; + int errnum = 0; + if (client->tls.ssl) { + errnum = wolfSSL_get_error(client->tls.ssl, 0); + errstr = wolfSSL_ERR_reason_error_string(errnum); + } + + printf("MqttSocket_TlsConnect Error %d: Num %d, %s\n", + rc, errnum, errstr); +#endif + + /* Make sure we cleanup on error */ + MqttSocket_Disconnect(client); + + rc = MQTT_CODE_ERROR_TLS_CONNECT; + } + } +#else + (void)cb; +#endif /* ENABLE_MQTT_TLS */ + +#ifdef WOLFMQTT_DEBUG_SOCKET + printf("MqttSocket_Connect: Rc=%d\n", rc); +#endif + + /* Check for error */ + if (rc < 0) { + rc = MQTT_CODE_ERROR_NETWORK; + } + + return rc; +} + +int MqttSocket_Disconnect(MqttClient *client) +{ + int rc = MQTT_CODE_SUCCESS; + if (client) { +#ifdef ENABLE_MQTT_TLS + if (client->tls.ssl) wolfSSL_free(client->tls.ssl); + if (client->tls.ctx) wolfSSL_CTX_free(client->tls.ctx); + wolfSSL_Cleanup(); + client->flags &= ~MQTT_CLIENT_FLAG_IS_TLS; +#endif + + /* Make sure socket is closed */ + if (client->net && client->net->disconnect) { + rc = client->net->disconnect(client->net->context); + } + client->flags &= ~MQTT_CLIENT_FLAG_IS_CONNECTED; + } +#ifdef WOLFMQTT_DEBUG_SOCKET + printf("MqttSocket_Disconnect: Rc=%d\n", rc); +#endif + + /* Check for error */ + if (rc < 0) { + rc = MQTT_CODE_ERROR_NETWORK; + } + + return rc; +} diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/include.am b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/include.am new file mode 100755 index 0000000..5a5d32e --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/include.am @@ -0,0 +1,11 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +nobase_include_HEADERS+= \ + wolfmqtt/version.h \ + wolfmqtt/mqtt_types.h \ + wolfmqtt/mqtt_client.h \ + wolfmqtt/mqtt_packet.h \ + wolfmqtt/mqtt_socket.h \ + wolfmqtt/visibility.h diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_client.h b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_client.h new file mode 100755 index 0000000..90cfae5 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_client.h @@ -0,0 +1,247 @@ +/* mqtt_client.h + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Implementation by: David Garske + * Based on specification for MQTT v3.1.1 + * See http://mqtt.org/documentation for additional MQTT documentation. + */ + +#ifndef WOLFMQTT_CLIENT_H +#define WOLFMQTT_CLIENT_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "wolfmqtt/mqtt_types.h" +#include "wolfmqtt/mqtt_packet.h" +#include "wolfmqtt/mqtt_socket.h" + + +struct _MqttClient; + +/*! \brief Mqtt Message Callback + * \discussion If the message payload is larger than the maximum RX buffer + then this callback is called multiple times. + If msg_new = 1 its a new message. + The topc_name and topic_name length are only valid when msg_new = 1. + If msg_new = 0 then we are receiving additional payload. + Each callback populates the payload in MqttMessage.buffer. + The MqttMessage.buffer_len is the size of the buffer payload. + The MqttMessage.buffer_pos is the location in the total payload. + The MqttMessage.total_len is the length of the complete payload message. + If msg_done = 1 the entire publish payload has been received. + * \param client Pointer to MqttClient structure + * \param message Pointer to MqttNet structure that has been + initialized with callback pointers and context + * \param msg_new If non-zero value then message is new and topic + name / len is provided and valid. + * \param msg_done If non-zero value then we have received the entire + message and payload. + * \return MQTT_CODE_SUCCESS to remain connected (other values will cause + net disconnect - see enum MqttPacketResponseCodes) + */ +typedef int (*MqttMsgCb)(struct _MqttClient *client, MqttMessage *message, + byte msg_new, byte msg_done); + + +/* Client flags */ +enum MqttClientFlags { + MQTT_CLIENT_FLAG_IS_CONNECTED = 0x01, + MQTT_CLIENT_FLAG_IS_TLS = 0x02, +}; + + +/* Client structure */ +typedef struct _MqttClient { + word32 flags; /* MqttClientFlags */ + int cmd_timeout_ms; + + byte *tx_buf; + int tx_buf_len; + byte *rx_buf; + int rx_buf_len; + + MqttNet *net; /* Pointer to network callbacks and context */ +#ifdef ENABLE_MQTT_TLS + MqttTls tls; /* WolfSSL context for TLS */ +#endif + + MqttMsgCb msg_cb; +} MqttClient; + + +/* Application Interfaces */ +/*! \brief Initializes the MqttClient structure + * \param client Pointer to MqttClient structure + (uninitialized is okay) + * \param net Pointer to MqttNet structure that has been + initialized with callback pointers and context + * \param msgCb Pointer to message callback function + * \param tx_buf Pointer to transmit buffer used during encoding + * \param tx_buf_len Maximum length of the transmit buffer + * \param rx_buf Pointer to receive buffer used during decoding + * \param rx_buf_len Maximum length of the receive buffer + * \param connect_timeout_ms + Maximum command wait timeout in milliseconds + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_BAD_ARG + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Init( + MqttClient *client, + MqttNet *net, + MqttMsgCb msg_cb, + byte *tx_buf, int tx_buf_len, + byte *rx_buf, int rx_buf_len, + int cmd_timeout_ms); + + +/*! \brief Encodes and sends the MQTT Connect packet and waits for the + Connect Acknowledgement packet + * \discussion This is a blocking function that will wait for MqttNet.read + * \param client Pointer to MqttClient structure + * \param connect Pointer to MqttConnect structure initialized + with connect parameters + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Connect( + MqttClient *client, + MqttConnect *connect); + +/*! \brief Encodes and sends the MQTT Publish packet and waits for the + Publish response (if QoS > 0) + * \discussion This is a blocking function that will wait for MqttNet.read + * If QoS level = 1 then will wait for PUBLISH_ACK. + * If QoS level = 2 then will wait for PUBLISH_REC then send + PUBLISH_REL and wait for PUBLISH_COMP. + * \param client Pointer to MqttClient structure + * \param publish Pointer to MqttPublish structure initialized + with message data + * Note: MqttPublish and MqttMessage are same structure. + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Publish( + MqttClient *client, + MqttPublish *publish); + +/*! \brief Encodes and sends the MQTT Subscribe packet and waits for the + Subscribe Acknowledgement packet + * \discussion This is a blocking function that will wait for MqttNet.read + * \param client Pointer to MqttClient structure + * \param subscribe Pointer to MqttSubscribe structure initialized with + subscription topic list and desired QoS. + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Subscribe( + MqttClient *client, + MqttSubscribe *subscribe); + +/*! \brief Encodes and sends the MQTT Unsubscribe packet and waits for the + Unsubscribe Acknowledgement packet + * \discussion This is a blocking function that will wait for MqttNet.read + * \param client Pointer to MqttClient structure + * \param unsubscribe Pointer to MqttUnsubscribe structure initialized + with topic list. + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Unsubscribe( + MqttClient *client, + MqttUnsubscribe *unsubscribe); + +/*! \brief Encodes and sends the MQTT Ping Request packet and waits for the + Ping Response packet + * \discussion This is a blocking function that will wait for MqttNet.read + * \param client Pointer to MqttClient structure + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Ping( + MqttClient *client); + +/*! \brief Encodes and sends the MQTT Disconnect packet (no response) + * \discussion This is a non-blocking function that will try and send using + MqttNet.write + * \param client Pointer to MqttClient structure + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_Disconnect( + MqttClient *client); + + +/*! \brief Waits for packets to arrive. Incomming publish messages + will arrive via callback provided in MqttClient_Init. + * \discussion This is a blocking function that will wait for MqttNet.read + * \param client Pointer to MqttClient structure + * \param timeout_ms Milliseconds until read timeout + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_WaitMessage( + MqttClient *client, + int timeout_ms); + + +/*! \brief Performs network connect with TLS (if use_tls is non-zero value) + * \discussion Will perform the MqttTlsCb callback if use_tls is non-zero value + * \param client Pointer to MqttClient structure + * \param host Address of the broker server + * \param port Optional custom port. If zero will use defaults + * \param use_tls If non-zero value will connect with and use TLS for + encryption of data + * \param cb A function callback for configuration of the SSL + context certificate checking + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_NetConnect( + MqttClient *client, + const char *host, + word16 port, + int timeout_ms, + int use_tls, + MqttTlsCb cb); + +/*! \brief Performs a network disconnect + * \param client Pointer to MqttClient structure + * \return MQTT_CODE_SUCCESS or MQTT_CODE_ERROR_* + (see enum MqttPacketResponseCodes) + */ +WOLFMQTT_API int MqttClient_NetDisconnect( + MqttClient *client); + +/*! \brief Performs lookup of the WOLFMQTT_API return values + * \param return_code The return value from a WOLFMQTT_API function + * \return String representation of the return code + */ +WOLFMQTT_API const char* MqttClient_ReturnCodeToString( + int return_code); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFMQTT_CLIENT_H */ diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_packet.h b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_packet.h new file mode 100755 index 0000000..9a28594 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_packet.h @@ -0,0 +1,354 @@ +/* mqtt_packet.h + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Implementation by: David Garske + * Based on specification for MQTT v3.1.1 + * See http://mqtt.org/documentation for additional MQTT documentation. + */ + +#ifndef WOLFMQTT_PACKET_H +#define WOLFMQTT_PACKET_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "wolfmqtt/mqtt_types.h" +#include "wolfmqtt/mqtt_socket.h" + + +/* Size of a data length elements in protocol */ +#define MQTT_DATA_LEN_SIZE 2 + + +/* QoS */ +typedef enum _MqttQoS { + MQTT_QOS_0 = 0, /* At most once delivery */ + MQTT_QOS_1 = 1, /* At least once delivery */ + MQTT_QOS_2 = 2, /* Exactly once delivery */ + MQTT_QOS_3 = 3, /* Reserved - must not be used */ +} MqttQoS; + + +/* Generic Message */ +typedef struct _MqttMessage { + word16 packet_id; + MqttQoS qos; + byte retain; + byte duplicate; + const char *topic_name; /* Pointer is valid only when msg_new set in callback */ + word16 topic_name_len; + word32 total_len; /* Payload total length */ + byte *buffer; /* Payload buffer */ + + /* Used internally for TX/RX */ + word32 buffer_len; /* Buffer length */ + word32 buffer_pos; /* Buffer position */ +} MqttMessage; + + +/* Topic */ +typedef struct _MqttTopic { + const char* topic_filter; + + /* These are only on subscribe */ + MqttQoS qos; /* Bits 0-1 = MqttQoS */ + byte return_code; /* MqttSubscribeAckReturnCodes */ +} MqttTopic; + +/* Topic naming */ +/* Be specific, use readable characters only. + * Use forward slashes to denote levels. + * Do not start name with forward slash (/) or $ (reserved for broker) + * Example: "main/sub/detail/unique" */ + +/* The forward slash is used to define levels of topic matching */ +#define TOPIC_LEVEL_SEPERATOR '/' + +/* These are available for Topic Filters on Subscribe only */ +/* The plus is used to match on a single level */ +/* Example: "user/home/+/light" */ +#define TOPIC_LEVEL_SINGLE '+' + +/* The hash is used to match on a multiple levels */ +/* Example: "user/home/#" */ +#define TOPIC_LEVEL_MULTI '#' + + +/* PACKET HEADER */ +/* Packet types: Located in first byte of packet in bits 4-7 */ +#define MQTT_PACKET_TYPE_GET(x) (((x) >> 4) & 0xF) +#define MQTT_PACKET_TYPE_SET(x) (((x) & 0xF) << 4) +typedef enum _MqttPacketType { + MQTT_PACKET_TYPE_RESERVED = 0, + MQTT_PACKET_TYPE_CONNECT = 1, + MQTT_PACKET_TYPE_CONNECT_ACK = 2, /* Acknowledgment */ + MQTT_PACKET_TYPE_PUBLISH = 3, + MQTT_PACKET_TYPE_PUBLISH_ACK = 4, /* Acknowledgment */ + MQTT_PACKET_TYPE_PUBLISH_REC = 5, /* Received */ + MQTT_PACKET_TYPE_PUBLISH_REL= 6, /* Release */ + MQTT_PACKET_TYPE_PUBLISH_COMP = 7, /* Complete */ + MQTT_PACKET_TYPE_SUBSCRIBE = 8, + MQTT_PACKET_TYPE_SUBSCRIBE_ACK = 9, /* Acknowledgment */ + MQTT_PACKET_TYPE_UNSUBSCRIBE = 10, + MQTT_PACKET_TYPE_UNSUBSCRIBE_ACK = 11, /* Acknowledgment */ + MQTT_PACKET_TYPE_PING_REQ = 12, /* Request */ + MQTT_PACKET_TYPE_PING_RESP = 13, /* Response */ + MQTT_PACKET_TYPE_DISCONNECT = 14, + MQTT_PACKET_TYPE_MAX = 15, +} MqttPacketType; + +/* Packet flag bit-mask: Located in first byte of packet in bits 0-3 */ +#define MQTT_PACKET_FLAGS_GET(x) ((x) & 0xF) +#define MQTT_PACKET_FLAGS_SET(x) (x) +#define MQTT_PACKET_FLAGS_GET_QOS(type_flags) \ + ((MQTT_PACKET_FLAGS_GET((type_flags)) & \ + MQTT_PACKET_FLAG_QOS_MASK) >> MQTT_PACKET_FLAG_QOS_SHIFT) +#define MQTT_PACKET_FLAGS_SET_QOS(qos) \ + (MQTT_PACKET_FLAGS_SET(((qos) << MQTT_PACKET_FLAG_QOS_SHIFT) & \ + MQTT_PACKET_FLAG_QOS_MASK)) +enum MqttPacketFlags { + MQTT_PACKET_FLAG_RETAIN = 0x1, + MQTT_PACKET_FLAG_QOS_SHIFT = 0x1, + MQTT_PACKET_FLAG_QOS_MASK = 0x6, + MQTT_PACKET_FLAG_DUPLICATE = 0x8, +}; + +/* Packet Header: Size is variable 2 - 5 bytes */ +#define MQTT_PACKET_MAX_LEN_BYTES 4 +#define MQTT_PACKET_LEN_ENCODE_MASK 0x80 +typedef struct _MqttPacket { + /* Type = bits 4-7, Flags = 0-3 are flags */ + byte type_flags; /* MqttPacketType and MqttPacketFlags */ + + /* Remaining Length: variable 1-4 bytes, encoded using scheme + where bit 7 = continuation bit */ + byte len[MQTT_PACKET_MAX_LEN_BYTES]; + + /* Then packet_id if type is PUBLISH through UNSUBSCRIBE_ACK */ + /* Packet Id: Included for types PUBLISH_ACK through UNSUBSCRIBE_ACK */ + /* Note: Also included in PUBLISH after topic field (see MqttPublish) */ + /* Must be non-zero value */ +} WOLFMQTT_PACK MqttPacket; +#define MQTT_PACKET_MAX_SIZE (int)sizeof(MqttPacket) + +/* CONNECT PACKET */ +/* Connect flag bit-mask: Located in byte 8 of the MqttConnect packet */ +#define MQTT_CONNECT_FLAG_GET_QOS(flags) \ + (((flags) MQTT_CONNECT_FLAG_WILL_QOS_MASK) >> \ + MQTT_CONNECT_FLAG_WILL_QOS_SHIFT) +#define MQTT_CONNECT_FLAG_SET_QOS(qos) \ + (((qos) << MQTT_CONNECT_FLAG_WILL_QOS_SHIFT) & \ + MQTT_CONNECT_FLAG_WILL_QOS_MASK) +enum MqttConnectFlags { + MQTT_CONNECT_FLAG_RESERVED = 0x01, + MQTT_CONNECT_FLAG_CLEAN_SESSION = 0x02, + MQTT_CONNECT_FLAG_WILL_FLAG = 0x04, + MQTT_CONNECT_FLAG_WILL_QOS_SHIFT = 3, + MQTT_CONNECT_FLAG_WILL_QOS_MASK = 0x18, + MQTT_CONNECT_FLAG_WILL_RETAIN = 0x20, + MQTT_CONNECT_FLAG_PASSWORD = 0x40, + MQTT_CONNECT_FLAG_USERNAME = 0x80, +}; + +/* Connect Protocol */ +/* Constant values for the protocol name and level */ +#define MQTT_CONNECT_PROTOCOL_NAME_LEN 4 +#define MQTT_CONNECT_PROTOCOL_NAME "MQTT" +#define MQTT_CONNECT_PROTOCOL_LEVEL 4 + +/* Initializer */ +#define MQTT_CONNECT_INIT \ + {{0, MQTT_CONNECT_PROTOCOL_NAME_LEN}, {'M', 'Q', 'T', 'T'}, \ + MQTT_CONNECT_PROTOCOL_LEVEL, 0, 0} + +/* Connect packet structure */ +typedef struct _MqttConnectPacket { + byte protocol_len[MQTT_DATA_LEN_SIZE]; + char protocol_name[MQTT_CONNECT_PROTOCOL_NAME_LEN]; + byte protocol_level; + byte flags; /* MqttConnectFlags */ + word16 keep_alive; /* Seconds */ +} WOLFMQTT_PACK MqttConnectPacket; + +/* CONNECT ACKNOWLEDGE PACKET */ +/* Connect Ack flags */ +enum MqttConnectAckFlags { + MQTT_CONNECT_ACK_FLAG_SESSION_PRESENT = 0x01, +}; + +/* Connect Ack return codes */ +enum MqttConnectAckReturnCodes { + /* Connection accepted */ + MQTT_CONNECT_ACK_CODE_ACCEPTED = 0, + + /* The Server does not support the level of the MQTT protocol requested + by the Client */ + MQTT_CONNECT_ACK_CODE_REFUSED_PROTO = 1, + + /* The Client identifier is correct UTF-8 but not allowed by the Server */ + MQTT_CONNECT_ACK_CODE_REFUSED_ID = 2, + + /* The Network Connection has been made but the MQTT service is + unavailable */ + MQTT_CONNECT_ACK_CODE_REFUSED_UNAVAIL = 3, + + /* The data in the user name or password is malformed */ + MQTT_CONNECT_ACK_CODE_REFUSED_BAD_USER_PWD = 4, + + /* The Client is not authorized to connect */ + MQTT_CONNECT_ACK_CODE_REFUSED_NOT_AUTH = 5, +}; + +/* Connect Ack packet structure */ +typedef struct _MqttConnectAck { + byte flags; /* MqttConnectAckFlags */ + byte return_code; /* MqttConnectAckCodes */ +} MqttConnectAck; +/* Connect Ack has no payload */ + +/* Connect */ +typedef struct _MqttConnect { + word16 keep_alive_sec; + byte clean_session; + const char *client_id; + + /* Optional Last will and testament */ + byte enable_lwt; + MqttMessage *lwt_msg; + + /* Optional login */ + const char *username; + const char *password; + + /* Ack data */ + MqttConnectAck ack; +} MqttConnect; + + +/* PUBLISH PACKET */ +/* PacketId sent only if QoS > 0 */ +typedef MqttMessage MqttPublish; /* Publish is message */ + + +/* PUBLISH RESPONSE PACKET */ +/* This is the response struct for PUBLISH_ACK, PUBLISH_REC and PUBLISH_COMP */ +/* If QoS = 0: No response */ +/* If QoS = 1: Expect response packet with type = + MQTT_PACKET_TYPE_PUBLISH_ACK */ +/* If QoS = 2: Expect response packet with type = + MQTT_PACKET_TYPE_PUBLISH_REC */ +/* Packet Id required if QoS is 1 or 2 */ +/* If Qos = 2: Send MQTT_PACKET_TYPE_PUBLISH_REL with PacketId to complete + QoS2 protcol exchange */ +/* Expect response packet with type = MQTT_PACKET_TYPE_PUBLISH_COMP */ +typedef struct _MqttPublishResp { + word16 packet_id; +} MqttPublishResp; + +/* SUBSCRIBE PACKET */ +/* Packet Id followed by contiguous list of topics w/Qos to subscribe to. */ +typedef struct _MqttSubscribe { + word16 packet_id; + int topic_count; + MqttTopic *topics; +} MqttSubscribe; + +/* SUBSCRIBE ACK PACKET */ +/* Packet Id followed by list of return codes coorisponding to subscription + topic list sent. */ +enum MqttSubscribeAckReturnCodes { + MQTT_SUBSCRIBE_ACK_CODE_SUCCESS_MAX_QOS0 = 0, + MQTT_SUBSCRIBE_ACK_CODE_SUCCESS_MAX_QOS1 = 1, + MQTT_SUBSCRIBE_ACK_CODE_SUCCESS_MAX_QOS2 = 2, + MQTT_SUBSCRIBE_ACK_CODE_FAILURE = 0x80, +}; +typedef struct _MqttSubscribeAck { + word16 packet_id; + byte *return_codes; /* MqttSubscribeAckReturnCodes */ +} MqttSubscribeAck; + + +/* UNSUBSCRIBE PACKET */ +/* Packet Id followed by contiguous list of topics to unsubscribe from. */ +typedef MqttSubscribe MqttUnsubscribe; + + +/* UNSUBSCRIBE RESPONSE ACK */ +/* No response payload (besides packet Id) */ +typedef struct _MqttUnsubscribeAck { + word16 packet_id; +} MqttUnsubscribeAck; + + +/* PING / PING RESPONSE PACKETS */ +/* Fixed header "MqttPacket" only. No variable header or payload */ + + +/* MQTT PACKET APPLICATION INTERFACE */ +struct _MqttClient; +/* Packet Read/Write */ +int MqttPacket_Write(struct _MqttClient *client, byte* tx_buf, int tx_buf_len); +int MqttPacket_Read(struct _MqttClient *client, byte* rx_buf, int rx_buf_len, + int timeout_ms); + +/* Packet Element Encoders/Decoders */ +int MqttDecode_RemainLen(MqttPacket *header, int buf_len, int *remain_len); +int MqttEncode_RemainLen(MqttPacket *header, int buf_len, int remain_len); + +int MqttDecode_Num(byte* buf, word16 *len); +int MqttEncode_Num(byte *buf, word16 len); + +int MqttDecode_String(byte *buf, const char **pstr, word16 *pstr_len); +int MqttEncode_String(byte *buf, const char *str); + +int MqttEncode_Data(byte *buf, const byte *data, word16 data_len); + +/* Packet Encoders/Decoders */ +int MqttEncode_Connect(byte *tx_buf, int tx_buf_len, + MqttConnect *connect); +int MqttDecode_ConenctAck(byte *rx_buf, int rx_buf_len, + MqttConnectAck *connect_ack); +int MqttEncode_Publish(byte *tx_buf, int tx_buf_len, + MqttPublish *publish); +int MqttDecode_Publish(byte *rx_buf, int rx_buf_len, + MqttPublish *publish); +int MqttEncode_PublishResp(byte* tx_buf, int tx_buf_len, byte type, + MqttPublishResp *publish_resp); +int MqttDecode_PublishResp(byte* rx_buf, int rx_buf_len, byte type, + MqttPublishResp *publish_resp); +int MqttEncode_Subscribe(byte *tx_buf, int tx_buf_len, MqttSubscribe *subscribe); +int MqttDecode_SubscribeAck(byte* rx_buf, int rx_buf_len, + MqttSubscribeAck *subscribe_ack); +int MqttEncode_Unsubscribe(byte *tx_buf, int tx_buf_len, + MqttUnsubscribe *unsubscribe); +int MqttDecode_UnsubscribeAck(byte *rx_buf, int rx_buf_len, + MqttUnsubscribeAck *unsubscribe_ack); +int MqttEncode_Ping(byte *tx_buf, int tx_buf_len); +int MqttDecode_Ping(byte *rx_buf, int rx_buf_len); +int MqttEncode_Disconnect(byte *tx_buf, int tx_buf_len); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFMQTT_PACKET_H */ diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_socket.h b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_socket.h new file mode 100755 index 0000000..5c10c8a --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_socket.h @@ -0,0 +1,97 @@ +/* mqtt_socket.h + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Implementation by: David Garske + * Based on specification for MQTT v3.1.1 + * See http://mqtt.org/documentation for additional MQTT documentation. + */ + +#ifndef WOLFMQTT_SOCKET_H +#define WOLFMQTT_SOCKET_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Options */ +/* Use without WolfSSL (on by default) */ +//#define ENABLE_MQTT_TLS + +#include "wolfmqtt/mqtt_types.h" +#ifdef ENABLE_MQTT_TLS +#include +#include +#include +#endif + +/* Default Port Numbers */ +#define MQTT_DEFAULT_PORT 1883 +#define MQTT_SECURE_PORT 8883 + + +struct _MqttClient; + +/* Function callbacks */ +typedef int (*MqttTlsCb)(struct _MqttClient* client); + +typedef int (*MqttNetConnectCb)(void *context, + const char* host, word16 port, int timeout_ms); +typedef int (*MqttNetWriteCb)(void *context, + const byte* buf, int buf_len, int timeout_ms); +typedef int (*MqttNetReadCb)(void *context, + byte* buf, int buf_len, int timeout_ms); +typedef int (*MqttNetDisconnectCb)(void *context); + +/* Strucutre for Network Security */ +#ifdef ENABLE_MQTT_TLS +typedef struct _MqttTls { + WOLFSSL_CTX *ctx; + WOLFSSL *ssl; +} MqttTls; +#endif + +/* Structure for Network callbacks */ +typedef struct _MqttNet { + void *context; + MqttNetConnectCb connect; + MqttNetReadCb read; + MqttNetWriteCb write; + MqttNetDisconnectCb disconnect; +} MqttNet; + + +/* MQTT SOCKET APPLICATION INTERFACE */ +int MqttSocket_Init(struct _MqttClient *client, MqttNet* net); +int MqttSocket_Write(struct _MqttClient *client, const byte* buf, int buf_len, + int timeout_ms); +int MqttSocket_Read(struct _MqttClient *client, byte* buf, int buf_len, + int timeout_ms); + +int MqttSocket_Connect(struct _MqttClient *client, const char* host, + word16 port, int timeout_ms, int use_tls, MqttTlsCb cb); +int MqttSocket_Disconnect(struct _MqttClient *client); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFMQTT_SOCKET_H */ diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_types.h b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_types.h new file mode 100755 index 0000000..102a10b --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/mqtt_types.h @@ -0,0 +1,144 @@ +/* mqtt_types.h + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Implementation by: David Garske + * Based on specification for MQTT v3.1.1 + * See http://mqtt.org/documentation for additional MQTT documentation. + */ + +#ifndef WOLFMQTT_TYPES_H +#define WOLFMQTT_TYPES_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "wolfmqtt/visibility.h" + +/* Endianess check */ +#if defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN_ORDER) + #error Big Endian is not yet supported. Please contact us if \ + you are interested in this feature. +#endif + +#ifdef _WIN32 + #define USE_WINDOWS_API + + /* Make sure a level of Win compatibility is defined */ + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif +#endif + +#ifndef WOLFMQTT_NO_STDIO + #include +#endif + +/* Allow custom override of data types */ +#ifndef WOLFMQTT_CUSTOM_TYPES + /* Basic Types */ + #ifndef byte + typedef unsigned char byte; + #endif + #ifndef word16 + typedef unsigned short word16; + #endif + #ifndef word32 + typedef unsigned int word32; + #endif +#endif + +/* Response Codes */ +enum MqttPacketResponseCodes { + MQTT_CODE_SUCCESS = 0, + MQTT_CODE_ERROR_BAD_ARG = -1, + MQTT_CODE_ERROR_OUT_OF_BUFFER = -2, + MQTT_CODE_ERROR_MALFORMED_DATA = -3, /* Error (Malformed Remaining Len) */ + MQTT_CODE_ERROR_PACKET_TYPE = -4, + MQTT_CODE_ERROR_PACKET_ID = -5, + MQTT_CODE_ERROR_TLS_CONNECT = -6, + MQTT_CODE_ERROR_TIMEOUT = -7, + MQTT_CODE_ERROR_NETWORK = -8, +}; + + +/* Standard wrappers */ +#ifndef WOLFMQTT_CUSTOM_STRING + #include + #ifndef XSTRLEN + #define XSTRLEN(s1) strlen((s1)) + #endif + #ifndef XSTRCHR + #define XSTRCHR(s,c) strchr((s),(c)) + #endif + #ifndef XSTRCMP + #define XSTRCMP(s1,s2) strcmp((s1),(s2)) + #endif + #ifndef XMEMCPY + #define XMEMCPY(d,s,l) memcpy((d),(s),(l)) + #endif + #ifndef XMEMSET + #define XMEMSET(b,c,l) memset((b),(c),(l)) + #endif + #ifndef XATOI + #define XATOI(s) atoi((s)) + #endif +#endif + +#ifndef WOLFMQTT_CUSTOM_MALLOC + #ifndef WOLFMQTT_MALLOC + #define WOLFMQTT_MALLOC(s) malloc((s)) + #endif + #ifndef WOLFMQTT_FREE + #define WOLFMQTT_FREE(p) {void* xp = (p); if((xp)) free((xp));} + #endif +#endif + +#ifndef WOLFMQTT_PACK + #if defined(__GNUC__) + #define WOLFMQTT_PACK __attribute__ ((packed)) + #else + #define WOLFMQTT_PACK + #endif +#endif + +/* use inlining if compiler allows */ +#ifndef INLINE +#ifndef NO_INLINE + #if defined(__GNUC__) || defined(__MINGW32__) || defined(__IAR_SYSTEMS_ICC__) + #define INLINE inline + #elif defined(_MSC_VER) + #define INLINE __inline + #elif defined(THREADX) + #define INLINE _Inline + #else + #define INLINE + #endif +#else + #define INLINE +#endif /* !NO_INLINE */ +#endif /* !INLINE */ + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFMQTT_TYPES_H */ diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h new file mode 100755 index 0000000..ed4f46f --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h @@ -0,0 +1,42 @@ +/* version.h.in + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +/* + * The version header provides the current version number to the code + * based and is updated automatically by the configure script. A copy + * of the last generated copy of version.h is included with the + * distribution for environments that do not use configure. + */ + + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define LIBWOLFMQTT_VERSION_STRING "0.6" +#define LIBWOLFMQTT_VERSION_HEX 0x00006000 + +#ifdef __cplusplus +} +#endif diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h.in b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h.in new file mode 100755 index 0000000..100aab7 --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/version.h.in @@ -0,0 +1,42 @@ +/* version.h.in + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +/* + * The version header provides the current version number to the code + * based and is updated automatically by the configure script. A copy + * of the last generated copy of version.h is included with the + * distribution for environments that do not use configure. + */ + + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define LIBWOLFMQTT_VERSION_STRING "@VERSION@" +#define LIBWOLFMQTT_VERSION_HEX @HEX_VERSION@ + +#ifdef __cplusplus +} +#endif diff --git a/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/visibility.h b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/visibility.h new file mode 100755 index 0000000..abdfd9d --- /dev/null +++ b/software/aws-iot-ethernet/firmware/src/wolfmqttsdk/wolfmqtt/visibility.h @@ -0,0 +1,61 @@ +/* visibility.h + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfMQTT. + * + * wolfMQTT is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfMQTT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Visibility control macros */ + +#ifndef WOLFMQTT_VISIBILITY_H +#define WOLFMQTT_VISIBILITY_H + +/* WOLFMQTT_API is used for the public API symbols. + It either imports or exports (or does nothing for static builds) + + WOLFMQTT_LOCAL is used for non-API symbols (private). +*/ + +#if defined(BUILDING_WOLFMQTT) + #if defined(HAVE_VISIBILITY) && HAVE_VISIBILITY + #define WOLFMQTT_API __attribute__ ((visibility("default"))) + #define WOLFMQTT_LOCAL __attribute__ ((visibility("hidden"))) + #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) + #define WOLFMQTT_API __global + #define WOLFMQTT_LOCAL __hidden + #elif defined(_MSC_VER) + #ifdef _WINDLL + #define WOLFMQTT_API __declspec(dllexport) + #else + #define WOLFMQTT_API + #endif + #define WOLFMQTT_LOCAL + #else + #define WOLFMQTT_API + #define WOLFMQTT_LOCAL + #endif /* HAVE_VISIBILITY */ +#else /* BUILDING_WOLFMQTT */ + #if defined(_MSC_VER) + #define WOLFMQTT_API __declspec(dllimport) + #define WOLFMQTT_LOCAL + #else + #define WOLFMQTT_API + #define WOLFMQTT_LOCAL + #endif +#endif /* BUILDING_WOLFMQTT */ + +#endif /* WOLFMQTT_VISIBILITY_H */