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 0000000..b641242 Binary files /dev/null and b/documents/harmony_license_v1.07.01.pdf differ diff --git a/documents/images/DM990004.png b/documents/images/DM990004.png new file mode 100644 index 0000000..bc0da75 Binary files /dev/null and b/documents/images/DM990004.png differ diff --git a/documents/images/generateCode.png b/documents/images/generateCode.png new file mode 100644 index 0000000..d89361a Binary files /dev/null and b/documents/images/generateCode.png differ diff --git a/documents/images/program_icon.png b/documents/images/program_icon.png new file mode 100644 index 0000000..ede683e Binary files /dev/null and b/documents/images/program_icon.png differ 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 0000000..ba0ed3d Binary files /dev/null and b/hardware/iot-ethernet-schematic.pdf differ 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 0000000..3782920 Binary files /dev/null and b/software/aws-iot-ethernet/firmware/src/configuration_webpage/DynRcrd.bin differ 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 0000000..88bf41c Binary files /dev/null and b/software/aws-iot-ethernet/firmware/src/configuration_webpage/FileRcrd.bin differ 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 0000000..39dc36d Binary files /dev/null and b/software/aws-iot-ethernet/firmware/src/configuration_webpage/images/mchp.gif differ 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 */