summaryrefslogtreecommitdiff
path: root/boards/ek-tm4c1294xl/enet_weather
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2014-03-16 14:31:22 +0200
committerYuval Adam <yuv.adm@gmail.com>2014-03-16 14:31:22 +0200
commitac4fd8e8340886f455add8cf92ee1c8458b8ae19 (patch)
treefdeb96af9d57573855405fb5099468244772cd49 /boards/ek-tm4c1294xl/enet_weather
parent821e3405f23958760f7c27e8934940abfed3d5cb (diff)
Add ek-tm4c1294xl example projects
Diffstat (limited to 'boards/ek-tm4c1294xl/enet_weather')
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/Makefile105
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/.ccsimportspec19
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/.ccsproject10
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/.cproject207
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/.project110
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs3
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.binbin0 -> 41344 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.outbin0 -> 724820 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/macros.ini_initial1
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ccs/target_config.ccxml13
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/commands.c206
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/commands.h57
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/debug.h38
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.c1249
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.ewd614
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.ewp837
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.h133
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.icf78
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.ld57
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.sct47
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.uvopt457
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather.uvproj484
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/enet_weather_ccs.cmd70
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/eth_client.c1310
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/eth_client.h163
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.binbin0 -> 37604 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.outbin0 -> 592688 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.axfbin0 -> 123805 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.binbin0 -> 42098 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/images.c111
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/images.h42
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/json.c843
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/json.h41
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/lwipopts.h443
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/readme.txt48
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.axfbin0 -> 388988 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.binbin0 -> 38668 bytes
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/startup_ccs.c277
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/startup_ewarm.c308
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/startup_gcc.c324
-rw-r--r--boards/ek-tm4c1294xl/enet_weather/startup_rvmdk.S333
41 files changed, 9038 insertions, 0 deletions
diff --git a/boards/ek-tm4c1294xl/enet_weather/Makefile b/boards/ek-tm4c1294xl/enet_weather/Makefile
new file mode 100644
index 0000000..9366221
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/Makefile
@@ -0,0 +1,105 @@
+#******************************************************************************
+#
+# Makefile - Rules for building the Sample Ethernet Weather Application using lwIP 1.4.1.
+#
+# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+# Software License Agreement
+#
+# Texas Instruments (TI) is supplying this software for use solely and
+# exclusively on TI's microcontroller products. The software is owned by
+# TI and/or its suppliers, and is protected under applicable copyright
+# laws. You may not combine this software with "viral" open-source
+# software in order to form a larger program.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+# DAMAGES, FOR ANY REASON WHATSOEVER.
+#
+# This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+#
+#******************************************************************************
+
+#
+# Defines the part type that this project uses.
+#
+PART=TM4C1294NCPDT
+
+#
+# The base directory for TivaWare.
+#
+ROOT=../../../..
+
+#
+# Include the common make definitions.
+#
+include ${ROOT}/makedefs
+
+#
+# Where to find source files that do not live in this directory.
+#
+VPATH=../drivers
+VPATH+=../../../../third_party/lwip-1.4.1/apps/httpserver_raw
+VPATH+=../../../../utils
+
+#
+# Where to find header files that do not live in the source directory.
+#
+IPATH=.
+IPATH+=..
+IPATH+=../../../..
+IPATH+=../../../../third_party/lwip-1.4.1/apps
+IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include
+IPATH+=../../../../third_party/lwip-1.4.1/src/include
+IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4
+IPATH+=../../../../third_party
+
+#
+# The default rule, which causes the Sample Ethernet Weather Application using lwIP 1.4.1 to be built.
+#
+all: ${COMPILER}
+all: ${COMPILER}/enet_weather.axf
+
+#
+# The rule to clean out all the build products.
+#
+clean:
+ @rm -rf ${COMPILER} ${wildcard *~}
+
+#
+# The rule to create the target directory.
+#
+${COMPILER}:
+ @mkdir -p ${COMPILER}
+
+#
+# Rules for building the Sample Ethernet Weather Application using lwIP 1.4.1.
+#
+${COMPILER}/enet_weather.axf: ${COMPILER}/cmdline.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/commands.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/enet_weather.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/eth_client.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/flash_pb.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/http.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/images.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/json.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/locator.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/lwiplib.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/pinout.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/startup_${COMPILER}.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/uartstdio.o
+${COMPILER}/enet_weather.axf: ${COMPILER}/ustdlib.o
+${COMPILER}/enet_weather.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a
+${COMPILER}/enet_weather.axf: enet_weather.ld
+SCATTERgcc_enet_weather=enet_weather.ld
+ENTRY_enet_weather=ResetISR
+CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DLWIP_1_4_1 -DUSE_HTTP_1_0 -DUART_BUFFERED
+
+#
+# Include the automatically generated dependency files.
+#
+ifneq (${MAKECMDGOALS},clean)
+-include ${wildcard ${COMPILER}/*.d} __dummy__
+endif
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/.ccsimportspec b/boards/ek-tm4c1294xl/enet_weather/ccs/.ccsimportspec
new file mode 100644
index 0000000..3ddafa9
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/.ccsimportspec
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<importSpec>
+ <source root="..">
+ <file name="debug.h"/>
+ <file name="eth_client.c"/>
+ <file name="eth_client.h"/>
+ <file name="json.c"/>
+ <file name="json.h"/>
+ <file name="images.c"/>
+ <file name="images.h"/>
+ <file name="lwipopts.h"/>
+ <file name="enet_weather.c"/>
+ <file name="enet_weather.h"/>
+ <file name="commands.c"/>
+ <file name="commands.h"/>
+ <file regex=".*_ccs\.cmd"/>
+ <file name="startup_ccs.c"/>
+ </source>
+</importSpec>
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/.ccsproject b/boards/ek-tm4c1294xl/enet_weather/ccs/.ccsproject
new file mode 100644
index 0000000..ac3158a
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/.ccsproject
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<?ccsproject version="1.0"?>
+<projectOptions>
+ <deviceVariant value="Cortex M.TM4C1294NCPDT"/>
+ <deviceFamily value="TMS470"/>
+ <deviceEndianness value="little"/>
+ <codegenToolVersion value="5.0.4"/>
+ <isElfFormat value="true"/>
+ <rts value="libc.a"/>
+</projectOptions>
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/.cproject b/boards/ek-tm4c1294xl/enet_weather/ccs/.cproject
new file mode 100644
index 0000000..7343a53
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/.cproject
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule configRelations="2" moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1324437594">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1324437594" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <macros>
+ <stringMacro name="SW_ROOT" type="VALUE_PATH_DIR" value="${PROJECT_ROOT}/../../../../.."/>
+ </macros>
+ <externalSettings/>
+ <extensions>
+ <extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1324437594" name="Debug" parent="com.ti.ccstudio.buildDefinitions.TMS470.Debug" postbuildStep="&quot;${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin&quot; &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; &quot;${CG_TOOL_ROOT}/bin/armofd&quot; &quot;${CG_TOOL_ROOT}/bin/armhex&quot; &quot;${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin&quot;">
+ <folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1324437594." name="/" resourcePath="">
+ <toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.DebugToolchain.2105722780" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.linkerDebug.243696675">
+ <option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1918766728" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
+ <listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.TM4C1294NCPDT"/>
+ <listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
+ <listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
+ <listOptionValue builtIn="false" value="CCS_MBS_VERSION=5.1.0.01"/>
+ <listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
+ <listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.851099209" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="5.0.4" valueType="string"/>
+ <targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.targetPlatformDebug.1914224047" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.targetPlatformDebug"/>
+ <builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.builderDebug.1011827598" name="GNU Make.Debug" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.builderDebug"/>
+ <tool id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.compilerDebug.217617681" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.compilerDebug">
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.SILICON_VERSION.739827396" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.SILICON_VERSION.7M4" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.CODE_STATE.1120693308" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.CODE_STATE" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.CODE_STATE.16" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.ABI.1604310843" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.ABI.eabi" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.FLOAT_SUPPORT.1792839480" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.FLOAT_SUPPORT.FPv4SPD16" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEBUGGING_MODEL.2014728779" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WARNING.2025393544" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WARNING" valueType="stringList">
+ <listOptionValue builtIn="false" value="225"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DISPLAY_ERROR_NUMBER.278108486" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WRAP.612918288" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.INCLUDE_PATH.956613359" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.INCLUDE_PATH" valueType="includePath">
+ <listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/examples/boards/ek-tm4c1294xl&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/src/include&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/src/include/ipv4&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/apps&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/ports/tiva-tm4c129/include&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party&quot;"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.LITTLE_ENDIAN.2070695006" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.LITTLE_ENDIAN" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GEN_FUNC_SUBSECTIONS.1585717138" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GEN_FUNC_SUBSECTIONS" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GEN_FUNC_SUBSECTIONS.on" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.OPT_LEVEL.1735022790" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.OPT_LEVEL.2" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GCC.1934434898" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GCC" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.UAL.115284201" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.UAL" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEFINE.1538943609" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEFINE" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="ccs=&quot;ccs&quot;"/>
+ <listOptionValue builtIn="false" value="PART_TM4C1294NCPDT"/>
+ <listOptionValue builtIn="false" value="TARGET_IS_TM4C129_RA0"/>
+ <listOptionValue builtIn="false" value="LWIP_1_4_1"/>
+ <listOptionValue builtIn="false" value="USE_HTTP_1_0"/>
+ <listOptionValue builtIn="false" value="UART_BUFFERED"/>
+ </option>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__C_SRCS.775647009" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__C_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__CPP_SRCS.1301501270" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__CPP_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM_SRCS.127563089" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM2_SRCS.587777491" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM2_SRCS"/>
+ </tool>
+ <tool id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.linkerDebug.243696675" name="ARM Linker" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.linkerDebug">
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.MAP_FILE.1972377336" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.MAP_FILE" value="&quot;enet_weather_ccs.map&quot;" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.STACK_SIZE.1554580473" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.STACK_SIZE" value="2048" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.HEAP_SIZE.1994860253" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.HEAP_SIZE" value="0" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.OUTPUT_FILE.854358987" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.OUTPUT_FILE" value="&quot;${ProjName}.out&quot;" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.XML_LINK_INFO.637880952" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.XML_LINK_INFO" value="&quot;${ProjName}_linkInfo.xml&quot;" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DISPLAY_ERROR_NUMBER.1056037665" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DIAG_WRAP.1591917358" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.SEARCH_PATH.1550344319" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.SEARCH_PATH" valueType="libPaths">
+ <listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.LIBRARY.1886383806" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.LIBRARY" valueType="libs">
+ <listOptionValue builtIn="false" value="&quot;libc.a&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/driverlib/ccs/Debug/driverlib.lib&quot;"/>
+ </option>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD_SRCS.1352479960" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD2_SRCS.1138948545" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD2_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__GEN_CMDS.1623339762" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__GEN_CMDS"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ <cconfiguration id="com.ti.ccstudio.buildDefinitions.TMS470.Release.1650374307">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.TMS470.Release.1650374307" moduleId="org.eclipse.cdt.core.settings" name="Release">
+ <macros>
+ <stringMacro name="SW_ROOT" type="VALUE_PATH_DIR" value="${PROJECT_ROOT}/../../../../.."/>
+ </macros>
+ <externalSettings/>
+ <extensions>
+ <extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.TMS470.Release.1650374307" name="Release" parent="com.ti.ccstudio.buildDefinitions.TMS470.Release" postbuildStep="&quot;${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin&quot; &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; &quot;${CG_TOOL_ROOT}/bin/armofd&quot; &quot;${CG_TOOL_ROOT}/bin/armhex&quot; &quot;${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin&quot;">
+ <folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Release.1650374307." name="/" resourcePath="">
+ <toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.ReleaseToolchain.784541489" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.ReleaseToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.linkerRelease.947493936">
+ <option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.694257147" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
+ <listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.TM4C1294NCPDT"/>
+ <listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
+ <listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
+ <listOptionValue builtIn="false" value="CCS_MBS_VERSION=5.1.0.01"/>
+ <listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
+ <listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.570938180" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="5.0.4" valueType="string"/>
+ <targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.targetPlatformRelease.1547722458" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.targetPlatformRelease"/>
+ <builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.builderRelease.566156004" name="GNU Make.Release" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.builderRelease"/>
+ <tool id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.compilerRelease.1125141544" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.compilerRelease">
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.SILICON_VERSION.823021419" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.SILICON_VERSION.7M4" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.CODE_STATE.1784603385" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.CODE_STATE" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.CODE_STATE.16" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.ABI.1103957328" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.ABI.eabi" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.FLOAT_SUPPORT.291122974" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.FLOAT_SUPPORT.FPv4SPD16" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WARNING.570219905" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WARNING" valueType="stringList">
+ <listOptionValue builtIn="false" value="225"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DISPLAY_ERROR_NUMBER.256118968" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WRAP.21279110" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.INCLUDE_PATH.2069795972" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.INCLUDE_PATH" valueType="includePath">
+ <listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/examples/boards/ek-tm4c1294xl&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/src/include&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/src/include/ipv4&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/apps&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party/lwip-1.4.1/ports/tiva-tm4c129/include&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/third_party&quot;"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.LITTLE_ENDIAN.1469350687" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.LITTLE_ENDIAN" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GEN_FUNC_SUBSECTIONS.1429538938" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GEN_FUNC_SUBSECTIONS" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GEN_FUNC_SUBSECTIONS.on" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GCC.1634784464" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.GCC" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.UAL.595537963" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.UAL" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEFINE.1768368596" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compilerID.DEFINE" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="ccs=&quot;ccs&quot;"/>
+ <listOptionValue builtIn="false" value="PART_TM4C1294NCPDT"/>
+ <listOptionValue builtIn="false" value="TARGET_IS_TM4C129_RA0"/>
+ <listOptionValue builtIn="false" value="LWIP_1_4_1"/>
+ <listOptionValue builtIn="false" value="USE_HTTP_1_0"/>
+ <listOptionValue builtIn="false" value="UART_BUFFERED"/>
+ </option>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__C_SRCS.820525957" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__C_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__CPP_SRCS.377150739" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__CPP_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM_SRCS.1882576465" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM2_SRCS.133472805" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.compiler.inputType__ASM2_SRCS"/>
+ </tool>
+ <tool id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.linkerRelease.947493936" name="ARM Linker" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exe.linkerRelease">
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.MAP_FILE.1982430394" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.MAP_FILE" value="&quot;enet_weather_ccs.map&quot;" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.STACK_SIZE.1953298501" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.STACK_SIZE" value="2048" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.HEAP_SIZE.532100332" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.HEAP_SIZE" value="0" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.OUTPUT_FILE.973447330" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.OUTPUT_FILE" value="&quot;${ProjName}.out&quot;" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.XML_LINK_INFO.1956916904" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.XML_LINK_INFO" value="&quot;${ProjName}_linkInfo.xml&quot;" valueType="string"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DISPLAY_ERROR_NUMBER.711083209" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DIAG_WRAP.887921259" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.SEARCH_PATH.1795372803" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.SEARCH_PATH" valueType="libPaths">
+ <listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>
+ </option>
+ <option id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.LIBRARY.1817630689" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.linkerID.LIBRARY" valueType="libs">
+ <listOptionValue builtIn="false" value="&quot;libc.a&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${SW_ROOT}/driverlib/ccs/Debug/driverlib.lib&quot;"/>
+ </option>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD_SRCS.1259634722" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD2_SRCS.862665807" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__CMD2_SRCS"/>
+ <inputType id="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__GEN_CMDS.552456414" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.0.exeLinker.inputType__GEN_CMDS"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="enet_weather.com.ti.ccstudio.buildDefinitions.TMS470.ProjectType.1299004324" name="ARM" projectType="com.ti.ccstudio.buildDefinitions.TMS470.ProjectType"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping">
+ <project-mappings>
+ <content-type-mapping configuration="" content-type="org.eclipse.cdt.core.asmSource" language="com.ti.ccstudio.core.TIASMLanguage"/>
+ <content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cHeader" language="com.ti.ccstudio.core.TIGCCLanguage"/>
+ <content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cSource" language="com.ti.ccstudio.core.TIGCCLanguage"/>
+ <content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cxxHeader" language="com.ti.ccstudio.core.TIGPPLanguage"/>
+ <content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cxxSource" language="com.ti.ccstudio.core.TIGPPLanguage"/>
+ </project-mappings>
+ </storageModule>
+</cproject>
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/.project b/boards/ek-tm4c1294xl/enet_weather/ccs/.project
new file mode 100644
index 0000000..eef9f45
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/.project
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>enet_weather</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.ti.ccstudio.core.ccsNature</nature>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>commands.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/commands.c</locationURI>
+ </link>
+ <link>
+ <name>enet_weather.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/enet_weather.c</locationURI>
+ </link>
+ <link>
+ <name>enet_weather_ccs.cmd</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/enet_weather_ccs.cmd</locationURI>
+ </link>
+ <link>
+ <name>eth_client.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/eth_client.c</locationURI>
+ </link>
+ <link>
+ <name>images.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/images.c</locationURI>
+ </link>
+ <link>
+ <name>json.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/json.c</locationURI>
+ </link>
+ <link>
+ <name>startup_ccs.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/enet_weather/startup_ccs.c</locationURI>
+ </link>
+ <link>
+ <name>drivers/http.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/drivers/http.c</locationURI>
+ </link>
+ <link>
+ <name>drivers/pinout.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/examples/boards/ek-tm4c1294xl/drivers/pinout.c</locationURI>
+ </link>
+ <link>
+ <name>utils/cmdline.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/utils/cmdline.c</locationURI>
+ </link>
+ <link>
+ <name>utils/flash_pb.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/utils/flash_pb.c</locationURI>
+ </link>
+ <link>
+ <name>utils/locator.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/utils/locator.c</locationURI>
+ </link>
+ <link>
+ <name>utils/lwiplib.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/utils/lwiplib.c</locationURI>
+ </link>
+ <link>
+ <name>utils/uartstdio.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/utils/uartstdio.c</locationURI>
+ </link>
+ <link>
+ <name>utils/ustdlib.c</name>
+ <type>1</type>
+ <locationURI>SW_ROOT/utils/ustdlib.c</locationURI>
+ </link>
+ </linkedResources>
+ <variableList>
+ <variable>
+ <name>SW_ROOT</name>
+ <value>$%7BPARENT-5-PROJECT_LOC%7D</value>
+ </variable>
+ </variableList>
+</projectDescription>
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c1294xl/enet_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs
new file mode 100644
index 0000000..98b6350
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+inEditor=false
+onBuild=false
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.bin b/boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.bin
new file mode 100644
index 0000000..46c3495
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.bin
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.out b/boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.out
new file mode 100644
index 0000000..a78e194
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/Debug/enet_weather.out
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/macros.ini_initial b/boards/ek-tm4c1294xl/enet_weather/ccs/macros.ini_initial
new file mode 100644
index 0000000..31214b5
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/macros.ini_initial
@@ -0,0 +1 @@
+SW_ROOT = ../../../../..
diff --git a/boards/ek-tm4c1294xl/enet_weather/ccs/target_config.ccxml b/boards/ek-tm4c1294xl/enet_weather/ccs/target_config.ccxml
new file mode 100644
index 0000000..7a583d5
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ccs/target_config.ccxml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<configurations XML_version="1.2" id="configurations_0">
+ <configuration XML_version="1.2" id="Stellaris In-Circuit Debug Interface_0">
+ <instance XML_version="1.2" desc="Stellaris In-Circuit Debug Interface_0" href="connections/Stellaris_ICDI_Connection.xml" id="Stellaris In-Circuit Debug Interface_0" xml="Stellaris_ICDI_Connection.xml" xmlpath="connections"/>
+ <connection XML_version="1.2" id="Stellaris In-Circuit Debug Interface_0">
+ <instance XML_version="1.2" href="drivers/stellaris_cs_dap.xml" id="drivers" xml="stellaris_cs_dap.xml" xmlpath="drivers"/>
+ <instance XML_version="1.2" href="drivers/stellaris_cortex_m4.xml" id="drivers" xml="stellaris_cortex_m4.xml" xmlpath="drivers"/>
+ <platform XML_version="1.2" id="platform_0">
+ <instance XML_version="1.2" desc="Stellaris TM4C1294NCPDT_0" href="devices/tm4c1294ncpdt.xml" id="Stellaris TM4C1294NCPDT_0" xml="tm4c1294ncpdt.xml" xmlpath="devices"/>
+ </platform>
+ </connection>
+ </configuration>
+</configurations>
diff --git a/boards/ek-tm4c1294xl/enet_weather/commands.c b/boards/ek-tm4c1294xl/enet_weather/commands.c
new file mode 100644
index 0000000..710db50
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/commands.c
@@ -0,0 +1,206 @@
+//*****************************************************************************
+//
+// commands.c - Command line functions for the qs-cloud demo
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "driverlib/sysctl.h"
+#include "utils/cmdline.h"
+#include "utils/uartstdio.h"
+#include "utils/ustdlib.h"
+#include "commands.h"
+#include "enet_weather.h"
+
+extern uint32_t g_ui32ShowCities;
+extern uint32_t g_ui32ProcessingCmds;
+extern uint32_t g_ui32IPaddr;
+extern sParameters g_sConfig;
+extern char g_pcIPAddr[20];
+extern void UpdateCity(uint32_t ui32Idx, bool bDraw);
+extern void PrintIPAddress(char *pcAddr, uint32_t ipaddr);
+extern void ProxyEnable(void);
+
+//*****************************************************************************
+//
+// This is the table that holds the command names, implementing functions, and
+// brief description.
+//
+//*****************************************************************************
+tCmdLineEntry g_psCmdTable[] =
+{
+ { "help", Cmd_help, ": Display list of commands" },
+ { "h", Cmd_help, ": alias for help" },
+ { "?", Cmd_help, ": alias for help" },
+ { "scroll", Cmd_cityscroll, ": Scroll the cities"},
+ { "setproxy", Cmd_setproxy, ": Setup or change proxy configuration"},
+ { 0, 0, 0 }
+};
+
+//*****************************************************************************
+//
+// This function implements the "help" command. It prints a simple list of the
+// available commands with a brief description.
+//
+//*****************************************************************************
+int
+Cmd_help(int argc, char *argv[])
+{
+ tCmdLineEntry *pEntry;
+
+ //
+ // Print some header text.
+ //
+ UARTprintf("\nAvailable commands\n");
+ UARTprintf("------------------\n");
+
+ //
+ // Point at the beginning of the command table.
+ //
+ pEntry = &g_psCmdTable[0];
+
+ //
+ // Enter a loop to read each entry from the command table. The end of the
+ // table has been reached when the command name is NULL.
+ //
+ while(pEntry->pcCmd)
+ {
+ //
+ // Print the command name and the brief description.
+ //
+ UARTprintf("%15s%s\n", pEntry->pcCmd, pEntry->pcHelp);
+
+ //
+ // Advance to the next entry in the table.
+ //
+ pEntry++;
+ }
+
+ //
+ // Return success.
+ //
+ return(0);
+}
+
+//*****************************************************************************
+//
+// The "setproxy" command allows the user to change their proxy behavior
+//
+//*****************************************************************************
+int
+Cmd_setproxy(int argc, char *argv[])
+{
+ //
+ // Check the number of arguments.
+ //
+ if((argc == 1) && (ustrcmp("off",argv[1]) == 0 ))
+ {
+ g_sConfig.bProxyEnabled = false;
+ g_sConfig.pcProxy[0] = 0;
+ }
+ else if(argc == 2)
+ {
+ //
+ // Otherwise, copy the user-defined location into the global variable.
+ //
+ ustrncpy(g_sConfig.pcProxy, argv[1], 49);
+
+ //
+ // Make sure that the global string remains terminated with a zero.
+ //
+ g_sConfig.pcProxy[49] = 0;
+ g_sConfig.bProxyEnabled = true;
+
+ UARTprintf("New Proxy Address: %s\n", g_sConfig.pcProxy);
+
+ //
+ // Enable the proxy.
+ //
+ ProxyEnable();
+
+ }
+ else
+ {
+ UARTprintf("\nProxy configuration help:\n");
+ UARTprintf(" The setproxy command changes the proxy behavior of"
+ "this board.\n");
+ UARTprintf(" To disable the proxy, type:\n\n");
+ UARTprintf(" setproxy off\n\n");
+ UARTprintf(" To enable the proxy with a specific proxy name, "
+ "type\n");
+ UARTprintf(" setproxy <proxyaddress>. For "
+ "example:\n\n");
+ UARTprintf(" setproxy your.proxy.address\n\n");
+ }
+
+ //
+ // No longer processing commands.
+ //
+ g_ui32ProcessingCmds = 0;
+
+ return 0;
+}
+
+//*****************************************************************************
+//
+// The tictactoe command allows users to play a game of tic-tac-toe.
+//
+//*****************************************************************************
+int
+Cmd_cityscroll(int argc, char *argv[])
+{
+ //
+ // Clear the terminal. Print the banner and IP place holder.
+ //
+ UARTprintf("\033[2J\033[H");
+ UARTprintf("Ethernet Weather Example\n\n");
+ UARTprintf("IP: ");
+
+ //
+ // Print the IP address.
+ //
+ PrintIPAddress(g_pcIPAddr, g_ui32IPaddr);
+ UARTprintf("\n");
+ UARTprintf("Hit 'ENTER' to exit\n\n");
+
+ //
+ // Print the current city information.
+ //
+ UpdateCity(0, true);
+
+ //
+ // 'Updating' banner.
+ //
+ UARTprintf("\n__________________________\n\nUpdating:");
+
+ //
+ // Update the variable to begin scrolling through the cities.
+ //
+ g_ui32ShowCities = 1;
+
+ //
+ // No longer processing commands.
+ //
+ g_ui32ProcessingCmds = 0;
+
+ return 0;
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/commands.h b/boards/ek-tm4c1294xl/enet_weather/commands.h
new file mode 100644
index 0000000..7a26405
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/commands.h
@@ -0,0 +1,57 @@
+//*****************************************************************************
+//
+// commands.h - Header file for commandline functions in qs-cloud
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#ifndef __COMMANDS_H__
+#define __COMMANDS_H__
+
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//*****************************************************************************
+//
+// Forward declarations for command-line operations.
+//
+//*****************************************************************************
+extern int Cmd_help(int argc, char *argv[]);
+extern int Cmd_cityscroll(int argc, char *argv[]);
+extern int Cmd_setproxy(int argc, char *argv[]);
+
+//*****************************************************************************
+//
+// Mark the end of the C bindings section for C++ compilers.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __COMMANDS_H__
diff --git a/boards/ek-tm4c1294xl/enet_weather/debug.h b/boards/ek-tm4c1294xl/enet_weather/debug.h
new file mode 100644
index 0000000..5e64db5
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/debug.h
@@ -0,0 +1,38 @@
+//*****************************************************************************
+//
+// debug.h -
+//
+// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#ifndef __DEBUG_H__
+#define __DEBUG_H__
+
+#ifdef DEBUG_OUTPUT
+//#include "driverlib/uart.h"
+#include "utils/uartstdio.h"
+#define DebugPrintf(...) UARTprintf(__VA_ARGS__)
+#else
+#define DebugPrintf(...)
+#endif
+#else
+#define DebugPrintf(...)
+
+#endif
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.c b/boards/ek-tm4c1294xl/enet_weather/enet_weather.c
new file mode 100644
index 0000000..d4c8d85
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.c
@@ -0,0 +1,1249 @@
+//*****************************************************************************
+//
+// enet_weather.c - Sample Weather application using lwIP.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "inc/hw_types.h"
+#include "inc/hw_ints.h"
+#include "inc/hw_memmap.h"
+#include "inc/hw_nvic.h"
+#include "inc/hw_gpio.h"
+#include "driverlib/flash.h"
+#include "driverlib/gpio.h"
+#include "driverlib/interrupt.h"
+#include "driverlib/pin_map.h"
+#include "driverlib/rom.h"
+#include "driverlib/rom_map.h"
+#include "driverlib/sysctl.h"
+#include "driverlib/systick.h"
+#include "driverlib/emac.h"
+#include "drivers/pinout.h"
+#include "utils/cmdline.h"
+#include "utils/locator.h"
+#include "utils/flash_pb.h"
+#include "utils/lwiplib.h"
+#include "utils/uartstdio.h"
+#include "utils/ustdlib.h"
+#include "eth_client.h"
+#include "enet_weather.h"
+#include "commands.h"
+#include "json.h"
+
+//*****************************************************************************
+//
+//! \addtogroup example_list
+//! <h1>Ethernet Weather Application (enet_weather)</h1>
+//!
+//! This example application demonstrates the operation of the Tiva C series
+//! evaluation kit as a weather reporting application.
+//!
+//! The application supports updating weather information from Open Weather Map
+//! weather provider(http://openweathermap.org/). The application uses the
+//! lwIP stack to obtain an address through DNS, resolve the address of the
+//! Open Weather Map site and then build and handle all of the requests
+//! necessary to access the weather information. The application can also use
+//! a web proxy, allows for a custom city to be added to the list of cities and
+//! toggles temperature units from Celsius to Fahrenheit. The application
+//! scrolls through the city list at a fixed interval when there is a valid
+//! IP address and displays this information over the UART.
+//!
+//! The application will print the city name, status, humidity, current temp
+//! and the high/low. In addition the application will display what city it
+//! is currently updating. Once the app has scrolled through the cities a
+//! a defined amount of times, it will attempt to update the information.
+//!
+//! UART0, connected to the Virtual Serial Port and running at 115,200, 8-N-1,
+//! is used to display messages from this application.
+//!
+//!/ For additional details about Open Weather Map refer to their web page at:
+//! http://openweathermap.org/
+//!
+//! For additional details on lwIP, refer to the lwIP web page at:
+//! http://savannah.nongnu.org/projects/lwip/
+//
+//*****************************************************************************
+
+//*****************************************************************************
+//
+// Connection states for weather application.
+//
+//*****************************************************************************
+volatile enum
+{
+ STATE_NOT_CONNECTED,
+ STATE_NEW_CONNECTION,
+ STATE_CONNECTED_IDLE,
+ STATE_WAIT_DATA,
+ STATE_UPDATE_CITY,
+ STATE_WAIT_NICE,
+}
+g_iState = STATE_NOT_CONNECTED;
+
+//*****************************************************************************
+//
+// Input buffer for the command line interpreter.
+//
+//*****************************************************************************
+char g_cInput[APP_INPUT_BUF_SIZE];
+
+//*****************************************************************************
+//
+// The city being displayed.
+//
+//*****************************************************************************
+uint32_t g_ui32CityActive;
+
+//*****************************************************************************
+//
+// The city being updated.
+//
+//*****************************************************************************
+uint32_t g_ui32CityUpdating;
+
+//*****************************************************************************
+//
+// Global for IP address.
+//
+//*****************************************************************************
+uint32_t g_ui32IPaddr;
+
+//*****************************************************************************
+//
+// Global to track whether we are processing commands or not.
+//
+//*****************************************************************************
+uint32_t g_ui32ProcessingCmds;
+
+//*****************************************************************************
+//
+// The delay count to reduce traffic to the weather server.
+//
+//*****************************************************************************
+volatile uint32_t g_ui32Delay;
+
+//*****************************************************************************
+//
+// Global to track number of times the app has cycled through the list of
+// cities.
+//
+//*****************************************************************************
+volatile uint32_t g_ui32Cycles;
+
+//*****************************************************************************
+//
+// The delay count to update the UART.
+//
+//*****************************************************************************
+uint32_t g_ui32UARTDelay;
+
+//*****************************************************************************
+//
+// System Clock rate in Hertz.
+//
+//*****************************************************************************
+uint32_t g_ui32SysClock;
+
+//*****************************************************************************
+//
+// Varriable to track when to display the scrolling list of cities.
+//
+//*****************************************************************************
+uint32_t g_ui32ShowCities;
+
+//*****************************************************************************
+//
+// Varriable to track when to update the UART.
+//
+//*****************************************************************************
+uint32_t g_UpdateUART = 1;
+
+//*****************************************************************************
+//
+// Storage for the filename list box widget string table.
+//
+//*****************************************************************************
+#define NUM_CITIES 30
+
+//*****************************************************************************
+//
+// The defaults for the flash and application settings.
+//
+//*****************************************************************************
+static const sParameters g_sDefaultParams =
+{
+ 0,
+ {"Custom City Name"},
+ {"your.proxy.com"},
+ false,
+ false,
+ false,
+ false
+};
+
+//
+// The current live configuration settings for the application.
+//
+sParameters g_sConfig;
+
+//*****************************************************************************
+//
+// The state of each city panel.
+//
+//*****************************************************************************
+struct
+{
+ //
+ // The last update time for this city.
+ //
+ uint32_t ui32LastUpdate;
+
+ //
+ // The current weather report data for this city.
+ //
+ tWeatherReport sReport;
+
+ //
+ // Indicates if the city needs updating.
+ //
+ bool bNeedsUpdate;
+
+ //
+ // The name of the current city.
+ //
+ const char *pcName;
+}
+g_psCityInfo[NUM_CITIES];
+
+//
+// The list of city names.
+//
+static const char *g_ppcCityNames[NUM_CITIES - 1] =
+{
+ "Austin, TX",
+ "Beijing, China",
+ "Berlin, Germany",
+ "Boston, MA",
+ "Buenos Aires, Argentina",
+ "Chicago, IL",
+ "Dallas, TX",
+ "Frankfurt, Germany",
+ "Hong Kong, HK",
+ "Jerusalem, Israel",
+ "Johannesburg, ZA",
+ "London, England",
+ "Mexico City, Mexico",
+ "Moscow, Russia",
+ "New Delhi, India",
+ "New York, NY",
+ "Paris, France",
+ "Rome, Italy",
+ "San Jose, CA",
+ "Sao Paulo, Brazil",
+ "Seoul, S. Korea",
+ "Shanghai, China",
+ "Shenzhen, China",
+ "Singapore City, Singapore",
+ "Sydney, Australia",
+ "Taipei, Taiwan",
+ "Tokyo, Japan",
+ "Toronto, Canada",
+ "Vancouver, Canada"
+};
+
+//*****************************************************************************
+//
+// Constant strings for status messages.
+//
+//*****************************************************************************
+const char g_pcNotFound[] = "City Not Found";
+const char g_pcServerBusy[] = "Server Busy";
+const char g_pcWaitData[] = "Waiting for Data";
+
+//*****************************************************************************
+//
+// Interrupt priority definitions. The top 3 bits of these values are
+// significant with lower values indicating higher priority interrupts.
+//
+//*****************************************************************************
+#define SYSTICK_INT_PRIORITY 0x80
+#define ETHERNET_INT_PRIORITY 0xC0
+
+//*****************************************************************************
+//
+// The error routine that is called if the driver library encounters an error.
+//
+//*****************************************************************************
+#ifdef DEBUG
+void
+__error__(char *pcFilename, uint32_t ui32Line)
+{
+}
+#endif
+
+//*****************************************************************************
+//
+// Variables for the various temperature parametrics.
+//
+//*****************************************************************************
+char g_pcTempHighLow[40] = "--/--C";
+char g_pcTemp[40] = "--C";
+char g_pcHumidity[40] = "Humidity: --%";
+char g_pcStatus[40];
+char g_pcCity[40];
+
+//*****************************************************************************
+//
+// MAC address.
+//
+//*****************************************************************************
+char g_pcMACAddr[40];
+
+//*****************************************************************************
+//
+// IP address.
+//
+//*****************************************************************************
+char g_pcIPAddr[20];
+
+//*****************************************************************************
+//
+// Celsius to Fahrenheit conversion.
+//
+//*****************************************************************************
+static int32_t
+TempCtoF(int32_t i32Temp)
+{
+ //
+ // Only convert if measurements are not in Celsius.
+ //
+ if(g_sConfig.bCelsius == false)
+ {
+ i32Temp = ((i32Temp * 9) / 5) + 32;
+ }
+
+ return(i32Temp);
+}
+
+//*****************************************************************************
+//
+// Reset a cities information so that it can be properly updated.
+//
+//*****************************************************************************
+void
+ResetCity(uint32_t ui32Idx)
+{
+ g_psCityInfo[ui32Idx].sReport.i32Pressure = INVALID_INT;
+ g_psCityInfo[ui32Idx].sReport.i32Humidity = INVALID_INT;
+ g_psCityInfo[ui32Idx].sReport.i32Temp = INVALID_INT;
+ g_psCityInfo[ui32Idx].sReport.i32TempHigh = INVALID_INT;
+ g_psCityInfo[ui32Idx].sReport.i32TempLow = INVALID_INT;
+ g_psCityInfo[ui32Idx].sReport.pcDescription = 0;
+ g_psCityInfo[ui32Idx].sReport.pui8Image = 0;
+ g_psCityInfo[ui32Idx].sReport.ui32SunRise = 0;
+ g_psCityInfo[ui32Idx].sReport.ui32SunSet = 0;
+ g_psCityInfo[ui32Idx].sReport.ui32Time = 0;
+ g_psCityInfo[ui32Idx].ui32LastUpdate = 0;
+
+ //
+ // Make sure to copy the name into the string for a custom city.
+ //
+ if(ui32Idx == NUM_CITIES - 1)
+ {
+ //
+ // Custom city is in another list.
+ //
+ g_psCityInfo[ui32Idx].pcName = g_sConfig.pcCustomCity;
+
+ if(g_ui32CityActive == ui32Idx)
+ {
+ //
+ // Update the custom city name.
+ //
+ ustrncpy(g_pcCity, g_psCityInfo[ui32Idx].pcName, sizeof(g_pcCity));
+ }
+
+ //
+ // The custom city only needs an update if enabled.
+ //
+ if(g_sConfig.bCustomEnabled)
+ {
+ g_psCityInfo[ui32Idx].bNeedsUpdate = true;
+ }
+ }
+ else
+ {
+ g_psCityInfo[ui32Idx].pcName = g_ppcCityNames[ui32Idx];
+ g_psCityInfo[ui32Idx].bNeedsUpdate = true;
+ }
+}
+
+//*****************************************************************************
+//
+// Update the IP address string.
+//
+//*****************************************************************************
+void
+UpdateIPAddress(char *pcAddr, uint32_t ipAddr)
+{
+ uint8_t *pui8Temp = (uint8_t *)&ipAddr;
+
+ if(ipAddr == 0)
+ {
+ ustrncpy(pcAddr, "IP: ---.---.---.---", sizeof(g_pcIPAddr));
+ }
+ else
+ {
+ usprintf(pcAddr,"IP: %d.%d.%d.%d", pui8Temp[0], pui8Temp[1],
+ pui8Temp[2], pui8Temp[3]);
+ }
+}
+
+//*****************************************************************************
+//
+// Handles the proxy select button presses.
+//
+//*****************************************************************************
+void
+ProxyEnable(void)
+{
+ //
+ // If a city was waiting to be updated then reset its data.
+ //
+ if(g_iState != STATE_CONNECTED_IDLE)
+ {
+ ResetCity(g_ui32CityUpdating);
+ }
+
+ //
+ // Reset the state to not connected.
+ //
+ g_iState = STATE_NOT_CONNECTED;
+
+ //
+ // Toggle the proxy setting.
+ //
+ if(!g_sConfig.bProxyEnabled)
+ {
+ //
+ // Reset the IP address on the screen and disable the proxy which
+ // resets the network interface and starts DHCP again.
+ //
+ UpdateIPAddress(g_pcIPAddr, 0);
+ EthClientProxySet(0);
+
+ }
+ else
+ {
+ //
+ // Enable the proxy which resets the network interface and starts DHCP
+ // again.
+ //
+ EthClientProxySet(g_sConfig.pcProxy);
+ }
+
+ //
+ // A change was made so update the settings in flash.
+ //
+ g_sConfig.bSave = true;
+}
+
+//*****************************************************************************
+//
+// Update the information for the current city.
+//
+//*****************************************************************************
+void
+UpdateCity(uint32_t ui32Idx, bool bDraw)
+{
+ char cUnits;
+ bool bIntDisabled;
+
+ //
+ // Need to disable interrupts since this can be called from interrupt
+ // handlers for both System tick and Ethernet controller and from the
+ // main routine.
+ //
+ bIntDisabled = IntMasterDisable();
+
+ if(g_sConfig.bCelsius)
+ {
+ cUnits = 'C';
+ }
+ else
+ {
+ cUnits = 'F';
+ }
+
+ //
+ // Update the city.
+ //
+ ustrncpy(g_pcCity, g_psCityInfo[ui32Idx].pcName, sizeof(g_pcCity));
+
+ //
+ // Check if the humidity value is valid.
+ //
+ if(g_psCityInfo[ui32Idx].sReport.i32Humidity == INVALID_INT)
+ {
+ usprintf(g_pcHumidity, "Humidity: --");
+ }
+ else
+ {
+ usprintf(g_pcHumidity, "Humidity: %d",
+ g_psCityInfo[ui32Idx].sReport.i32Humidity);
+ }
+
+ //
+ // Copy the updated description.
+ //
+ if(g_psCityInfo[ui32Idx].sReport.pcDescription)
+ {
+ ustrncpy(g_pcStatus, g_psCityInfo[ui32Idx].sReport.pcDescription,
+ sizeof(g_pcStatus));
+ }
+ else if((g_ui32CityUpdating == g_ui32CityActive) &&
+ (g_iState != STATE_NOT_CONNECTED))
+ {
+ //
+ // Waiting on data for this city.
+ //
+ ustrncpy(g_pcStatus, g_pcWaitData, sizeof(g_pcStatus));
+ }
+ else
+ {
+ //
+ // No current status.
+ //
+ ustrncpy(g_pcStatus, "--", sizeof(g_pcStatus));
+ }
+
+
+ //
+ // Check if the temperature value is valid.
+ //
+ if(g_psCityInfo[ui32Idx].sReport.i32Temp == INVALID_INT)
+ {
+ usprintf(g_pcTemp, "--%c", cUnits);
+ usprintf(g_pcTempHighLow, "--/--%c",
+ TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempHigh),
+ TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempLow), cUnits);
+ }
+ else
+ {
+ usprintf(g_pcTemp, "%d%c",
+ TempCtoF(g_psCityInfo[ui32Idx].sReport.i32Temp), cUnits);
+ usprintf(g_pcTempHighLow, "%d/%d%c",
+ TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempHigh),
+ TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempLow), cUnits);
+ }
+
+ //
+ // Update the information if requested.
+ //
+ if(bDraw)
+ {
+ UARTprintf((const char *)&g_pcCity);
+ UARTprintf("\n\tStatus: ");
+ UARTprintf((const char *)&g_pcStatus);
+ UARTprintf("\n\t");
+ UARTprintf((const char *)&g_pcHumidity);
+ UARTprintf("%%\n\tTemperature: ");
+ UARTprintf((const char *)&g_pcTemp);
+ UARTprintf("\n\tHigh/Low: ");
+ UARTprintf((const char *)&g_pcTempHighLow);
+ }
+
+ if(bIntDisabled == false)
+ {
+ IntMasterEnable();
+ }
+}
+
+//*****************************************************************************
+//
+// Update the MAC address string.
+//
+//*****************************************************************************
+void
+UpdateMACAddr(void)
+{
+ uint8_t pui8MACAddr[6];
+
+ EthClientMACAddrGet(pui8MACAddr);
+
+ usprintf(g_pcMACAddr, "MAC: %02x:%02x:%02x:%02x:%02x:%02x",
+ pui8MACAddr[0], pui8MACAddr[1], pui8MACAddr[2], pui8MACAddr[3],
+ pui8MACAddr[4], pui8MACAddr[5]);
+}
+
+//*****************************************************************************
+//
+// Print the IP address string.
+//
+//*****************************************************************************
+void
+PrintIPAddress(char *pcAddr, uint32_t ipaddr)
+{
+ uint8_t *pui8Temp = (uint8_t *)&ipaddr;
+
+ //
+ // Convert the IP Address into a string.
+ //
+ UARTprintf("%d.%d.%d.%d\n", pui8Temp[0], pui8Temp[1], pui8Temp[2],
+ pui8Temp[3]);
+}
+
+//*****************************************************************************
+//
+// Prompts the user for a command, and blocks while waiting for the user's
+// input. This function will return after the execution of a single command.
+//
+//*****************************************************************************
+void
+CheckForUserCommands(void)
+{
+ int iStatus;
+
+ //
+ // Peek to see if a full command is ready for processing
+ //
+ if(UARTPeek('\r') == -1)
+ {
+ //
+ // If not, return so other functions get a chance to run.
+ //
+ return;
+ }
+
+ //
+ // If we do have commands, process them immediately in the order they were
+ // received.
+ //
+ while(UARTPeek('\r') != -1)
+ {
+ //
+ // Indicate we are processing a command.
+ //
+ g_ui32ProcessingCmds = 1;
+
+ //
+ // Get a user command back
+ //
+ UARTgets(g_cInput, APP_INPUT_BUF_SIZE);
+
+ //
+ // Process the received command
+ //
+ iStatus = CmdLineProcess(g_cInput);
+
+ //
+ // Handle the case of bad command.
+ //
+ if(iStatus == CMDLINE_BAD_CMD)
+ {
+ UARTprintf("Bad command!\n");
+ }
+
+ //
+ // Handle the case of too many arguments.
+ //
+ else if(iStatus == CMDLINE_TOO_MANY_ARGS)
+ {
+ UARTprintf("Too many arguments for command processor!\n");
+ }
+ }
+
+ //
+ // Print a prompt
+ //
+ UARTprintf("\n> ");
+
+}
+
+//*****************************************************************************
+//
+// Updates the UART information.
+//
+//*****************************************************************************
+void
+UpdateUART(uint32_t ui32City)
+{
+ volatile uint32_t ui32IPaddr;
+ uint32_t ui32Idx;
+
+ //
+ // See if the user has hit 'ENTER'
+ //
+ if(UARTPeek('\r') != -1 && g_ui32ShowCities)
+ {
+ //
+ // Get a user command back
+ //
+ UARTgets(g_cInput, APP_INPUT_BUF_SIZE);
+
+ //
+ // Update the state and redraw the UART.
+ //
+ g_UpdateUART = 1;
+ g_ui32ShowCities = 0;
+ g_ui32ProcessingCmds = 0;
+ g_ui32CityActive = 0;
+ g_ui32Cycles = 0;
+ g_ui32UARTDelay = 0;
+ }
+
+ //
+ // Get the IP address.
+ //
+ ui32IPaddr = EthClientAddrGet();
+
+ //
+ // If the IP changed, reassign.
+ //
+ if (g_ui32IPaddr != ui32IPaddr)
+ {
+ //
+ // Reassign the global IP to the current.
+ //
+ g_ui32IPaddr = ui32IPaddr;
+
+ //
+ // Update the UART.
+ //
+ g_UpdateUART = 1;
+ }
+
+ //
+ // Check if we should scroll the cities.
+ //
+ if (g_ui32UARTDelay == 0 && g_ui32ShowCities)
+ {
+ //
+ // Clear the terminal. Print the banner and IP place holder.
+ //
+ UARTprintf("\033[2J\033[H");
+ UARTprintf("Ethernet Weather Example\n\n");
+ UARTprintf("IP: ");
+
+ //
+ // Print the IP address.
+ //
+ PrintIPAddress(g_pcIPAddr, ui32IPaddr);
+ UARTprintf("\n");
+ UARTprintf("Hit 'ENTER' to exit\n\n");
+
+ //
+ // Print the current city information.
+ //
+ UpdateCity(ui32City, true);
+
+ //
+ // 'Updating' banner.
+ //
+ UARTprintf("\n__________________________\n\nUpdating:");
+
+ if (g_ui32Cycles >= UPDATE_CYCLES)
+ {
+ //
+ // Reset the cities so that they update.
+ //
+ for(ui32Idx = 0; ui32Idx < NUM_CITIES; ui32Idx++)
+ {
+ ResetCity(ui32Idx);
+ }
+
+ //
+ // Indicate that we have reset all of the cities.
+ //
+ g_ui32Cycles = 0;
+ }
+
+ //
+ // Reset the delay.
+ //
+ g_ui32UARTDelay = CYCLE_DELAY;
+
+ if (ui32IPaddr != 0 && ui32IPaddr != 0xffffffff)
+ {
+ //
+ // Increment the display city.
+ //
+ g_ui32CityActive++;
+
+ //
+ // Check if the current city index is at the end.
+ //
+ if ((g_ui32CityActive >= NUM_CITIES - 1 &&
+ g_sDefaultParams.bCustomEnabled == false) ||
+ (g_ui32CityActive >= NUM_CITIES &&
+ g_sDefaultParams.bCustomEnabled == true))
+ {
+ g_ui32CityActive = 0;
+ g_ui32Cycles++;
+ }
+ }
+
+ g_UpdateUART = 0;
+ }
+ else if (g_ui32UARTDelay == 0 && (ui32IPaddr == 0 ||
+ ui32IPaddr == 0xffffffff))
+ {
+ //
+ // Reset the delay.
+ //
+ g_ui32UARTDelay = CYCLE_DELAY;
+ }
+
+ else if (g_ui32UARTDelay > 0)
+ {
+ g_ui32UARTDelay--;
+ }
+
+ //
+ // Check if we need to update the UART with the standard text.
+ //
+ if (g_UpdateUART && !g_ui32ShowCities && !g_ui32ProcessingCmds)
+ {
+ //
+ // Clear the terminal. Print the banner and IP place holder.
+ //
+ UARTprintf("\033[2J\033[H");
+ UARTprintf("Ethernet Weather Example\n\n");
+ UARTprintf("IP: ");
+
+ //
+ // Print the IP address.
+ //
+ PrintIPAddress(g_pcIPAddr, ui32IPaddr);
+ UARTprintf("\n");
+ UARTprintf("Type 'help' for help.\n\n>");
+
+ //
+ // Dont need to update anymore.
+ //
+ g_UpdateUART = 0;
+ }
+
+ //
+ // If we are not scrolling. Check for commands.
+ //
+ if (!g_ui32ShowCities)
+ {
+ //
+ // Check for user commands.
+ //
+ CheckForUserCommands();
+ }
+}
+
+//*****************************************************************************
+//
+// The weather event handler.
+//
+//*****************************************************************************
+void
+WeatherEvent(uint32_t ui32Event, void* pvData, uint32_t ui32Param)
+{
+
+ if(ui32Event == ETH_EVENT_RECEIVE)
+ {
+ //
+ // Let the main loop update the city.
+ //
+ g_iState = STATE_UPDATE_CITY;
+
+ g_psCityInfo[g_ui32CityUpdating].ui32LastUpdate =
+ g_psCityInfo[g_ui32CityUpdating].sReport.ui32Time;
+ }
+ else if(ui32Event == ETH_EVENT_INVALID_REQ)
+ {
+ g_psCityInfo[g_ui32CityUpdating].sReport.pcDescription = g_pcNotFound;
+ g_iState = STATE_UPDATE_CITY;
+ }
+ else if(ui32Event == ETH_EVENT_CLOSE)
+ {
+ if(g_iState == STATE_WAIT_DATA)
+ {
+ g_psCityInfo[g_ui32CityUpdating].sReport.pcDescription =
+ g_pcServerBusy;
+
+ g_iState = STATE_UPDATE_CITY;
+ }
+ }
+
+ //
+ // If the update indicated no time, then just set the time to a value
+ // to indicate that at least the update occurred.
+ //
+ if(g_psCityInfo[g_ui32CityUpdating].ui32LastUpdate == 0)
+ {
+ //
+ // Failed to update for some reason.
+ //
+ g_psCityInfo[g_ui32CityUpdating].ui32LastUpdate = 1;
+ }
+}
+
+//*****************************************************************************
+//
+// The interrupt handler for the SysTick interrupt.
+//
+//*****************************************************************************
+void
+SysTickIntHandler(void)
+{
+ //
+ // Call the lwIP timer handler.
+ //
+ EthClientTick(SYSTEM_TICK_MS);
+
+ //
+ // Handle the delay between accesses to the weather server.
+ //
+ if(g_ui32Delay != 0)
+ {
+ g_ui32Delay--;
+ }
+}
+
+//*****************************************************************************
+//
+// Network events handler.
+//
+//*****************************************************************************
+void
+EnetEvents(uint32_t ui32Event, void *pvData, uint32_t ui32Param)
+{
+ if(ui32Event == ETH_EVENT_CONNECT)
+ {
+ g_iState = STATE_NEW_CONNECTION;
+
+ //
+ // Update the string version of the address.
+ //
+ UpdateIPAddress(g_pcIPAddr, EthClientAddrGet());
+ }
+ else if(ui32Event == ETH_EVENT_DISCONNECT)
+ {
+ //
+ // If a city was waiting to be updated then reset its data.
+ //
+ if(g_iState != STATE_CONNECTED_IDLE)
+ {
+ ResetCity(g_ui32CityUpdating);
+ }
+
+ g_iState = STATE_NOT_CONNECTED;
+
+ //
+ // Update the address to 0.0.0.0.
+ //
+ UpdateIPAddress(g_pcIPAddr, 0);
+ }
+}
+
+//*****************************************************************************
+//
+// This example demonstrates the use of the Ethernet Controller.
+//
+//*****************************************************************************
+int
+main(void)
+{
+ enum
+ {
+ eRequestIdle,
+ eRequestUpdate,
+ eRequestForecast,
+ eRequestCurrent,
+ eRequestComplete,
+ }
+ iRequest;
+ int32_t i32City;
+ sParameters *pParams;
+ iRequest = eRequestIdle;
+
+ //
+ // Make sure the main oscillator is enabled because this is required by
+ // the PHY. The system must have a 25MHz crystal attached to the OSC
+ // pins. The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal
+ // frequency is 10MHz or higher.
+ //
+ SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ);
+
+ //
+ // Run from the PLL at 120 MHz.
+ //
+ g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
+ SYSCTL_OSC_MAIN |
+ SYSCTL_USE_PLL |
+ SYSCTL_CFG_VCO_480), 120000000);
+
+ //
+ // Configure the device pins.
+ //
+ PinoutSet(true, false);
+
+ //
+ // Initialize the UART.
+ //
+ UARTStdioConfig(0, 115200, g_ui32SysClock);
+
+ //
+ // Configure SysTick for a periodic interrupt at 10ms.
+ //
+ SysTickPeriodSet((g_ui32SysClock / 1000) * SYSTEM_TICK_MS);
+ SysTickEnable();
+ SysTickIntEnable();
+
+ //
+ // Initialized the flash program block and read the current settings.
+ //
+ FlashPBInit(FLASH_PB_START, FLASH_PB_END, 256);
+ pParams = (sParameters *)FlashPBGet();
+
+ //
+ // Use the defaults if no settings were found.
+ //
+ if(pParams == 0)
+ {
+ g_sConfig = g_sDefaultParams;
+ }
+ else
+ {
+ g_sConfig = *pParams;
+ }
+
+ //
+ // Initialize all of the cities.
+ //
+ for(i32City = 0; i32City < NUM_CITIES; i32City++)
+ {
+ ResetCity(i32City);
+ }
+
+ //
+ // Set the IP address to 0.0.0.0.
+ //
+ UpdateIPAddress(g_pcIPAddr, 0);
+
+ //
+ // Enable processor interrupts.
+ //
+ IntMasterEnable();
+
+ //
+ // Set the interrupt priorities. We set the SysTick interrupt to a higher
+ // priority than the Ethernet interrupt to ensure that the file system
+ // tick is processed if SysTick occurs while the Ethernet handler is being
+ // processed. This is very likely since all the TCP/IP and HTTP work is
+ // done in the context of the Ethernet interrupt.
+ //
+ IntPriorityGroupingSet(4);
+ IntPrioritySet(INT_EMAC0, ETHERNET_INT_PRIORITY);
+ IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY);
+
+ if(g_sConfig.bProxyEnabled)
+ {
+ EthClientProxySet(g_sConfig.pcProxy);
+ EthClientInit(EnetEvents);
+ }
+ else
+ {
+ EthClientProxySet(0);
+ EthClientInit(EnetEvents);
+ }
+
+ UpdateMACAddr();
+
+ //
+ // Initialize the city index and enable swipe detection.
+ //
+ g_ui32CityActive = 0;
+ g_ui32CityUpdating = 0;
+
+ //
+ // Get the IP address.
+ //
+ g_ui32IPaddr = EthClientAddrGet();
+
+ //
+ // Update the current city information.
+ //
+ UpdateUART(g_ui32CityActive);
+
+ //
+ // Loop forever. All the work is done in interrupt handlers.
+ //
+ while(1)
+ {
+ if(g_iState == STATE_NEW_CONNECTION)
+ {
+ iRequest = eRequestIdle;
+
+ g_iState = STATE_CONNECTED_IDLE;
+ }
+ else if(g_iState == STATE_CONNECTED_IDLE)
+ {
+ if(iRequest == eRequestIdle)
+ {
+ //
+ // If this city needs updating then start an update.
+ //
+ if((g_psCityInfo[g_ui32CityUpdating].bNeedsUpdate) &&
+ ((g_ui32CityUpdating < NUM_CITIES - 1) ||
+ (g_sConfig.bCustomEnabled == true)))
+ {
+ iRequest = eRequestUpdate;
+ }
+
+ if(iRequest != eRequestUpdate)
+ {
+ //
+ // If the custom city is enabled and it needs updating,
+ // then update it first.
+ //
+ if((g_psCityInfo[NUM_CITIES - 1].bNeedsUpdate) &&
+ (g_sConfig.bCustomEnabled == true))
+ {
+ g_ui32CityUpdating = NUM_CITIES - 1;
+ }
+ else
+ {
+ //
+ // Move on to the next city to see if it needs to be
+ // updated on the next pass.
+ //
+ g_ui32CityUpdating++;
+ }
+
+ if(g_ui32CityUpdating >= NUM_CITIES)
+ {
+ g_ui32CityUpdating = 0;
+ }
+ }
+ }
+ else if(iRequest == eRequestUpdate)
+ {
+ //
+ // Print the current city being updated.
+ //
+ if (g_ui32ShowCities)
+ {
+ UARTprintf("\n\t%s",
+ g_psCityInfo[g_ui32CityUpdating].pcName);
+ }
+
+ g_iState = STATE_WAIT_DATA;
+
+ //
+ // Timeout at 10 seconds.
+ //
+ g_ui32Delay = 1000;
+
+ WeatherForecast(iWSrcOpenWeatherMap,
+ g_psCityInfo[g_ui32CityUpdating].pcName,
+ &g_psCityInfo[g_ui32CityUpdating].sReport,
+ WeatherEvent);
+
+ iRequest = eRequestForecast;
+ }
+ else if(iRequest == eRequestForecast)
+ {
+ g_iState = STATE_WAIT_DATA;
+
+ //
+ // Timeout at 10 seconds.
+ //
+ g_ui32Delay = 1000;
+
+ WeatherCurrent(iWSrcOpenWeatherMap,
+ g_psCityInfo[g_ui32CityUpdating].pcName,
+ &g_psCityInfo[g_ui32CityUpdating].sReport,
+ WeatherEvent);
+
+ iRequest = eRequestCurrent;
+ }
+ else if(iRequest == eRequestCurrent)
+ {
+ //
+ // Return to the idle request state.
+ //
+ iRequest = eRequestIdle;
+
+ //
+ // Done updating this city.
+ //
+ g_psCityInfo[g_ui32CityUpdating].bNeedsUpdate = false;
+ }
+ }
+ else if(g_iState == STATE_UPDATE_CITY)
+ {
+ if(iRequest == eRequestCurrent)
+ {
+ //
+ // If the city is the current active city and the the
+ // application is on the main screen then update the screen
+ // and not just the values.
+ //
+ if(g_ui32CityUpdating == g_ui32CityActive)
+ {
+ //
+ // Update the current city.
+ //
+ UpdateCity(g_ui32CityUpdating, false);
+ }
+
+ //
+ // Done updating this city.
+ //
+ g_psCityInfo[g_ui32CityUpdating].bNeedsUpdate = false;
+ }
+
+ //
+ // Go to the wait nice state.
+ //
+ g_iState = STATE_WAIT_NICE;
+
+ //
+ // 10ms * 10 is a 1 second delay between updates.
+ //
+ g_ui32Delay = SYSTEM_TICK_MS * 10;
+ }
+ else if(g_iState == STATE_WAIT_NICE)
+ {
+ //
+ // Wait for the "nice" delay to not hit the server too often.
+ //
+ if(g_ui32Delay == 0)
+ {
+ g_iState = STATE_CONNECTED_IDLE;
+ }
+ }
+ else if(g_iState == STATE_WAIT_DATA)
+ {
+ //
+ // If no data has been received by the timeout then close the
+ // connection.
+ //
+ if(g_ui32Delay == 0)
+ {
+ //
+ // Close out the current connection.
+ //
+ EthClientTCPDisconnect();
+ }
+ }
+
+ //
+ // Update the UART.
+ //
+ UpdateUART(g_ui32CityActive);
+ }
+}
+
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.ewd b/boards/ek-tm4c1294xl/enet_weather/enet_weather.ewd
new file mode 100644
index 0000000..9c3f3df
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.ewd
@@ -0,0 +1,614 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<project>
+ <fileVersion>1</fileVersion>
+ <configuration>
+ <name>Debug</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>15</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\TexasInstruments\tm4c1294ncpdt</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>5.11.0.50579</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>LMIFTDI_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>5.11.0.50579</state>
+ </option>
+ <option>
+ <name>OCDownloadAttachToProgram</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FlashLoaders</name>
+ <state>,,,,(default),</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ANGEL_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCAngelHeartbeat</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CAngelCommunication</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CAngelCommBaud</name>
+ <version>0</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CAngelCommPort</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ANGELTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoAngelLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AngelLogFile</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARROM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CRomLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CRomLogFileEditB</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CRomCommunication</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CRomCommPort</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CRomCommBaud</name>
+ <version>0</version>
+ <state>7</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>9</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>32</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>32</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkAttachSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>0</version>
+ <state>5</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>MACRAIGOR_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>jtag</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>EmuSpeed</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>DoEmuMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>EmuMultiTarget</name>
+ <state>0@ARM7TDMI</state>
+ </option>
+ <option>
+ <name>EmuHWReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CEmuCommBaud</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CEmuCommPort</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>jtago</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>UnusedAddr</name>
+ <state>0x00800000</state>
+ </option>
+ <option>
+ <name>CCMacraigorHWResetDelay</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>RDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CRDIDriverDll</name>
+ <state>Browse to your RDI driver</state>
+ </option>
+ <option>
+ <name>CRDILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CRDILogFileEdit</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCRDIHWReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDIUseETM</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>Browse to your third-party driver</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$TOOLKIT_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.ewp b/boards/ek-tm4c1294xl/enet_weather/enet_weather.ewp
new file mode 100644
index 0000000..06fbf8e
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.ewp
@@ -0,0 +1,837 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<project>
+ <fileVersion>1</fileVersion>
+ <configuration>
+ <name>Debug</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>14</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>ewarm\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>ewarm\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>ewarm\List</state>
+ </option>
+ <option>
+ <name>Variant</name>
+ <version>19</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input variant</name>
+ <version>1</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>No specifier n, no float nor long long, no scan set, no assignment suppressing.</state>
+ </option>
+ <option>
+ <name>Output variant</name>
+ <version>0</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>No specifier a, A, no specifier n, no float nor long long, no flags.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FPU</name>
+ <version>2</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the normal configuration of the C/C++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>RTConfigPath</name>
+ <state>$TOOLKIT_DIR$\INC\DLib_Config_Normal.h</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>5.11.0.50579</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>5.11.0.50579</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>TM4C1294NCPDT TexasInstruments TM4C1294NCPDT</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>19</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>ewarm</state>
+ <state>PART_TM4C1294NCPDT</state>
+ <state>TARGET_IS_TM4C129_RA0</state>
+ <state>LWIP_1_4_1</state>
+ <state>USE_HTTP_1_0</state>
+ <state>UART_BUFFERED</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state>Pa050</state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>1111111</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLangSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraRules</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\.</state>
+ <state>$PROJ_DIR$\..</state>
+ <state>$PROJ_DIR$\..\..\..\..</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\apps</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\src\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCStdIncludePath</name>
+ <state>$TOOLKIT_DIR$\INC\</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IInterwork2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>7</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state>ewarm</state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>AMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AStdIncludes</name>
+ <state>$TOOLKIT_DIR$\INC\</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state>$PROJ_DIR$\.</state>
+ <state>$PROJ_DIR$\..</state>
+ <state>$PROJ_DIR$\..\..\..\..</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\apps</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\src\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4</state>
+ <state>$PROJ_DIR$\..\..\..\..\third_party</state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>1</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>enet_weather.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data/>
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>5</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>enet_weather.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\enet_weather.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>IlinkNXPLPCChecksum</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlgo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data/>
+ </settings>
+ </configuration>
+ <group>
+ <name>Libraries</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a</name>
+ </file>
+ </group>
+ <group>
+ <name>Source</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\utils\cmdline.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\commands.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\enet_weather.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\eth_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\utils\flash_pb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\drivers\http.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\images.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\json.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\utils\locator.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\utils\lwiplib.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\drivers\pinout.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\startup_ewarm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\utils\uartstdio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\utils\ustdlib.c</name>
+ </file>
+ </group>
+</project>
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.h b/boards/ek-tm4c1294xl/enet_weather/enet_weather.h
new file mode 100644
index 0000000..9689fa9
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.h
@@ -0,0 +1,133 @@
+//*****************************************************************************
+//
+// commands.h - Header file for commandline functions in qs-cloud
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#ifndef __ENET_WEATER_H__
+#define __ENET_WEATER_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//*****************************************************************************
+//
+// Defines for setting up the system tick clock.
+//
+//*****************************************************************************
+#define SYSTEM_TICK_MS 10
+#define SYSTEM_TICK_S 100
+
+//*****************************************************************************
+//
+// Define for the cycle speed of the cities.
+//
+//*****************************************************************************
+#define CYCLE_DELAY 3000000
+
+//*****************************************************************************
+//
+// Define for the number of times the full city list cycles before another
+// update.
+//
+//*****************************************************************************
+#define UPDATE_CYCLES 10
+
+//*****************************************************************************
+//
+// Define the size of the flash program blocks for saving configuration data.
+//
+//*****************************************************************************
+#define FLASH_PB_START 0x40000
+#define FLASH_PB_END FLASH_PB_START + 0x4000
+
+//*****************************************************************************
+//
+// Input command line buffer size.
+//
+//*****************************************************************************
+#define APP_INPUT_BUF_SIZE 1024
+
+//*****************************************************************************
+//
+// The flash parameter block structure.
+//
+//*****************************************************************************
+typedef struct
+{
+ //
+ // Reserved space used by the flash program block code.
+ //
+ uint32_t ui32PBReserved;
+
+ //
+ // The custom city name.
+ //
+ char pcCustomCity[60];
+
+ //
+ // The web proxy name.
+ //
+ char pcProxy[80];
+
+ //
+ // The current temperature unit setting.
+ //
+ bool bCelsius;
+
+ //
+ // Current enable/disable setting for the custom city.
+ //
+ bool bCustomEnabled;
+
+ //
+ // Current enable/disable setting for the proxy.
+ //
+ bool bProxyEnabled;
+
+ //
+ // Indicates whether the current settings have been saved.
+ //
+ bool bSave;
+}
+sParameters;
+
+//*****************************************************************************
+//
+// Mark the end of the C bindings section for C++ compilers.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __ENET_WEATER_H__
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.icf b/boards/ek-tm4c1294xl/enet_weather/enet_weather.icf
new file mode 100644
index 0000000..de11d88
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.icf
@@ -0,0 +1,78 @@
+//*****************************************************************************
+//
+// enet_weather.icf - Linker configuration file for enet_weather.
+//
+// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+//
+// Define a memory region that covers the entire 4 GB addressible space of the
+// processor.
+//
+define memory mem with size = 4G;
+
+//
+// Define a region for the on-chip flash.
+//
+define region FLASH = mem:[from 0x00000000 to 0x000fffff];
+
+//
+// Define a region for the on-chip SRAM.
+//
+define region SRAM = mem:[from 0x20000000 to 0x2003ffff];
+
+//
+// Define a block for the heap. The size should be set to something other
+// than zero if things in the C library that require the heap are used.
+//
+define block HEAP with alignment = 8, size = 0x00000000 { };
+
+//
+// Indicate that the read/write values should be initialized by copying from
+// flash.
+//
+initialize by copy { readwrite };
+
+//
+// Indicate that the noinit values should be left alone. This includes the
+// stack, which if initialized will destroy the return address from the
+// initialization code, causing the processor to branch to zero and fault.
+//
+do not initialize { section .noinit };
+
+//
+// Place the interrupt vectors at the start of flash.
+//
+place at start of FLASH { readonly section .intvec };
+
+//
+// Place the remainder of the read-only items into flash.
+//
+place in FLASH { readonly };
+
+//
+// Place the RAM vector table at the start of SRAM.
+//
+place at start of SRAM { section VTABLE };
+
+//
+// Place all read/write items into SRAM.
+//
+place in SRAM { readwrite, block HEAP };
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.ld b/boards/ek-tm4c1294xl/enet_weather/enet_weather.ld
new file mode 100644
index 0000000..9dc80a2
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.ld
@@ -0,0 +1,57 @@
+/******************************************************************************
+ *
+ * enet_weather.ld - Linker configuration file for enet_weather.
+ *
+ * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+ * Software License Agreement
+ *
+ * Texas Instruments (TI) is supplying this software for use solely and
+ * exclusively on TI's microcontroller products. The software is owned by
+ * TI and/or its suppliers, and is protected under applicable copyright
+ * laws. You may not combine this software with "viral" open-source
+ * software in order to form a larger program.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+ * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+ * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+ * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+ * DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ * This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+ *
+ *****************************************************************************/
+
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000
+ SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000
+}
+
+SECTIONS
+{
+ .text :
+ {
+ _text = .;
+ KEEP(*(.isr_vector))
+ *(.text*)
+ *(.rodata*)
+ _etext = .;
+ } > FLASH
+
+ .data : AT(ADDR(.text) + SIZEOF(.text))
+ {
+ _data = .;
+ *(vtable)
+ *(.data*)
+ _edata = .;
+ } > SRAM
+
+ .bss :
+ {
+ _bss = .;
+ *(.bss*)
+ *(COMMON)
+ _ebss = .;
+ } > SRAM
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.sct b/boards/ek-tm4c1294xl/enet_weather/enet_weather.sct
new file mode 100644
index 0000000..c58ab2d
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.sct
@@ -0,0 +1,47 @@
+;******************************************************************************
+;
+; enet_weather.sct - Linker configuration file for enet_weather.
+;
+; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+; Software License Agreement
+;
+; Texas Instruments (TI) is supplying this software for use solely and
+; exclusively on TI's microcontroller products. The software is owned by
+; TI and/or its suppliers, and is protected under applicable copyright
+; laws. You may not combine this software with "viral" open-source
+; software in order to form a larger program.
+;
+; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+; DAMAGES, FOR ANY REASON WHATSOEVER.
+;
+; This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+;
+;******************************************************************************
+
+LR_IROM 0x00000000 0x00100000
+{
+ ;
+ ; Specify the Execution Address of the code and the size.
+ ;
+ ER_IROM 0x00000000 0x00100000
+ {
+ *.o (RESET, +First)
+ * (InRoot$$Sections, +RO)
+ }
+
+ ;
+ ; Specify the Execution Address of the data area.
+ ;
+ RW_IRAM 0x20000000 0x00040000
+ {
+ ;
+ ; Uncomment the following line in order to use IntRegister().
+ ;
+ ;* (vtable, +First)
+ * (+RW, +ZI)
+ }
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.uvopt b/boards/ek-tm4c1294xl/enet_weather/enet_weather.uvopt
new file mode 100644
index 0000000..2119df1
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.uvopt
@@ -0,0 +1,457 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>enet_weather</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>25000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>1</RunSim>
+ <RunTarget>0</RunTarget>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath>.\rvmdk\</ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>255</CpuCode>
+ <Books>
+ <Book>
+ <Number>0</Number>
+ <Title>Data Sheet</Title>
+ <Path>DATASHTS\Luminary\TM4C1294NCPDT.PDF</Path>
+ </Book>
+ </Books>
+ <DllOpt>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-MPU</SimDllArguments>
+ <SimDlgDllName>DCM.DLL</SimDlgDllName>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDllName>TCM.DLL</TargetDlgDllName>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOpt>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>0</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>0</tRfunc>
+ <tRbox>1</tRbox>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <nTsel>4</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>BIN\lmidk-agdi.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>lmidk-agdi</Key>
+ <Name>-O4614 -S1 -FO29</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>DLGTARM</Key>
+ <Name></Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ARMDBGFLAGS</Key>
+ <Name></Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>1</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Source</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\utils\cmdline.c</PathWithFileName>
+ <FilenameWithoutPath>cmdline.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\commands.c</PathWithFileName>
+ <FilenameWithoutPath>commands.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\enet_weather.c</PathWithFileName>
+ <FilenameWithoutPath>enet_weather.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\eth_client.c</PathWithFileName>
+ <FilenameWithoutPath>eth_client.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\utils\flash_pb.c</PathWithFileName>
+ <FilenameWithoutPath>flash_pb.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\drivers\http.c</PathWithFileName>
+ <FilenameWithoutPath>http.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\images.c</PathWithFileName>
+ <FilenameWithoutPath>images.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\json.c</PathWithFileName>
+ <FilenameWithoutPath>json.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\utils\locator.c</PathWithFileName>
+ <FilenameWithoutPath>locator.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\utils\lwiplib.c</PathWithFileName>
+ <FilenameWithoutPath>lwiplib.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\drivers\pinout.c</PathWithFileName>
+ <FilenameWithoutPath>pinout.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\startup_rvmdk.S</PathWithFileName>
+ <FilenameWithoutPath>startup_rvmdk.S</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\utils\uartstdio.c</PathWithFileName>
+ <FilenameWithoutPath>uartstdio.c</FilenameWithoutPath>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\utils\ustdlib.c</PathWithFileName>
+ <FilenameWithoutPath>ustdlib.c</FilenameWithoutPath>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Libraries</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <Focus>0</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>0</TopLine>
+ <CurrentLine>0</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\driverlib\rvmdk\driverlib.lib</PathWithFileName>
+ <FilenameWithoutPath>driverlib.lib</FilenameWithoutPath>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Documentation</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>5</FileType>
+ <tvExp>0</tvExp>
+ <Focus>1</Focus>
+ <ColumnNumber>0</ColumnNumber>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <TopLine>1</TopLine>
+ <CurrentLine>1</CurrentLine>
+ <bDave2>0</bDave2>
+ <PathWithFileName>.\readme.txt</PathWithFileName>
+ <FilenameWithoutPath>readme.txt</FilenameWithoutPath>
+ <WindowPosition>
+ <length>44</length>
+ <flags>0</flags>
+ <showCmd>1</showCmd>
+ <MinPosition>
+ <xPos>-1</xPos>
+ <yPos>-1</yPos>
+ </MinPosition>
+ <MaxPosition>
+ <xPos>-1</xPos>
+ <yPos>-1</yPos>
+ </MaxPosition>
+ <NormalPosition>
+ <Top>0</Top>
+ <Left>0</Left>
+ <Right>729</Right>
+ <Bottom>300</Bottom>
+ </NormalPosition>
+ </WindowPosition>
+ </File>
+ </Group>
+
+ <MDIGroups>
+ <Orientation>1</Orientation>
+ <ActiveMDIGroup>0</ActiveMDIGroup>
+ <MDIGroup>
+ <Size>100</Size>
+ <ActiveTab>0</ActiveTab>
+ <Documents>
+ <Doc>
+ <Name>.\readme.txt</Name>
+ <ColumnNumber>0</ColumnNumber>
+ <TopLine>1</TopLine>
+ <CurrentLine>1</CurrentLine>
+ </Doc>
+ </Documents>
+ </MDIGroup>
+ </MDIGroups>
+
+</ProjectOpt>
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather.uvproj b/boards/ek-tm4c1294xl/enet_weather/enet_weather.uvproj
new file mode 100644
index 0000000..97d5787
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather.uvproj
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+ <SchemaVersion>1.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>enet_weather</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>TM4C1294NCPDT</Device>
+ <Vendor>Texas Instruments</Vendor>
+ <Cpu>IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile>"STARTUP\Luminary\Startup.s" ("Luminary Startup Code")</StartupFile>
+ <FlashDriverDll>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000)</FlashDriverDll>
+ <DeviceId>5919</DeviceId>
+ <RegisterFile>LM4Fxxxx.H</RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath>Luminary\</RegisterFilePath>
+ <DBRegisterFilePath>Luminary\</DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>.\rvmdk\</OutputDirectory>
+ <OutputName>enet_weather</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath>.\rvmdk\</ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf --bin --output .\rvmdk\enet_weather.bin .\rvmdk\enet_weather.axf</UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ <Simulator>
+ <UseSimulator>0</UseSimulator>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>1</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+ </Simulator>
+ <Target>
+ <UseTarget>1</UseTarget>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>0</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>0</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ </Target>
+ <RunDebugAfterBuild>0</RunDebugAfterBuild>
+ <TargetSelection>4</TargetSelection>
+ <SimDlls>
+ <CpuDll></CpuDll>
+ <CpuDllArguments></CpuDllArguments>
+ <PeripheralDll></PeripheralDll>
+ <PeripheralDllArguments></PeripheralDllArguments>
+ <InitializationFile></InitializationFile>
+ </SimDlls>
+ <TargetDlls>
+ <CpuDll></CpuDll>
+ <CpuDllArguments></CpuDllArguments>
+ <PeripheralDll></PeripheralDll>
+ <PeripheralDllArguments></PeripheralDllArguments>
+ <InitializationFile></InitializationFile>
+ <Driver>BIN\lmidk-agdi.dll</Driver>
+ </TargetDlls>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4099</DriverSelection>
+ </Flash1>
+ <Flash2>BIN\lmidk-agdi.dll</Flash2>
+ <Flash3></Flash3>
+ <Flash4></Flash4>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>0</AdsALst>
+ <AdsACrf>0</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0x40000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x100000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x100000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0x40000</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>0</interw>
+ <Optim>3</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <VariousControls>
+ <MiscControls>--c99</MiscControls>
+ <Define>rvmdk PART_TM4C1294NCPDT TARGET_IS_TM4C129_RA0 LWIP_1_4_1 USE_HTTP_1_0 UART_BUFFERED</Define>
+ <Undefine></Undefine>
+ <IncludePath>.;..;..\..\..\..;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party;</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x00000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <ScatterFile>enet_weather.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc>--entry Reset_Handler</Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Source</GroupName>
+ <Files>
+ <File>
+ <FileName>cmdline.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\utils\cmdline.c</FilePath>
+ </File>
+ <File>
+ <FileName>commands.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>.\commands.c</FilePath>
+ </File>
+ <File>
+ <FileName>enet_weather.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>.\enet_weather.c</FilePath>
+ </File>
+ <File>
+ <FileName>eth_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>.\eth_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>flash_pb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\utils\flash_pb.c</FilePath>
+ </File>
+ <File>
+ <FileName>http.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\drivers\http.c</FilePath>
+ </File>
+ <File>
+ <FileName>images.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>.\images.c</FilePath>
+ </File>
+ <File>
+ <FileName>json.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>.\json.c</FilePath>
+ </File>
+ <File>
+ <FileName>locator.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\utils\locator.c</FilePath>
+ </File>
+ <File>
+ <FileName>lwiplib.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\utils\lwiplib.c</FilePath>
+ </File>
+ <File>
+ <FileName>pinout.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\drivers\pinout.c</FilePath>
+ </File>
+ <File>
+ <FileName>startup_rvmdk.S</FileName>
+ <FileType>2</FileType>
+ <FilePath>.\startup_rvmdk.S</FilePath>
+ </File>
+ <File>
+ <FileName>uartstdio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\utils\uartstdio.c</FilePath>
+ </File>
+ <File>
+ <FileName>ustdlib.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\utils\ustdlib.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Libraries</GroupName>
+ <Files>
+ <File>
+ <FileName>driverlib.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>..\..\..\..\driverlib\rvmdk\driverlib.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Documentation</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>.\readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+</Project>
diff --git a/boards/ek-tm4c1294xl/enet_weather/enet_weather_ccs.cmd b/boards/ek-tm4c1294xl/enet_weather/enet_weather_ccs.cmd
new file mode 100644
index 0000000..e1ac7b0
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/enet_weather_ccs.cmd
@@ -0,0 +1,70 @@
+/******************************************************************************
+ *
+ * enet_weather_ccs.cmd - CCS linker configuration file for enet_weather.
+ *
+ * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+ * Software License Agreement
+ *
+ * Texas Instruments (TI) is supplying this software for use solely and
+ * exclusively on TI's microcontroller products. The software is owned by
+ * TI and/or its suppliers, and is protected under applicable copyright
+ * laws. You may not combine this software with "viral" open-source
+ * software in order to form a larger program.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+ * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+ * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+ * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+ * DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ * This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+ *
+ *****************************************************************************/
+
+--retain=g_pfnVectors
+
+/* The following command line options are set as part of the CCS project. */
+/* If you are building using the command line, or for some reason want to */
+/* define them here, you can uncomment and modify these lines as needed. */
+/* If you are using CCS for building, it is probably better to make any such */
+/* modifications in your CCS project and leave this file alone. */
+/* */
+/* --heap_size=0 */
+/* --stack_size=256 */
+/* --library=rtsv7M3_T_le_eabi.lib */
+
+/* The starting address of the application. Normally the interrupt vectors */
+/* must be located at the beginning of the application. */
+#define APP_BASE 0x00000000
+#define RAM_BASE 0x20000000
+
+/* System memory map */
+
+MEMORY
+{
+ /* Application stored in and executes from internal flash */
+ FLASH (RX) : origin = APP_BASE, length = 0x00100000
+ /* Application uses internal RAM for data */
+ SRAM (RWX) : origin = 0x20000000, length = 0x00040000
+}
+
+/* Section allocation in memory */
+
+SECTIONS
+{
+ .intvecs: > APP_BASE
+ .text : > FLASH
+ .const : > FLASH
+ .cinit : > FLASH
+ .pinit : > FLASH
+ .init_array : > FLASH
+
+ .vtable : > RAM_BASE
+ .data : > SRAM
+ .bss : > SRAM
+ .sysmem : > SRAM
+ .stack : > SRAM
+}
+
+__STACK_TOP = __stack + 2048;
diff --git a/boards/ek-tm4c1294xl/enet_weather/eth_client.c b/boards/ek-tm4c1294xl/enet_weather/eth_client.c
new file mode 100644
index 0000000..39fa07c
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/eth_client.c
@@ -0,0 +1,1310 @@
+//*****************************************************************************
+//
+// eth_client.c - This file handles all of the Ethernet connections using lwIP.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+#include <stdint.h>
+#include <stdbool.h>
+#include "inc/hw_memmap.h"
+#include "inc/hw_types.h"
+#include "driverlib/flash.h"
+#include "driverlib/gpio.h"
+#include "driverlib/interrupt.h"
+#include "driverlib/sysctl.h"
+#include "utils/lwiplib.h"
+#include "lwip/dns.h"
+#include "driverlib/systick.h"
+#include "lwip/dns.h"
+#include "eth_client.h"
+#include "json.h"
+
+//*****************************************************************************
+//
+// Flag indexes for g_sEnet.ui32Flags
+//
+//*****************************************************************************
+#define FLAG_TIMER_DHCP_EN 0
+#define FLAG_TIMER_DNS_EN 1
+#define FLAG_TIMER_TCP_EN 2
+#define FLAG_DHCP_STARTED 3
+#define FLAG_DNS_ADDRFOUND 4
+
+//*****************************************************************************
+//
+// g_sEnet.ulRequest Values
+//
+//*****************************************************************************
+#define WEATHER_NONE 0
+#define WEATHER_CURRENT 1
+#define WEATHER_FORECAST 2
+
+//*****************************************************************************
+//
+// The current state of the Ethernet connection.
+//
+//*****************************************************************************
+struct
+{
+ volatile uint32_t ui32Flags;
+
+ //
+ // Array to hold the MAC addresses.
+ //
+ uint8_t pui8MACAddr[8];
+
+ //
+ // Global define of the TCP structure used.
+ //
+ struct tcp_pcb *psTCP;
+
+ //
+ // Global IP structure to hold a copy of the IP address.
+ //
+ struct ip_addr sLocalIP;
+
+ //
+ // Global IP structure to hold a copy of the DNS resolved address.
+ //
+ struct ip_addr sServerIP;
+
+ //
+ // The saved proxy name as a text string.
+ //
+ const char *pcProxyName;
+
+ volatile enum
+ {
+ iEthNoConnection,
+ iEthDHCPWait,
+ iEthDHCPComplete,
+ iEthDNSWait,
+ iEthTCPConnectWait,
+ iEthTCPConnectComplete,
+ iEthQueryWait,
+ iEthTCPOpen,
+ iEthIdle
+ } eState;
+
+ unsigned long ulRequest;
+
+ tEventFunction pfnEvent;
+}
+g_sEnet;
+
+//*****************************************************************************
+//
+// Maximum size of an weather request.
+//
+//*****************************************************************************
+#define MAX_REQUEST 256
+
+extern uint32_t g_ui32SysClock;
+
+//*****************************************************************************
+//
+// Various strings used to access weather information on the web.
+//
+//*****************************************************************************
+static const char g_cWeatherRequest[] =
+ "GET http://api.openweathermap.org/data/2.5/weather?q=";
+
+static const char g_cWeatherRequestForecast[] =
+ "GET http://api.openweathermap.org/data/2.5/forecast/daily?q=";
+static const char g_cMode[] = "&mode=json&units=metric";
+
+static char g_cAPPIDOpenWeather[] =
+ "&APIID=afc5370fef1dfec1666a5676346b163b";
+static char g_cHTTP11[] = " HTTP/1.0\r\n\r\n";
+
+//*****************************************************************************
+//
+// This structure holds the state and control values for the weather requests.
+//
+//*****************************************************************************
+struct
+{
+ //
+ // The current weather source.
+ //
+ tWeatherSource eWeatherSource;
+
+ //
+ // The format expected from the weather source.
+ //
+ enum
+ {
+ iFormatJSON
+ }
+ eFormat;
+
+ //
+ // The application provided callback function.
+ //
+ tEventFunction pfnEvent;
+
+ //
+ // The application provided weather information structure.
+ //
+ tWeatherReport *psWeatherReport;
+
+ //
+ // The local buffer used to store the current weather request.
+ //
+ char pcRequest[MAX_REQUEST];
+
+ //
+ // The number of valid bytes in the request.
+ //
+ uint32_t ui32RequestSize;
+}
+g_sWeather;
+
+//*****************************************************************************
+//
+// Close an active connection.
+//
+//*****************************************************************************
+void
+EthClientReset(void)
+{
+ //
+ // No longer have a link.
+ //
+ g_sEnet.eState = iEthNoConnection;
+
+ //
+ // Reset the flags to just enable the lwIP timer.
+ //
+ g_sEnet.ui32Flags = (1 << FLAG_TIMER_DHCP_EN);
+
+ //
+ // Reset the addresses.
+ //
+ g_sEnet.sLocalIP.addr = 0;
+ g_sEnet.sServerIP.addr = 0;
+
+ //
+ // Deallocate the TCP structure if it was already allocated.
+ //
+ if(g_sEnet.psTCP)
+ {
+ //
+ // Clear out all of the TCP callbacks.
+ //
+ tcp_sent(g_sEnet.psTCP, NULL);
+ tcp_recv(g_sEnet.psTCP, NULL);
+ tcp_err(g_sEnet.psTCP, NULL);
+
+ //
+ // Close the TCP connection.
+ //
+ tcp_close(g_sEnet.psTCP);
+ g_sEnet.psTCP = 0;
+ }
+}
+
+//*****************************************************************************
+//
+// Handles lwIP TCP/IP errors.
+//
+// \param vPArg is the state data for this connection.
+// \param iErr is the error that was detected.
+//
+// This function is called when the lwIP TCP/IP stack has detected an error.
+// The connection is no longer valid.
+//
+// \return None.
+//
+//*****************************************************************************
+static void
+TCPError(void *vPArg, err_t iErr)
+{
+}
+
+//*****************************************************************************
+//
+// Finalizes the TCP connection in client mode.
+//
+// \param pvArg is the state data for this connection.
+// \param psPcb is the pointer to the TCP control structure.
+// \param psBuf is the buffer structure that holds the data for this receive
+// event.
+// \param iErr is not used in this implementation.
+//
+// This function is called when the lwIP TCP/IP stack has completed a TCP
+// connection.
+//
+// \return This function will return an lwIP defined error code.
+//
+//*****************************************************************************
+static err_t
+TCPReceive(void *pvArg, struct tcp_pcb *psPcb, struct pbuf *psBuf, err_t iErr)
+{
+ struct pbuf *psBufCur;
+ int32_t i32Items;
+
+ if(psBuf == 0)
+ {
+ //
+ // Tell the application that the connection was closed.
+ //
+ if(g_sWeather.pfnEvent)
+ {
+ g_sWeather.pfnEvent(ETH_EVENT_CLOSE, 0, 0);
+ g_sWeather.pfnEvent = 0;
+ }
+
+ //
+ // Close out the port.
+ //
+ tcp_close(psPcb);
+
+ if(psPcb == g_sEnet.psTCP)
+ {
+ g_sEnet.psTCP = 0;
+ }
+
+ g_sEnet.eState = iEthIdle;
+
+ return(ERR_OK);
+ }
+
+ if(g_sEnet.eState == iEthQueryWait)
+ {
+ if(g_sEnet.ulRequest == WEATHER_CURRENT)
+ {
+ //
+ // Read items from the buffer.
+ //
+ i32Items = JSONParseCurrent(0, g_sWeather.psWeatherReport, psBuf);
+
+ //
+ // Make sure some items were found.
+ //
+ if(i32Items > 0)
+ {
+ if(g_sWeather.pfnEvent)
+ {
+ g_sWeather.pfnEvent(ETH_EVENT_RECEIVE,
+ (void *)g_sWeather.psWeatherReport, 0);
+
+ //
+ // Clear the event function and return to the idle state.
+ //
+ g_sEnet.eState = iEthIdle;
+ }
+ }
+ else if(i32Items < 0)
+ {
+ if(g_sWeather.pfnEvent)
+ {
+ //
+ // This was not a valid request.
+ //
+ g_sWeather.pfnEvent(ETH_EVENT_INVALID_REQ, 0, 0);
+
+ //
+ // Clear the event function and return to the idle state.
+ //
+ g_sEnet.eState = iEthIdle;
+ }
+ }
+ }
+ else if(g_sEnet.ulRequest == WEATHER_FORECAST)
+ {
+ //
+ // Read items from the buffer.
+ //
+ i32Items = JSONParseForecast(0, g_sWeather.psWeatherReport, psBuf);
+
+ if(i32Items > 0)
+ {
+ if(g_sWeather.pfnEvent)
+ {
+ g_sWeather.pfnEvent(ETH_EVENT_RECEIVE,
+ (void *)g_sWeather.psWeatherReport, 0);
+
+ //
+ // Clear the event function and return to the idle state.
+ //
+ g_sEnet.eState = iEthIdle;
+ }
+ }
+ else if(i32Items < 0)
+ {
+ if(g_sWeather.pfnEvent)
+ {
+ //
+ // This was not a valid request.
+ //
+ g_sWeather.pfnEvent(ETH_EVENT_INVALID_REQ, 0, 0);
+
+ //
+ // Clear the event function and return to the idle state.
+ //
+ g_sEnet.eState = iEthIdle;
+ }
+ }
+ }
+ }
+ else
+ {
+ //
+ // Go to idle state.
+ //
+ g_sEnet.eState = iEthIdle;
+ }
+
+ //
+ // Initialize the linked list pointer to parse.
+ //
+ psBufCur = psBuf;
+
+ //
+ // Free the buffers used since they have been processed.
+ //
+ while(psBufCur->len != 0)
+ {
+ //
+ // Indicate that you have received and processed this set of TCP data.
+ //
+ tcp_recved(psPcb, psBufCur->len);
+
+ //
+ // Go to the next buffer.
+ //
+ psBufCur = psBufCur->next;
+
+ //
+ // Terminate if there are no more buffers.
+ //
+ if(psBufCur == 0)
+ {
+ break;
+ }
+ }
+
+ //
+ // Free the memory space allocated for this receive.
+ //
+ pbuf_free(psBuf);
+
+ //
+ // Return.
+ //
+ return(ERR_OK);
+}
+
+//*****************************************************************************
+//
+// Handles acknowledgment of data transmitted via Ethernet.
+//
+// \param pvArg is the state data for this connection.
+// \param psPcb is the pointer to the TCP control structure.
+// \param ui16Len is the length of the data transmitted.
+//
+// This function is called when the lwIP TCP/IP stack has received an
+// acknowledgment for data that has been transmitted.
+//
+// \return This function will return an lwIP defined error code.
+//
+//*****************************************************************************
+static err_t
+TCPSent(void *pvArg, struct tcp_pcb *psPcb, u16_t ui16Len)
+{
+ //
+ // Return OK.
+ //
+ return (ERR_OK);
+}
+
+//*****************************************************************************
+//
+// Finalizes the TCP connection in client mode.
+//
+// \param pvArg is the state data for this connection.
+// \param psPcb is the pointer to the TCP control structure.
+// \param iErr is not used in this implementation.
+//
+// This function is called when the lwIP TCP/IP stack has completed a TCP
+// connection.
+//
+// \return This function will return an lwIP defined error code.
+//
+//*****************************************************************************
+static err_t
+TCPConnected(void *pvArg, struct tcp_pcb *psPcb, err_t iErr)
+{
+ //
+ // Check if there was a TCP error.
+ //
+ if(iErr != ERR_OK)
+ {
+ //
+ // Clear out all of the TCP callbacks.
+ //
+ tcp_sent(psPcb, NULL);
+ tcp_recv(psPcb, NULL);
+ tcp_err(psPcb, NULL);
+
+ //
+ // Close the TCP connection.
+ //
+ tcp_close(psPcb);
+
+ if(psPcb == g_sEnet.psTCP)
+ {
+ g_sEnet.psTCP = 0;
+ }
+
+ //
+ // And return.
+ //
+ return (ERR_OK);
+ }
+
+ //
+ // Setup the TCP receive function.
+ //
+ tcp_recv(psPcb, TCPReceive);
+
+ //
+ // Setup the TCP error function.
+ //
+ tcp_err(psPcb, TCPError);
+
+ //
+ // Setup the TCP sent callback function.
+ //
+ tcp_sent(psPcb, TCPSent);
+
+ //
+ // Connection is complete.
+ //
+ g_sEnet.eState = iEthTCPConnectComplete;
+
+ //
+ // Return a success code.
+ //
+ return(ERR_OK);
+}
+
+//*****************************************************************************
+//
+// TCP connect
+//
+// This function attempts to connect to a TCP endpoint.
+//
+// \return None.
+//
+//*****************************************************************************
+err_t
+EthClientTCPConnect(uint32_t ui32Port)
+{
+ err_t eTCPReturnCode;
+
+ //
+ // Enable the TCP timer function calls.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN) = 1;
+
+ if(g_sEnet.psTCP)
+ {
+ //
+ // Initially clear out all of the TCP callbacks.
+ //
+ tcp_sent(g_sEnet.psTCP, NULL);
+ tcp_recv(g_sEnet.psTCP, NULL);
+ tcp_err(g_sEnet.psTCP, NULL);
+
+ //
+ // Make sure there is no lingering TCP connection.
+ //
+ tcp_close(g_sEnet.psTCP);
+ }
+
+ //
+ // Create a new TCP socket.
+ //
+ g_sEnet.psTCP = tcp_new();
+
+ //
+ // Check if you need to go through a proxy.
+ //
+ if(g_sEnet.pcProxyName != 0)
+ {
+ //
+ // Attempt to connect through the proxy server.
+ //
+ eTCPReturnCode = tcp_connect(g_sEnet.psTCP, &g_sEnet.sServerIP,
+ ui32Port, TCPConnected);
+ }
+ else
+ {
+ //
+ // Attempt to connect to the server directly.
+ //
+ eTCPReturnCode = tcp_connect(g_sEnet.psTCP, &g_sEnet.sServerIP,
+ ui32Port, TCPConnected);
+ }
+
+ return(eTCPReturnCode);
+}
+
+//*****************************************************************************
+//
+// TCP connect
+//
+// This function attempts to connect to a TCP endpoint.
+//
+// \return None.
+//
+//*****************************************************************************
+void
+EthClientTCPDisconnect(void)
+{
+ //
+ // No longer have a link.
+ //
+ g_sEnet.eState = iEthNoConnection;
+
+ //
+ // Deallocate the TCP structure if it was already allocated.
+ //
+ if(g_sEnet.psTCP)
+ {
+ //
+ // Close the TCP connection.
+ //
+ tcp_close(g_sEnet.psTCP);
+ g_sEnet.psTCP = 0;
+ }
+}
+
+//*****************************************************************************
+//
+// Handler function when the DNS server gets a response or times out.
+//
+// \param pcName is DNS server name.
+// \param psIPAddr is the DNS server's IP address.
+// \param vpArg is the configurable argument.
+//
+// This function is called when the DNS server resolves an IP or times out.
+// If the DNS server returns an IP structure that is not NULL, add the IP to
+// to the g_sEnet.sServerIP IP structure.
+//
+// \return None.
+//
+//*****************************************************************************
+static void
+DNSServerFound(const char *pcName, struct ip_addr *psIPAddr, void *vpArg)
+{
+ //
+ // Check if a valid DNS server address was found.
+ //
+ if(psIPAddr != NULL)
+ {
+ //
+ // Copy the returned IP address into a global IP address.
+ //
+ g_sEnet.sServerIP = *psIPAddr;
+
+ //
+ // Tell the main program that a DNS address was found.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND) = 1;
+ }
+ else
+ {
+ //
+ // Disable the DNS timer.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0;
+ }
+}
+
+//*****************************************************************************
+//
+// Required by lwIP library to support any host-related timer functions.
+//
+//*****************************************************************************
+void
+lwIPHostTimerHandler(void)
+{
+}
+
+//*****************************************************************************
+//
+// Send a request to the server
+//
+// \param pcRequest request to be sent
+// \param ui32Size length of the request to be sent. this is usually the size
+// of the request minus the termination character
+//
+// This function will send the request to the connected server
+//
+// \return the lwIP error code.
+//
+//*****************************************************************************
+err_t
+EthClientSend(char *pcRequest, uint32_t ui32Size)
+{
+ err_t eError;
+
+ eError = tcp_write(g_sEnet.psTCP, pcRequest, ui32Size,
+ TCP_WRITE_FLAG_COPY);
+
+ //
+ // Write data for sending (but does not send it immediately).
+ //
+ if(eError == ERR_OK)
+ {
+ //
+ // Find out what we can send and send it
+ //
+ tcp_output(g_sEnet.psTCP);
+ }
+
+ return(eError);
+}
+
+//*****************************************************************************
+//
+// DHCP connect
+//
+// This function obtains the MAC address from the User registers, starts the
+// DHCP timer and blocks until an IP address is obtained.
+//
+// \return None.
+//
+//*****************************************************************************
+err_t
+EthClientDHCPConnect(void)
+{
+ //
+ // Check if the DHCP has already been started.
+ //
+ if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) == 0)
+ {
+ //
+ // Set the DCHP started flag.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) = 1;
+ }
+ else
+ {
+ //
+ // If DHCP has already been started, we need to clear the IPs and
+ // switch to static. This forces the LWIP to get new IP address
+ // and retry the DHCP connection.
+ //
+ lwIPNetworkConfigChange(0, 0, 0, IPADDR_USE_STATIC);
+
+ //
+ // Restart the DHCP connection.
+ //
+ lwIPNetworkConfigChange(0, 0, 0, IPADDR_USE_DHCP);
+ }
+
+ return ERR_OK;
+}
+
+//*****************************************************************************
+//
+// Handler function when the DNS server gets a response or times out.
+//
+// \param pcName is DNS server name.
+//
+// This function is called when the DNS server resolves an IP or times out.
+// If the DNS server returns an IP structure that is not NULL, add the IP to
+// to the g_sEnet.sServerIP IP structure.
+//
+// \return None.
+//
+//*****************************************************************************
+int32_t
+EthClientDNSResolve(const char *pcName)
+{
+ err_t iRet;
+
+ if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN))
+ {
+ return(ERR_INPROGRESS);
+ }
+
+ //
+ // Set DNS config timer to true.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 1;
+
+ //
+ // Initialize the host name IP address found flag to false.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND) = 0;
+
+ //
+ // Resolve host name.
+ //
+ iRet = dns_gethostbyname(pcName, &g_sEnet.sServerIP, DNSServerFound, 0);
+
+ //
+ // If ERR_OK is returned, the local DNS table resolved the host name. If
+ // ERR_INPROGRESS is returned, the DNS request has been queued and will be
+ // sent to the DNS server.
+ //
+ if(iRet == ERR_OK)
+ {
+ //
+ // Stop calling the DNS timer function.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0;
+ }
+
+ //
+ // Return host name not found.
+ //
+ return(iRet);
+}
+
+//*****************************************************************************
+//
+// Returns the IP address for this interface.
+//
+// This function will read and return the currently assigned IP address for
+// the Tiva Ethernet interface.
+//
+// \return Returns the assigned IP address for this interface.
+//
+//*****************************************************************************
+uint32_t
+EthClientAddrGet(void)
+{
+ //
+ // Return IP.
+ //
+ return(lwIPLocalIPAddrGet());
+}
+
+//*****************************************************************************
+//
+// Returns the weather server IP address for this interface.
+//
+// This function will read and return the weather server IP address that is
+// currently in use. This could be the proxy server if the Internet proxy
+// is enabled.
+//
+// \return Returns the weather server IP address for this interface.
+//
+//*****************************************************************************
+uint32_t
+EthClientServerAddrGet(void)
+{
+ //
+ // Return IP.
+ //
+ return((uint32_t)g_sEnet.sServerIP.addr);
+}
+
+//*****************************************************************************
+//
+// Returns the MAC address for the Tiva Ethernet controller.
+//
+// \param pui8MACAddr is the 6 byte MAC address assigned to the Ethernet
+// controller.
+//
+// This function will read and return the MAC address for the Ethernet
+// controller.
+//
+// \return Returns the weather server IP address for this interface.
+//
+//*****************************************************************************
+void
+EthClientMACAddrGet(uint8_t *pui8MACAddr)
+{
+ int32_t iIdx;
+
+ for(iIdx = 0; iIdx < 6; iIdx++)
+ {
+ pui8MACAddr[iIdx] = g_sEnet.pui8MACAddr[iIdx];
+ }
+}
+
+//*****************************************************************************
+//
+// Set the proxy string for the Ethernet connection.
+//
+// \param pcProxyName is the string used as the proxy server name.
+//
+// This function sets the current proxy used by the Ethernet connection. The
+// \e pcProxyName value can be 0 to indicate that no proxy is in use or it can
+// be a pointer to a string that holds the name of the proxy server to use.
+// The content of the pointer passed to \e pcProxyName should not be changed
+// after this call as this function only stores the pointer and does not copy
+// the data from this pointer.
+//
+// \return None.
+//
+//*****************************************************************************
+void
+EthClientProxySet(const char *pcProxyName)
+{
+ //
+ // Save the new proxy string.
+ //
+ g_sEnet.pcProxyName = pcProxyName;
+
+ //
+ // Reset the connection on any change to the proxy.
+ //
+ EthClientReset();
+}
+
+//*****************************************************************************
+//
+// Initialize the Ethernet client
+//
+// This function initializes all the Ethernet components to not configured.
+// This tells the SysTick interrupt which timer modules to call.
+//
+// \return None.
+//
+//*****************************************************************************
+void
+EthClientInit(tEventFunction pfnEvent)
+{
+ uint32_t ui32User0, ui32User1;
+
+ //
+ // Initialize all the Ethernet components to not configured. This tells
+ // the SysTick interrupt which timer modules to call.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN) = 0;
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0;
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN) = 0;
+
+ g_sEnet.eState = iEthNoConnection;
+
+ g_sEnet.pfnEvent = pfnEvent;
+
+ //
+ // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC
+ // address needed to program the hardware registers, then program the MAC
+ // address into the Ethernet Controller registers.
+ //
+ FlashUserGet(&ui32User0, &ui32User1);
+
+ g_sEnet.pui8MACAddr[0] = ((ui32User0 >> 0) & 0xff);
+ g_sEnet.pui8MACAddr[1] = ((ui32User0 >> 8) & 0xff);
+ g_sEnet.pui8MACAddr[2] = ((ui32User0 >> 16) & 0xff);
+ g_sEnet.pui8MACAddr[3] = ((ui32User1 >> 0) & 0xff);
+ g_sEnet.pui8MACAddr[4] = ((ui32User1 >> 8) & 0xff);
+ g_sEnet.pui8MACAddr[5] = ((ui32User1 >> 16) & 0xff);
+
+ lwIPInit(g_ui32SysClock, g_sEnet.pui8MACAddr, 0, 0, 0, IPADDR_USE_DHCP);
+
+ //
+ // Start lwIP tick interrupt.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN) = 1;
+}
+
+//*****************************************************************************
+//
+// Periodic Tick for the Ethernet client
+//
+// This function is the needed periodic tick for the Ethernet client. It needs
+// to be called periodically through the use of a timer or systick.
+//
+// \return None.
+//
+//*****************************************************************************
+void
+EthClientTick(uint32_t ui32TickMS)
+{
+ uint32_t ui32IPAddr;
+ int32_t i32Ret;
+
+ if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN))
+ {
+ lwIPTimer(ui32TickMS);
+ }
+
+ if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN))
+ {
+ dns_tmr();
+ }
+
+ if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN))
+ {
+ tcp_tmr();
+ }
+
+ //
+ // Check for loss of link.
+ //
+ if((g_sEnet.eState != iEthNoConnection) &&
+ (lwIPLocalIPAddrGet() == 0xffffffff))
+ {
+ //
+ // Reset the connection due to a loss of link.
+ //
+ EthClientReset();
+
+ //
+ // Signal a disconnect event.
+ //
+ g_sEnet.pfnEvent(ETH_EVENT_DISCONNECT, 0, 0);
+ }
+ else if(g_sEnet.eState == iEthNoConnection)
+ {
+ //
+ // Once link is detected start DHCP.
+ //
+ if(lwIPLocalIPAddrGet() != 0xffffffff)
+ {
+ EthClientDHCPConnect();
+
+ g_sEnet.eState = iEthDHCPWait;
+ }
+ }
+ else if(g_sEnet.eState == iEthDHCPWait)
+ {
+ //
+ // Get IP address.
+ //
+ ui32IPAddr = lwIPLocalIPAddrGet();
+
+ //
+ // If IP Address has not yet been assigned, update the display
+ // accordingly.
+ //
+ if((ui32IPAddr != 0xffffffff) && (ui32IPAddr != 0))
+ {
+ //
+ // Update the DHCP IP address.
+ //
+ g_sEnet.sLocalIP.addr = ui32IPAddr;
+
+ g_sEnet.eState = iEthDHCPComplete;
+
+ //
+ // Stop DHCP timer since an address has been provided.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) = 0;
+ }
+ }
+ else if(g_sEnet.eState == iEthDHCPComplete)
+ {
+ if(g_sEnet.pcProxyName == 0)
+ {
+ //
+ // Resolve the host by name.
+ //
+ i32Ret = EthClientDNSResolve("api.openweathermap.org");
+ }
+ else
+ {
+ //
+ // Resolve the proxy by name.
+ //
+ i32Ret = EthClientDNSResolve(g_sEnet.pcProxyName);
+ }
+
+ if(i32Ret == ERR_OK)
+ {
+ //
+ // If the address was already returned then go to idle.
+ //
+ g_sEnet.eState = iEthIdle;
+
+ //
+ // Notify the main routine of the new Ethernet connection.
+ //
+ g_sEnet.pfnEvent(ETH_EVENT_CONNECT, &g_sEnet.sLocalIP.addr, 4);
+ }
+ else if(i32Ret == ERR_INPROGRESS)
+ {
+ //
+ // If the request is pending the go to the iEthDNSWait state.
+ //
+ g_sEnet.eState = iEthDNSWait;
+ }
+ }
+ else if(g_sEnet.eState == iEthDNSWait)
+ {
+ //
+ // Check if the host name was resolved.
+ //
+ if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND))
+ {
+ //
+ // Stop calling the DNS timer function.
+ //
+ HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0;
+
+ g_sEnet.eState = iEthIdle;
+
+ //
+ // Notify the main routine of the new Ethernet connection.
+ //
+ g_sEnet.pfnEvent(ETH_EVENT_CONNECT, &g_sEnet.sLocalIP.addr, 4);
+ }
+ }
+ else if(g_sEnet.eState == iEthTCPConnectWait)
+ {
+ }
+ else if(g_sEnet.eState == iEthTCPConnectComplete)
+ {
+ err_t eError;
+
+ g_sEnet.eState = iEthTCPOpen;
+
+ eError = EthClientSend(g_sWeather.pcRequest,
+ g_sWeather.ui32RequestSize);
+
+ if(eError == ERR_OK)
+ {
+ //
+ // Waiting on a query response.
+ //
+ g_sEnet.eState = iEthQueryWait;
+ }
+ else
+ {
+ g_sEnet.eState = iEthIdle;
+ }
+ }
+}
+
+//*****************************************************************************
+//
+// Set the current weather source.
+//
+//*****************************************************************************
+void
+WeatherSourceSet(tWeatherSource eWeatherSource)
+{
+ //
+ // Save the source.
+ //
+ g_sWeather.eWeatherSource = eWeatherSource;
+ g_sWeather.eFormat = iFormatJSON;
+}
+
+//*****************************************************************************
+//
+// Merges strings into the current request at a given pointer and offset.
+//
+//*****************************************************************************
+static int32_t
+MergeRequest(int32_t i32Offset, const char *pcSrc, int32_t i32Size,
+ bool bReplaceSpace)
+{
+ int32_t i32Idx;
+
+ //
+ // Copy the base request to the buffer.
+ //
+ for(i32Idx = 0; i32Idx < i32Size; i32Idx++)
+ {
+ if((pcSrc[i32Idx] == ' ') && (bReplaceSpace))
+ {
+ if((i32Offset + 3) >= sizeof(g_sWeather.pcRequest))
+ {
+ break;
+ }
+ g_sWeather.pcRequest[i32Offset++] = '%';
+ g_sWeather.pcRequest[i32Offset++] = '2';
+ g_sWeather.pcRequest[i32Offset] = '0';
+ }
+ else
+ {
+ g_sWeather.pcRequest[i32Offset] = pcSrc[i32Idx];
+ }
+
+ if((i32Offset >= sizeof(g_sWeather.pcRequest)) ||
+ (pcSrc[i32Idx] == 0))
+ {
+ break;
+ }
+
+ i32Offset++;
+ }
+
+ return(i32Offset);
+}
+
+//*****************************************************************************
+//
+// Gets the daily forecast for a given city.
+//
+//*****************************************************************************
+int32_t
+WeatherForecast(tWeatherSource eWeatherSource, const char *pcQuery,
+ tWeatherReport *psWeatherReport, tEventFunction pfnEvent)
+{
+ int32_t i32Idx;
+ const char pcCount[] = "&cnt=1";
+
+ //
+ // If the requested source is not valid or there is no call back then
+ // just fail.
+ //
+ if((eWeatherSource != iWSrcOpenWeatherMap) || (g_sWeather.pfnEvent))
+ {
+ return (-1);
+ }
+
+ g_sWeather.pfnEvent = pfnEvent;
+ g_sWeather.psWeatherReport = psWeatherReport;
+
+ //
+ // Connect or reconnect to port 80.
+ //
+ g_sEnet.eState = iEthTCPConnectWait;
+
+ //
+ // Copy the base forecast request to the buffer.
+ //
+ i32Idx = MergeRequest(0, g_cWeatherRequestForecast,
+ sizeof(g_cWeatherRequestForecast), false);
+
+ //
+ // Append the request.
+ //
+ i32Idx = MergeRequest(i32Idx, pcQuery, sizeof(g_sWeather.pcRequest),
+ true);
+
+ //
+ // Append the request mode.
+ //
+ i32Idx = MergeRequest(i32Idx, g_cMode, sizeof(g_cMode), false);
+
+ //
+ // Append the count.
+ //
+ i32Idx = MergeRequest(i32Idx, pcCount, sizeof(pcCount), false);
+
+ //
+ // Append the App ID.
+ //
+ i32Idx = MergeRequest(i32Idx, g_cAPPIDOpenWeather,
+ sizeof(g_cAPPIDOpenWeather), false);
+
+ //
+ // Append the "HTTP:/1.1" string.
+ //
+ i32Idx = MergeRequest(i32Idx, g_cHTTP11, sizeof(g_cHTTP11), false);
+
+ //
+ // Forcast weather report request.
+ //
+ g_sEnet.ulRequest = WEATHER_FORECAST;
+
+ if(EthClientTCPConnect(80) != ERR_OK)
+ {
+ return(-1);
+ }
+
+ //
+ // Save the size of the request.
+ //
+ g_sWeather.ui32RequestSize = i32Idx;
+
+ return(0);
+}
+
+//*****************************************************************************
+//
+// Gets the current weather information for a given city.
+//
+//*****************************************************************************
+int32_t
+WeatherCurrent(tWeatherSource eWeatherSource, const char *pcQuery,
+ tWeatherReport *psWeatherReport, tEventFunction pfnEvent)
+{
+ int32_t i32Idx;
+
+ //
+ // If the requested source is not valid or there is no call back then
+ // just fail.
+ //
+ if((eWeatherSource != iWSrcOpenWeatherMap) || (g_sWeather.pfnEvent))
+ {
+ return (-1);
+ }
+
+ g_sWeather.pfnEvent = pfnEvent;
+ g_sWeather.psWeatherReport = psWeatherReport;
+
+ //
+ // Copy the base current request to the buffer.
+ //
+ i32Idx = MergeRequest(0, g_cWeatherRequest, sizeof(g_cWeatherRequest),
+ false);
+
+ //
+ // Append the request.
+ //
+ i32Idx = MergeRequest(i32Idx, pcQuery, sizeof(g_sWeather.pcRequest), true);
+
+ //
+ // Append the request mode.
+ //
+ i32Idx = MergeRequest(i32Idx, g_cMode, sizeof(g_cMode), false);
+
+ //
+ // Append the App ID.
+ //
+ i32Idx = MergeRequest(i32Idx, g_cAPPIDOpenWeather,
+ sizeof(g_cAPPIDOpenWeather), false);
+
+ //
+ // Append the "HTTP:/1.1" string.
+ //
+ i32Idx = MergeRequest(i32Idx, g_cHTTP11, sizeof(g_cHTTP11), false);
+
+ //
+ // Save the size of this request.
+ //
+ g_sWeather.ui32RequestSize = i32Idx;
+
+ //
+ // Connect or reconnect to port 80.
+ //
+ g_sEnet.eState = iEthTCPConnectWait;
+
+ //
+ // Current weather report request.
+ //
+ g_sEnet.ulRequest = WEATHER_CURRENT;
+
+ //
+ // Connect to server
+ //
+ if(EthClientTCPConnect(80) != ERR_OK)
+ {
+ return(-1);
+ }
+
+ return(0);
+}
+
diff --git a/boards/ek-tm4c1294xl/enet_weather/eth_client.h b/boards/ek-tm4c1294xl/enet_weather/eth_client.h
new file mode 100644
index 0000000..efbfd56
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/eth_client.h
@@ -0,0 +1,163 @@
+//*****************************************************************************
+//
+// eth_client.h - Prototypes for the driver for the eth_client.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+#ifndef ETH_CLIENT_H_
+#define ETH_CLIENT_H_
+
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//*****************************************************************************
+//
+// Events passed back to the application.
+//
+//*****************************************************************************
+#define ETH_EVENT_RECEIVE 0x00000001
+#define ETH_EVENT_CONNECT 0x00000002
+#define ETH_EVENT_DISCONNECT 0x00000003
+#define ETH_EVENT_CLOSE 0x00000004
+#define ETH_EVENT_INVALID_REQ 0x00000005
+
+//*****************************************************************************
+//
+// The weather access methods.
+//
+//*****************************************************************************
+typedef enum
+{
+ //
+ // openweathermap.org.
+ //
+ iWSrcOpenWeatherMap
+}
+tWeatherSource;
+
+//*****************************************************************************
+//
+// Generic weather reporting structure.
+//
+//*****************************************************************************
+typedef struct
+{
+ //
+ // The brief weather description, this is caller provided.
+ //
+ const char *pcDescription;
+
+ //
+ // The current temperature(units determined by caller).
+ //
+ int32_t i32Temp;
+
+ //
+ // The daily high temperature(units determined by caller).
+ //
+ int32_t i32TempHigh;
+
+ //
+ // The daily low temperature(units determined by caller).
+ //
+ int32_t i32TempLow;
+
+ //
+ // The current humidity(units determined by caller).
+ //
+ int32_t i32Humidity;
+
+ //
+ // The current atmospheric pressure(units determined by caller).
+ //
+ int32_t i32Pressure;
+
+ //
+ // The last time these values were update (GMT Unix time).
+ //
+ uint32_t ui32Time;
+
+ //
+ // The sunrise time (GMT Unix time).
+ //
+ uint32_t ui32SunRise;
+
+ //
+ // The sunset time (GMT Unix time).
+ //
+ uint32_t ui32SunSet;
+
+ //
+ // Icon image.
+ //
+ const uint8_t *pui8Image;
+}
+tWeatherReport;
+
+//*****************************************************************************
+//
+// The type definition for event functions.
+//
+//*****************************************************************************
+typedef void (* tEventFunction)(uint32_t ui32Event, void* pvData,
+ uint32_t ui32Param);
+
+//*****************************************************************************
+//
+// Exported Ethernet function prototypes.
+//
+//*****************************************************************************
+extern void EthClientInit(tEventFunction pfnEvent);
+extern void EthClientProxySet(const char *pcProxyName);
+extern void EthClientTick(uint32_t ui32TickMS);
+extern uint32_t EthClientAddrGet(void);
+extern void EthClientMACAddrGet(uint8_t *pui8Addr);
+extern uint32_t EthClientServerAddrGet(void);
+extern void EthClientReset(void);
+void EthClientTCPDisconnect(void);
+
+//*****************************************************************************
+//
+// Exported weather related prototypes.
+//
+//*****************************************************************************
+extern void WeatherSourceSet(tWeatherSource eWeatherSource);
+extern int32_t WeatherCurrent(tWeatherSource eWeatherSource,
+ const char *pcQuery,
+ tWeatherReport *psWeather,
+ tEventFunction pfnEvent);
+extern int32_t WeatherForecast(tWeatherSource eWeatherSource,
+ const char *pcQuery,
+ tWeatherReport *psWeather,
+ tEventFunction pfnEvent);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.bin b/boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.bin
new file mode 100644
index 0000000..964f32f
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.bin
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.out b/boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.out
new file mode 100644
index 0000000..2f10a2d
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/ewarm/Exe/enet_weather.out
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.axf b/boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.axf
new file mode 100644
index 0000000..31133ae
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.axf
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.bin b/boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.bin
new file mode 100644
index 0000000..f21957f
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/gcc/enet_weather.bin
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/images.c b/boards/ek-tm4c1294xl/enet_weather/images.c
new file mode 100644
index 0000000..5f4aa76
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/images.c
@@ -0,0 +1,111 @@
+//*****************************************************************************
+//
+// images.c - The image sets for the various weather conditions.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include <stdbool.h>
+
+//*****************************************************************************
+//
+// Sun Image
+//
+//*****************************************************************************
+const uint8_t g_pui8SunImage;
+
+//*****************************************************************************
+//
+// Cloudy Image
+//
+//*****************************************************************************
+const uint8_t g_pui8CloudyImage;
+
+//*****************************************************************************
+//
+// Rain Image
+//
+//*****************************************************************************
+const uint8_t g_pui8RainImage;
+
+//*****************************************************************************
+//
+// Thunderstorm Image
+//
+//*****************************************************************************
+const uint8_t g_pui8ThuderStormImage;
+
+//*****************************************************************************
+//
+// Fog/Mist Image
+//
+//*****************************************************************************
+const uint8_t g_pui8FogImage;
+
+//*****************************************************************************
+//
+// Snow Image
+//
+//*****************************************************************************
+const uint8_t g_pui8SnowImage;
+
+//*****************************************************************************
+//
+// Moon Image
+//
+//*****************************************************************************
+const uint8_t g_pui8MoonImage;
+
+//*****************************************************************************
+//
+// Right Arrow Image
+//
+//*****************************************************************************
+const uint8_t g_pui8RightImage;
+
+//*****************************************************************************
+//
+// Left Arrow Image
+//
+//*****************************************************************************
+const uint8_t g_pui8LeftImage;
+
+//*****************************************************************************
+//
+// Up Tab Image
+//
+//*****************************************************************************
+const uint8_t g_pui8UpTabImage;
+
+//*****************************************************************************
+//
+// Down Tab Image
+//
+//*****************************************************************************
+const uint8_t g_pui8DownTabImage;
+
+//*****************************************************************************
+//
+// Texas Instrument Logo Image
+//
+//*****************************************************************************
+uint8_t g_pui8TIImagePalette[16 * 3];
+uint8_t g_pui8TIImage;
diff --git a/boards/ek-tm4c1294xl/enet_weather/images.h b/boards/ek-tm4c1294xl/enet_weather/images.h
new file mode 100644
index 0000000..06b2be6
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/images.h
@@ -0,0 +1,42 @@
+//*****************************************************************************
+//
+// images.h - The definitions for the images in the images.c file.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#ifndef __IMAGES_H__
+#define __IMAGES_H__
+
+extern const uint8_t g_pui8SunImage[];
+extern const uint8_t g_pui8MoonImage[];
+extern const uint8_t g_pui8CloudyImage[];
+extern const uint8_t g_pui8RainImage[];
+extern const uint8_t g_pui8ThuderStormImage[];
+extern const uint8_t g_pui8SnowImage[];
+extern const uint8_t g_pui8FogImage[];
+extern const uint8_t g_pui8UpTabImage[];
+extern const uint8_t g_pui8DownTabImage[];
+extern const uint8_t g_pui8LeftImage[];
+extern const uint8_t g_pui8RightImage[];
+extern uint8_t g_pui8TIImagePalette[];
+extern uint8_t g_pui8TIImage[];
+
+#endif
diff --git a/boards/ek-tm4c1294xl/enet_weather/json.c b/boards/ek-tm4c1294xl/enet_weather/json.c
new file mode 100644
index 0000000..5d6439d
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/json.c
@@ -0,0 +1,843 @@
+//*****************************************************************************
+//
+// json.c - File to handle JSON formatted data from websites.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "utils/ustdlib.h"
+#include "utils/lwiplib.h"
+#include "eth_client.h"
+#include "json.h"
+#include "images.h"
+
+//****************************************************************************
+//
+// The locally defined lwIP buffer parsing pointer.
+//
+//****************************************************************************
+typedef struct
+{
+ //
+ // A pbuf pointer from lwIP.
+ //
+ struct pbuf *psBuf;
+
+ //
+ // The current index into the pbuf pointer.
+ //
+ uint32_t ui32Idx;
+}
+tBufPtr;
+
+//****************************************************************************
+//
+// Initialize a buffer parsing pointer.
+//
+//****************************************************************************
+static void
+BufPtrInit(tBufPtr *psBufPtr, struct pbuf *psBuf)
+{
+ psBufPtr->psBuf = psBuf;
+ psBufPtr->ui32Idx = 0;
+}
+
+//****************************************************************************
+//
+// Get a single byte from a parsing pointer.
+//
+//****************************************************************************
+static uint8_t
+BufData8Get(tBufPtr *psBufPtr)
+{
+ return(((uint8_t *)psBufPtr->psBuf->payload)[psBufPtr->ui32Idx]);
+}
+
+//*****************************************************************************
+//
+// Increment a parsing pointer by a given value.
+//
+//*****************************************************************************
+uint32_t
+BufPtrInc(tBufPtr *psBufPtr, uint32_t ui32Inc)
+{
+ psBufPtr->ui32Idx += ui32Inc;
+
+ if(psBufPtr->ui32Idx >= psBufPtr->psBuf->len)
+ {
+ psBufPtr->ui32Idx = 0;
+
+ psBufPtr->psBuf = psBufPtr->psBuf->next;
+
+ if(psBufPtr->psBuf == 0)
+ {
+ ui32Inc = 0;
+ }
+ }
+ return(ui32Inc);
+}
+
+//*****************************************************************************
+//
+// Return the image to use for the given icon returned from the weather update.
+//
+//*****************************************************************************
+void
+GetImage(char *pcIcon, const uint8_t **ppui8Image, const char **ppcDescription)
+{
+ static const struct
+ {
+ char pcId[2];
+ const uint8_t *pui8Image;
+ const char *pcDescription;
+ }
+ pcIconTable[9] =
+ {
+ //
+ // Clear Sky.
+ //
+ { "01", g_pui8SunImage, "Clear Sky"},
+
+ //
+ // Light Clouds.
+ //
+ { "02", g_pui8CloudyImage, "Light Clouds"},
+
+ //
+ // Scattered Clouds.
+ //
+ { "03", g_pui8CloudyImage, "Scattered Clouds"},
+
+ //
+ // Broken Clouds.
+ //
+ { "04", g_pui8CloudyImage, "Broken Clouds"},
+
+ //
+ // Rain showers.
+ //
+ { "09", g_pui8RainImage, "Light Rain"},
+
+ //
+ // Rain.
+ //
+ { "10", g_pui8RainImage, "Rain"},
+
+ //
+ // Thunderstorms.
+ //
+ { "11", g_pui8ThuderStormImage, "Thunderstorms"},
+
+ //
+ // Snow.
+ //
+ { "13", g_pui8SnowImage, "Snow"},
+
+ //
+ // Mist/Fog.
+ //
+ { "50", g_pui8FogImage, "Mist/Fog"},
+ };
+ int32_t i32Idx;
+
+ for(i32Idx = 0; i32Idx < 9; i32Idx++)
+ {
+ if((pcIcon[0] == pcIconTable[i32Idx].pcId[0]) &&
+ (pcIcon[1] == pcIconTable[i32Idx].pcId[1]))
+ {
+ *ppui8Image = pcIconTable[i32Idx].pui8Image;
+ *ppcDescription = pcIconTable[i32Idx].pcDescription;
+ break;
+ }
+ }
+}
+
+//*****************************************************************************
+//
+// Compare a string at the current location of a parsing pointer.
+//
+//*****************************************************************************
+uint32_t
+CompareString(tBufPtr *psBufPtr, const char *pcField, uint32_t ui32Size)
+{
+ uint32_t ui32Idx;
+
+ for(ui32Idx = 0; ui32Idx < ui32Size; ui32Idx++)
+ {
+ if(BufData8Get(psBufPtr) == pcField[ui32Idx])
+ {
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if(ui32Idx == ui32Size)
+ {
+ return(0);
+ }
+
+ return(1);
+}
+
+//*****************************************************************************
+//
+// This function searches for a field from the JSON data. The field should be
+// quoted in the data and immediately follow a '{' character. This can be used
+// to also search for sub data in another field if the pointer to the data for
+// the parent field.
+//
+//*****************************************************************************
+static uint32_t
+GetField(char *pcField, tBufPtr *psBufPtr)
+{
+ uint32_t ui32Curly, ui32Quote;
+ int32_t i32NewItem;
+
+ ui32Curly = 0;
+ i32NewItem = 0;
+ ui32Quote = 0;
+
+ while(1)
+ {
+ if(BufData8Get(psBufPtr) == '{')
+ {
+ ui32Curly++;
+ }
+ else if(BufData8Get(psBufPtr) == '}')
+ {
+ ui32Curly--;
+
+ if(ui32Curly == 1)
+ {
+ ui32Quote = 0;
+ }
+ }
+ else if(BufData8Get(psBufPtr) == ',')
+ {
+ if((ui32Curly == 1) && ((ui32Quote & 1) == 0))
+ {
+ ui32Quote = 0;
+ }
+ }
+ else if(BufData8Get(psBufPtr) == '"')
+ {
+ if((ui32Curly == 1) && (ui32Quote == 0))
+ {
+ i32NewItem = 1;
+ }
+ ui32Quote++;
+ }
+
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ break;
+ }
+
+ if(i32NewItem)
+ {
+ i32NewItem = 0;
+ if(CompareString(psBufPtr, pcField, ustrlen(pcField)) == 0)
+ {
+ while(1)
+ {
+ if(BufData8Get(psBufPtr) == ':')
+ {
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ break;
+ }
+ return(1);
+ }
+
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ break;
+ }
+ }
+ return(0);
+ }
+ }
+ }
+ return(0);
+}
+
+//*****************************************************************************
+//
+// This function searches for a value in a JSON item as an integer. These are
+// non-quoted values so if the number is a quoted integer this function returns
+// -1. If the value is found then it is returned by this function.
+//
+//*****************************************************************************
+int32_t
+GetFieldValueInt(tBufPtr *psBufPtr)
+{
+ int32_t i32Idx;
+ char pcTemp[20];
+ const char *pEnd;
+
+ i32Idx = 0;
+
+ while(1)
+ {
+ //
+ // Find the end of this item.
+ //
+ if((BufData8Get(psBufPtr) == '}') || (BufData8Get(psBufPtr) == ','))
+ {
+ //
+ // null terminate the string and get the value from the string in
+ // decimal.
+ //
+ pcTemp[i32Idx] = 0;
+ return(ustrtoul(pcTemp, &pEnd, 10));
+ }
+
+ //
+ // Should not hit a " char or something went wrong.
+ //
+ if(BufData8Get(psBufPtr) == '"')
+ {
+ break;
+ }
+
+ //
+ // Copy the string to the local variable.
+ //
+ pcTemp[i32Idx] = BufData8Get(psBufPtr);
+
+ if((pcTemp[i32Idx] == '\r') || (pcTemp[i32Idx] == '\n'))
+ {
+ pcTemp[i32Idx] = 0;
+ }
+ else
+ {
+ i32Idx++;
+ }
+
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ break;
+ }
+
+ //
+ // Number was too large to represent.
+ //
+ if(i32Idx >= sizeof(pcTemp))
+ {
+ break;
+ }
+ }
+ return(INVALID_INT);
+}
+
+//*****************************************************************************
+//
+// This function searches for a value in a JSON item as quoted value. These
+// values are quoted values so if the number is not a quoted value this
+// function returns -1. If the quoted value is found then it is returned in
+// the pcDataDest array.
+//
+//*****************************************************************************
+int32_t
+GetFieldValueString(tBufPtr *psBufPtr, char *pcDataDest, uint32_t ui32SizeDest)
+{
+ int32_t i32OutIdx;
+
+ //
+ // The value should always start with a " char or something went wrong.
+ //
+ if(BufData8Get(psBufPtr) != '"')
+ {
+ return(-1);
+ }
+
+ //
+ // Skip the initial " char.
+ //
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ return(-1);
+ }
+
+ for(i32OutIdx = 0; i32OutIdx < ui32SizeDest;)
+ {
+ //
+ // Either a '}', ',', or '"' ends an item.
+ //
+ if((BufData8Get(psBufPtr) == '}') ||
+ (BufData8Get(psBufPtr) == ',') ||
+ (BufData8Get(psBufPtr) == '"'))
+ {
+ //
+ // Null terminate the string and return.
+ //
+ pcDataDest[i32OutIdx] = 0;
+ return(i32OutIdx);
+ }
+
+ //
+ // Continue coping chars into the destination buffer.
+ //
+ pcDataDest[i32OutIdx] = BufData8Get(psBufPtr);
+
+ //
+ // These can occur in the response string and need to be ignored.
+ //
+ if((pcDataDest[i32OutIdx] == '\r') || (pcDataDest[i32OutIdx] == '\n'))
+ {
+ pcDataDest[i32OutIdx] = 0;
+ }
+ else
+ {
+ i32OutIdx++;
+ }
+
+ if(BufPtrInc(psBufPtr, 1) != 1)
+ {
+ break;
+ }
+ }
+
+ //
+ // Make sure to null terminate inside the current string.
+ //
+ if(i32OutIdx == ui32SizeDest)
+ {
+ pcDataDest[i32OutIdx-1] = 0;
+ return(i32OutIdx - 1);
+ }
+ return(-1);
+}
+
+//*****************************************************************************
+//
+// Fill out the psWeatherReport structure from data returned from the JSON
+// query.
+//
+//*****************************************************************************
+int32_t
+JSONParseForecast(uint32_t ui32Index, tWeatherReport *psWeatherReport,
+ struct pbuf *psBuf)
+{
+ tBufPtr sBufPtr, sBufList, sBufTemp;
+ char pcCode[4];
+ int32_t i32Items,i32Code;
+
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Check and see if the request was valid.
+ //
+ if(GetField("cod", &sBufPtr) != 0)
+ {
+ //
+ // Check for a 404 not found error.
+ //
+ sBufTemp = sBufPtr;
+
+ //
+ // Check for a 404 not found error.
+ //
+ i32Code = GetFieldValueInt(&sBufTemp);
+
+ sBufTemp = sBufPtr;
+
+ if(i32Code != INVALID_INT)
+ {
+ if(i32Code == 404)
+ {
+ return(-1);
+ }
+ }
+ else if(GetFieldValueString(&sBufTemp, pcCode, sizeof(pcCode)) >= 0)
+ {
+ //
+ // Check for a 404 not found error.
+ //
+ if(ustrncmp(pcCode, "404", 3) == 0)
+ {
+ return(-1);
+ }
+ }
+ }
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Initialize the number of items found.
+ //
+ i32Items = 0;
+
+ if(GetField("list", &sBufPtr) != 0)
+ {
+ //
+ // Save the list pointer.
+ //
+ sBufList = sBufPtr;
+
+ //
+ // Get the humidity.
+ //
+ if(GetField("humidity", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32Humidity = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32Humidity = INVALID_INT;
+ }
+
+ //
+ // Reset the pointer to the start of the list values.
+ //
+ sBufPtr = sBufList;
+
+ //
+ // Get the average daily pressure.
+ //
+ if(GetField("pressure", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32Pressure = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32Pressure = INVALID_INT;
+ }
+
+ //
+ // Reset the pointer to the start of the list values.
+ //
+ sBufPtr = sBufList;
+
+ //
+ // Get the average daily temperature.
+ //
+ if(GetField("temp", &sBufPtr) != 0)
+ {
+ if(GetField("day", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32Temp = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32Temp = INVALID_INT;
+ }
+ }
+
+ //
+ // Reset the pointer to the start of the list values.
+ //
+ sBufPtr = sBufList;
+
+ //
+ // Get the low temperature.
+ //
+ if(GetField("temp", &sBufPtr) != 0)
+ {
+ if(GetField("min", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32TempLow = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32TempLow = INVALID_INT;
+ }
+ }
+
+ //
+ // Reset the pointer to the start of the list values.
+ //
+ sBufPtr = sBufList;
+
+ //
+ // Get the high temperature.
+ //
+ if(GetField("temp", &sBufPtr) != 0)
+ {
+ if(GetField("max", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32TempHigh = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32TempHigh = INVALID_INT;
+ }
+ }
+ //
+ // Reset the pointer to the start of the list values.
+ //
+ sBufPtr = sBufList;
+
+ if(GetField("dt", &sBufPtr) != 0)
+ {
+ psWeatherReport->ui32Time = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->ui32Time = 0;
+ }
+ }
+
+ return(i32Items);
+}
+
+//*****************************************************************************
+//
+// Fill out the psWeatherReport structure from data returned from the JSON
+// query.
+//
+//*****************************************************************************
+int32_t
+JSONParseCurrent(uint32_t ui32Index, tWeatherReport *psWeatherReport,
+ struct pbuf *psBuf)
+{
+ tBufPtr sBufPtr, sBufMain, sBufTemp;
+ char pcIcon[3];
+ char pcCode[4];
+ int32_t i32Items, i32Code;
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Check and see if the request was valid.
+ //
+ if(GetField("cod", &sBufPtr) != 0)
+ {
+ sBufTemp = sBufPtr;
+
+ //
+ // Check for a 404 not found error.
+ //
+ i32Code = GetFieldValueInt(&sBufTemp);
+
+ sBufTemp = sBufPtr;
+
+ if(i32Code != INVALID_INT)
+ {
+ if(i32Code == 404)
+ {
+ return(-1);
+ }
+ }
+ else if(GetFieldValueString(&sBufTemp, pcCode, sizeof(pcCode)) >= 0)
+ {
+ //
+ // Check for a 404 not found error.
+ //
+ if(ustrncmp(pcCode, "404", 3) == 0)
+ {
+ return(-1);
+ }
+ }
+ }
+
+ //
+ // Initialize the number of items that have been found.
+ //
+ i32Items = 0;
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Find the basic weather description(weather.description).
+ //
+ if(GetField("weather", &sBufPtr) != 0)
+ {
+ if(GetField("icon", &sBufPtr) != 0)
+ {
+ if(GetFieldValueString(&sBufPtr, pcIcon, sizeof(pcIcon)) > 0)
+ {
+ //
+ // Save the image pointer.
+ //
+ GetImage(pcIcon, &psWeatherReport->pui8Image,
+ &psWeatherReport->pcDescription);
+
+ i32Items++;
+ }
+ else
+ {
+ //
+ // No image was found.
+ //
+ psWeatherReport->pui8Image = 0;
+ }
+ }
+ }
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Find the humidity value(main.humidity).
+ //
+ if(GetField("sys", &sBufPtr) != 0)
+ {
+ //
+ // Save the pointer to the data.
+ //
+ sBufMain = sBufPtr;
+
+ //
+ // Get the sunrise time.
+ //
+ if(GetField("sunrise", &sBufPtr) != 0)
+ {
+ psWeatherReport->ui32SunRise = GetFieldValueInt(&sBufPtr);
+
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->ui32SunRise = 0;
+ }
+
+ //
+ // Restore the pointer to the data.
+ //
+ sBufPtr = sBufMain;
+
+ //
+ // Get the sunset time.
+ //
+ if(GetField("sunset", &sBufPtr) != 0)
+ {
+ psWeatherReport->ui32SunSet = GetFieldValueInt(&sBufPtr);
+
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->ui32SunSet = 0;
+ }
+ }
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Get the last update time.
+ //
+ if(GetField("dt", &sBufPtr) != 0)
+ {
+ psWeatherReport->ui32Time = GetFieldValueInt(&sBufPtr);
+
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->ui32Time = 0;
+ }
+
+ //
+ // Reset the pointers.
+ //
+ BufPtrInit(&sBufPtr, psBuf);
+
+ //
+ // Find the humidity value(main.humidity).
+ //
+ if(GetField("main", &sBufPtr) != 0)
+ {
+ //
+ // Save the pointer to the main data.
+ //
+ sBufMain = sBufPtr;
+
+ if(GetField("humidity", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32Humidity = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32Humidity = INVALID_INT;
+ }
+
+ //
+ // Reset the buffer pointer to main.
+ //
+ sBufPtr = sBufMain;
+
+ //
+ // Find the current temperature value.
+ //
+ if(GetField("temp", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32Temp = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32Temp = INVALID_INT;
+ }
+
+ //
+ // Reset the buffer pointer to main.
+ //
+ sBufPtr = sBufMain;
+
+ //
+ // Find the current atmospheric pressure.
+ //
+ if(GetField("pressure", &sBufPtr) != 0)
+ {
+ psWeatherReport->i32Pressure = GetFieldValueInt(&sBufPtr);
+ i32Items++;
+ }
+ else
+ {
+ psWeatherReport->i32Pressure = INVALID_INT;
+ }
+ }
+ return(i32Items);
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/json.h b/boards/ek-tm4c1294xl/enet_weather/json.h
new file mode 100644
index 0000000..823fe3b
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/json.h
@@ -0,0 +1,41 @@
+//*****************************************************************************
+//
+// json.h - The parsing function headers for JSON data from the web server.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#ifndef __JSON_H__
+#define __JSON_H__
+
+#ifndef JSON_H_
+#define JSON_H_
+
+#define INVALID_INT ((int32_t)(0x80000000))
+
+extern int32_t JSONParseCurrent(uint32_t ui32Index,
+ tWeatherReport *psWeatherReport,
+ struct pbuf *psBuf);
+extern int32_t JSONParseForecast(uint32_t ui32Index,
+ tWeatherReport *psWeatherReport,
+ struct pbuf *psBuf);
+#endif
+
+#endif
diff --git a/boards/ek-tm4c1294xl/enet_weather/lwipopts.h b/boards/ek-tm4c1294xl/enet_weather/lwipopts.h
new file mode 100644
index 0000000..4cc58b4
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/lwipopts.h
@@ -0,0 +1,443 @@
+//*****************************************************************************
+//
+// lwipopts.h - Configuration file for lwIP.
+//
+// Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+//
+// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h
+// header file.
+//
+// For additional details, refer to the original "opt.h" file, and lwIP
+// documentation.
+//
+//*****************************************************************************
+#ifndef __LWIPOPTS_H__
+#define __LWIPOPTS_H__
+
+#include <stdint.h>
+
+//*****************************************************************************
+//
+// ---------- Tiva C Series / lwIP Port Options ----------
+//
+//*****************************************************************************
+#define HOST_TMR_INTERVAL 100 // default is 0
+//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000)
+//#define LWIP_HTTPD_SSI 1
+//#define LWIP_HTTPD_CGI 1
+#define LWIP_HTTPD_DYNAMIC_HEADERS 1
+//#define EMAC_PHY_CONFIG EMAC_PHY_TYPE_EXTERNAL_RMII
+//#define PHY_PHYS_ADDR 1
+#define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \
+ EMAC_PHY_AN_100B_T_FULL_DUPLEX)
+#define PHY_PHYS_ADDR 0
+#define NUM_TX_DESCRIPTORS 8
+#define NUM_RX_DESCRIPTORS 8
+
+//*****************************************************************************
+//
+// ---------- Platform specific locking ----------
+//
+//*****************************************************************************
+#define SYS_LIGHTWEIGHT_PROT 1 // default is 0
+#define NO_SYS 1 // default is 0
+//#define MEMCPY(dst,src,len) memcpy(dst,src,len)
+//#define SMEMCPY(dst,src,len) memcpy(dst,src,len)
+
+//*****************************************************************************
+//
+// ---------- Memory options ----------
+//
+//*****************************************************************************
+//#define MEM_LIBC_MALLOC 0
+#define MEM_ALIGNMENT 4
+#define MEM_SIZE (32 * 1024)
+//#define MEMP_OVERFLOW_CHECK 0
+//#define MEMP_SANITY_CHECK 0
+//#define MEM_USE_POOLS 0
+//#define MEMP_USE_CUSTOM_POOLS 0
+
+//*****************************************************************************
+//
+// ---------- Internal Memory Pool Sizes ----------
+//
+//*****************************************************************************
+#define MEMP_NUM_PBUF 16 // Default 16, was 16
+//#define MEMP_NUM_RAW_PCB 4
+//#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 16
+//#define MEMP_NUM_TCP_PCB_LISTEN 8
+//#define MEMP_NUM_TCP_SEG 16
+//#define MEMP_NUM_REASSDATA 5
+//#define MEMP_NUM_ARP_QUEUE 30
+//#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT 6 //5
+//#define MEMP_NUM_NETBUF 2
+//#define MEMP_NUM_NETCONN 4
+//#define MEMP_NUM_TCPIP_MSG_API 8
+//#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define PBUF_POOL_SIZE 16 // Default 16
+
+//*****************************************************************************
+//
+// ---------- ARP options ----------
+//
+//*****************************************************************************
+//#define LWIP_ARP 1
+//#define ARP_TABLE_SIZE 10
+//#define ARP_QUEUEING 1
+//#define ETHARP_TRUST_IP_MAC 1
+
+//*****************************************************************************
+//
+// ---------- IP options ----------
+//
+//*****************************************************************************
+//#define IP_FORWARD 0
+//#define IP_OPTIONS_ALLOWED 1
+#define IP_REASSEMBLY 0 // default is 1
+#define IP_FRAG 0 // default is 1
+//#define IP_REASS_MAXAGE 3
+//#define IP_REASS_MAX_PBUFS 10
+//#define IP_FRAG_USES_STATIC_BUF 1
+//#define IP_FRAG_MAX_MTU 1500
+//#define IP_DEFAULT_TTL 255
+
+//*****************************************************************************
+//
+// ---------- ICMP options ----------
+//
+//*****************************************************************************
+//#define LWIP_ICMP 1
+//#define ICMP_TTL (IP_DEFAULT_TTL)
+
+//*****************************************************************************
+//
+// ---------- RAW options ----------
+//
+//*****************************************************************************
+//#define LWIP_RAW 1
+//#define RAW_TTL (IP_DEFAULT_TTL)
+
+//*****************************************************************************
+//
+// ---------- DHCP options ----------
+//
+//*****************************************************************************
+#define LWIP_DHCP 1 // default is 0
+//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP))
+
+//*****************************************************************************
+//
+// ---------- UPNP options ----------
+//
+//*****************************************************************************
+//#define LWIP_UPNP 0
+
+//*****************************************************************************
+//
+// ---------- PTPD options ----------
+//
+//*****************************************************************************
+//#define LWIP_PTPD 0
+
+//*****************************************************************************
+//
+// ---------- AUTOIP options ----------
+//
+//*****************************************************************************
+#define LWIP_AUTOIP 1 // default is 0
+#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP))
+ // default is 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9
+
+//*****************************************************************************
+//
+// ---------- SNMP options ----------
+//
+//*****************************************************************************
+//#define LWIP_SNMP 0
+//#define SNMP_CONCURRENT_REQUESTS 1
+//#define SNMP_TRAP_DESTINATIONS 1
+//#define SNMP_PRIVATE_MIB 0
+//#define SNMP_SAFE_REQUESTS 1
+
+//*****************************************************************************
+//
+// ---------- IGMP options ----------
+//
+//*****************************************************************************
+//#define LWIP_IGMP 0
+
+//*****************************************************************************
+//
+// ---------- DNS options -----------
+//
+//*****************************************************************************
+#define LWIP_DNS 1
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_DOES_NAME_CHECK 1
+#define DNS_USES_STATIC_BUF 1
+#define DNS_MSG_SIZE 512
+
+//*****************************************************************************
+//
+// ---------- UDP options ----------
+//
+//*****************************************************************************
+//#define LWIP_UDP 1
+//#define LWIP_UDPLITE 0
+//#define UDP_TTL (IP_DEFAULT_TTL)
+
+//*****************************************************************************
+//
+// ---------- TCP options ----------
+//
+//*****************************************************************************
+#define LWIP_TCP 1
+//#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND 4096 // default is 2048
+//#define TCP_MAXRTX 12
+//#define TCP_SYNMAXRTX 6
+//#define TCP_QUEUE_OOSEQ 1
+#define TCP_MSS 1500 // default is 128
+//#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (4 * TCP_MSS)
+ // default is 256, was 6 *
+//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS))
+//#define TCP_SNDLOWAT (TCP_SND_BUF/2)
+//#define TCP_LISTEN_BACKLOG 0
+//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+
+//*****************************************************************************
+//
+// ---------- API options ----------
+//
+//*****************************************************************************
+//#define LWIP_EVENT_API 0
+//#define LWIP_CALLBACK_API 1
+
+//*****************************************************************************
+//
+// ---------- Pbuf options ----------
+//
+//*****************************************************************************
+#define PBUF_LINK_HLEN 16 // default is 14
+#define PBUF_POOL_BUFSIZE 512
+ // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)
+#define ETH_PAD_SIZE 0 // default is 0
+
+//*****************************************************************************
+//
+// ---------- Network Interfaces options ----------
+//
+//*****************************************************************************
+//#define LWIP_NETIF_HOSTNAME 0
+//#define LWIP_NETIF_API 0
+//#define LWIP_NETIF_STATUS_CALLBACK 0
+//#define LWIP_NETIF_LINK_CALLBACK 0
+//#define LWIP_NETIF_HWADDRHINT 0
+
+//*****************************************************************************
+//
+// ---------- LOOPIF options ----------
+//
+//*****************************************************************************
+//#define LWIP_HAVE_LOOPIF 0
+//#define LWIP_LOOPIF_MULTITHREADING 1
+
+//*****************************************************************************
+//
+// ---------- Thread options ----------
+//
+//*****************************************************************************
+//#define TCPIP_THREAD_NAME "tcpip_thread"
+//#define TCPIP_THREAD_STACKSIZE 0
+//#define TCPIP_THREAD_PRIO 1
+//#define TCPIP_MBOX_SIZE 0
+//#define SLIPIF_THREAD_NAME "slipif_loop"
+//#define SLIPIF_THREAD_STACKSIZE 0
+//#define SLIPIF_THREAD_PRIO 1
+//#define PPP_THREAD_NAME "pppMain"
+//#define PPP_THREAD_STACKSIZE 0
+//#define PPP_THREAD_PRIO 1
+//#define DEFAULT_THREAD_NAME "lwIP"
+//#define DEFAULT_THREAD_STACKSIZE 0
+//#define DEFAULT_THREAD_PRIO 1
+//#define DEFAULT_RAW_RECVMBOX_SIZE 0
+//#define DEFAULT_UDP_RECVMBOX_SIZE 0
+//#define DEFAULT_TCP_RECVMBOX_SIZE 0
+//#define DEFAULT_ACCEPTMBOX_SIZE 0
+
+//*****************************************************************************
+//
+// ---------- Sequential layer options ----------
+//
+//*****************************************************************************
+//#define LWIP_TCPIP_CORE_LOCKING 0
+#define LWIP_NETCONN 0 // default is 1
+
+//*****************************************************************************
+//
+// ---------- Socket Options ----------
+//
+//*****************************************************************************
+#define LWIP_SOCKET 0 // default is 1
+//#define LWIP_COMPAT_SOCKETS 1
+//#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+//#define LWIP_TCP_KEEPALIVE 0
+//#define LWIP_SO_RCVTIMEO 0
+//#define LWIP_SO_RCVBUF 0
+//#define SO_REUSE 0
+
+//*****************************************************************************
+//
+// ---------- Statistics options ----------
+//
+//*****************************************************************************
+//#define LWIP_STATS 1
+//#define LWIP_STATS_DISPLAY 0
+//#define LINK_STATS 1
+//#define ETHARP_STATS (LWIP_ARP)
+//#define IP_STATS 1
+//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+//#define ICMP_STATS 1
+//#define IGMP_STATS (LWIP_IGMP)
+//#define UDP_STATS (LWIP_UDP)
+//#define TCP_STATS (LWIP_TCP)
+//#define MEM_STATS 1
+//#define MEMP_STATS 1
+//#define SYS_STATS 1
+
+//*****************************************************************************
+//
+// ---------- PPP options ----------
+//
+//*****************************************************************************
+//#define PPP_SUPPORT 0
+//#define PPPOE_SUPPORT 0
+//#define PPPOS_SUPPORT PPP_SUPPORT
+
+#if PPP_SUPPORT
+//#define NUM_PPP 1
+//#define PAP_SUPPORT 0
+//#define CHAP_SUPPORT 0
+//#define MSCHAP_SUPPORT 0
+//#define CBCP_SUPPORT 0
+//#define CCP_SUPPORT 0
+//#define VJ_SUPPORT 0
+//#define MD5_SUPPORT 0
+//#define FSM_DEFTIMEOUT 6
+//#define FSM_DEFMAXTERMREQS 2
+//#define FSM_DEFMAXCONFREQS 10
+//#define FSM_DEFMAXNAKLOOPS 5
+//#define UPAP_DEFTIMEOUT 6
+//#define UPAP_DEFREQTIME 30
+//#define CHAP_DEFTIMEOUT 6
+//#define CHAP_DEFTRANSMITS 10
+//#define LCP_ECHOINTERVAL 0
+//#define LCP_MAXECHOFAILS 3
+//#define PPP_MAXIDLEFLAG 100
+
+//#define PPP_MAXMTU 1500
+//#define PPP_DEFMRU 296
+#endif
+
+//*****************************************************************************
+//
+// ---------- checksum options ----------
+//
+//*****************************************************************************
+//#define CHECKSUM_GEN_IP 1
+//#define CHECKSUM_GEN_UDP 1
+//#define CHECKSUM_GEN_TCP 1
+//#define CHECKSUM_CHECK_IP 1
+//#define CHECKSUM_CHECK_UDP 1
+//#define CHECKSUM_CHECK_TCP 1
+
+//*****************************************************************************
+//
+// ---------- Debugging options ----------
+//
+//*****************************************************************************
+#ifdef DEBUG
+#define U8_F "c"
+#define S8_F "c"
+#define X8_F "02x"
+#define U16_F "u"
+#define S16_F "d"
+#define X16_F "x"
+#define U32_F "u"
+#define S32_F "d"
+#define X32_F "x"
+extern void UARTprintf(const char *pcString, ...);
+#define LWIP_PLATFORM_DIAG(msg) UARTprintf msg
+#define LWIP_PLATFORM_ASSERT(msg) UARTprintf("ASSERT FAIL at line %d of %s: %s\n", __LINE__, __FILE__, msg)
+#define LWIP_DEBUG 1
+#endif
+
+//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
+//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING
+//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS
+//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE
+
+//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+//#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)
+
+//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+//#define PBUF_DEBUG LWIP_DBG_OFF
+//#define API_LIB_DEBUG LWIP_DBG_OFF
+//#define API_MSG_DEBUG LWIP_DBG_OFF
+//#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define HTTPD_DEBUG LWIP_DBG_OFF
+//#define ICMP_DEBUG LWIP_DBG_OFF
+//#define IGMP_DEBUG LWIP_DBG_OFF
+//#define INET_DEBUG LWIP_DBG_OFF
+//#define IP_DEBUG LWIP_DBG_ON
+//#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+//#define MEM_DEBUG LWIP_DBG_OFF
+//#define MEMP_DEBUG LWIP_DBG_OFF
+//#define SYS_DEBUG LWIP_DBG_OFF
+//#define TCP_DEBUG LWIP_DBG_ON
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+//#define TCP_FR_DEBUG LWIP_DBG_OFF
+//#define TCP_RTO_DEBUG LWIP_DBG_OFF
+//#define TCP_CWND_DEBUG LWIP_DBG_OFF
+//#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+//#define TCP_RST_DEBUG LWIP_DBG_OFF
+//#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+//#define UDP_DEBUG LWIP_DBG_ON // default is OFF
+//#define TCPIP_DEBUG LWIP_DBG_ON
+//#define PPP_DEBUG LWIP_DBG_OFF
+//#define SLIP_DEBUG LWIP_DBG_OFF
+//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF
+//#define AUTOIP_DEBUG LWIP_DBG_OFF
+//#define SNMP_MSG_DEBUG LWIP_DBG_OFF
+//#define SNMP_MIB_DEBUG LWIP_DBG_OFF
+//#define DNS_DEBUG LWIP_DBG_OFF
+
+#endif /* __LWIPOPTS_H__ */
diff --git a/boards/ek-tm4c1294xl/enet_weather/readme.txt b/boards/ek-tm4c1294xl/enet_weather/readme.txt
new file mode 100644
index 0000000..1ca4a65
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/readme.txt
@@ -0,0 +1,48 @@
+Ethernet Weather Application
+
+This example application demonstrates the operation of the Tiva C series
+evaluation kit as a weather reporting application.
+
+The application supports updating weather information from Open Weather Map
+weather provider(http://openweathermap.org/). The application uses the
+lwIP stack to obtain an address through DNS, resolve the address of the
+Open Weather Map site and then build and handle all of the requests
+necessary to access the weather information. The application can also use
+a web proxy, allows for a custom city to be added to the list of cities and
+toggles temperature units from Celsius to Fahrenheit. The application
+scrolls through the city list at a fixed interval when there is a valid
+IP address and displays this information over the UART.
+
+The application will print the city name, status, humidity, current temp
+and the high/low. In addition the application will display what city it
+is currently updating. Once the app has scrolled through the cities a
+a defined amount of times, it will attempt to update the information.
+
+UART0, connected to the Virtual Serial Port and running at 115,200, 8-N-1,
+is used to display messages from this application.
+
+/ For additional details about Open Weather Map refer to their web page at:
+http://openweathermap.org/
+
+For additional details on lwIP, refer to the lwIP web page at:
+http://savannah.nongnu.org/projects/lwip/
+
+-------------------------------------------------------------------------------
+
+Copyright (c) 2014 Texas Instruments Incorporated. All rights reserved.
+Software License Agreement
+
+Texas Instruments (TI) is supplying this software for use solely and
+exclusively on TI's microcontroller products. The software is owned by
+TI and/or its suppliers, and is protected under applicable copyright
+laws. You may not combine this software with "viral" open-source
+software in order to form a larger program.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, FOR ANY REASON WHATSOEVER.
+
+This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
diff --git a/boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.axf b/boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.axf
new file mode 100644
index 0000000..3e7c24a
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.axf
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.bin b/boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.bin
new file mode 100644
index 0000000..9bc8b59
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/rvmdk/enet_weather.bin
Binary files differ
diff --git a/boards/ek-tm4c1294xl/enet_weather/startup_ccs.c b/boards/ek-tm4c1294xl/enet_weather/startup_ccs.c
new file mode 100644
index 0000000..43a7b7c
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/startup_ccs.c
@@ -0,0 +1,277 @@
+//*****************************************************************************
+//
+// startup_ccs.c - Startup code for use with TI's Code Composer Studio.
+//
+// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include "inc/hw_nvic.h"
+#include "inc/hw_types.h"
+
+//*****************************************************************************
+//
+// Forward declaration of the default fault handlers.
+//
+//*****************************************************************************
+void ResetISR(void);
+static void NmiSR(void);
+static void FaultISR(void);
+static void IntDefaultHandler(void);
+
+//*****************************************************************************
+//
+// External declaration for the reset handler that is to be called when the
+// processor is started
+//
+//*****************************************************************************
+extern void _c_int00(void);
+
+//*****************************************************************************
+//
+// Linker variable that marks the top of the stack.
+//
+//*****************************************************************************
+extern uint32_t __STACK_TOP;
+
+//*****************************************************************************
+//
+// External declarations for the interrupt handlers used by the application.
+//
+//*****************************************************************************
+extern void lwIPEthernetIntHandler(void);
+extern void SysTickIntHandler(void);
+extern void UARTStdioIntHandler(void);
+
+//*****************************************************************************
+//
+// The vector table. Note that the proper constructs must be placed on this to
+// ensure that it ends up at physical address 0x0000.0000 or at the start of
+// the program if located at a start address other than 0.
+//
+//*****************************************************************************
+#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
+void (* const g_pfnVectors[])(void) =
+{
+ (void (*)(void))((uint32_t)&__STACK_TOP),
+ // The initial stack pointer
+ ResetISR, // The reset handler
+ NmiSR, // The NMI handler
+ FaultISR, // The hard fault handler
+ IntDefaultHandler, // The MPU fault handler
+ IntDefaultHandler, // The bus fault handler
+ IntDefaultHandler, // The usage fault handler
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ IntDefaultHandler, // SVCall handler
+ IntDefaultHandler, // Debug monitor handler
+ 0, // Reserved
+ IntDefaultHandler, // The PendSV handler
+ SysTickIntHandler, // The SysTick handler
+ IntDefaultHandler, // GPIO Port A
+ IntDefaultHandler, // GPIO Port B
+ IntDefaultHandler, // GPIO Port C
+ IntDefaultHandler, // GPIO Port D
+ IntDefaultHandler, // GPIO Port E
+ UARTStdioIntHandler, // UART0 Rx and Tx
+ IntDefaultHandler, // UART1 Rx and Tx
+ IntDefaultHandler, // SSI0 Rx and Tx
+ IntDefaultHandler, // I2C0 Master and Slave
+ IntDefaultHandler, // PWM Fault
+ IntDefaultHandler, // PWM Generator 0
+ IntDefaultHandler, // PWM Generator 1
+ IntDefaultHandler, // PWM Generator 2
+ IntDefaultHandler, // Quadrature Encoder 0
+ IntDefaultHandler, // ADC Sequence 0
+ IntDefaultHandler, // ADC Sequence 1
+ IntDefaultHandler, // ADC Sequence 2
+ IntDefaultHandler, // ADC Sequence 3
+ IntDefaultHandler, // Watchdog timer
+ IntDefaultHandler, // Timer 0 subtimer A
+ IntDefaultHandler, // Timer 0 subtimer B
+ IntDefaultHandler, // Timer 1 subtimer A
+ IntDefaultHandler, // Timer 1 subtimer B
+ IntDefaultHandler, // Timer 2 subtimer A
+ IntDefaultHandler, // Timer 2 subtimer B
+ IntDefaultHandler, // Analog Comparator 0
+ IntDefaultHandler, // Analog Comparator 1
+ IntDefaultHandler, // Analog Comparator 2
+ IntDefaultHandler, // System Control (PLL, OSC, BO)
+ IntDefaultHandler, // FLASH Control
+ IntDefaultHandler, // GPIO Port F
+ IntDefaultHandler, // GPIO Port G
+ IntDefaultHandler, // GPIO Port H
+ IntDefaultHandler, // UART2 Rx and Tx
+ IntDefaultHandler, // SSI1 Rx and Tx
+ IntDefaultHandler, // Timer 3 subtimer A
+ IntDefaultHandler, // Timer 3 subtimer B
+ IntDefaultHandler, // I2C1 Master and Slave
+ IntDefaultHandler, // CAN0
+ IntDefaultHandler, // CAN1
+ lwIPEthernetIntHandler, // Ethernet
+ IntDefaultHandler, // Hibernate
+ IntDefaultHandler, // USB0
+ IntDefaultHandler, // PWM Generator 3
+ IntDefaultHandler, // uDMA Software Transfer
+ IntDefaultHandler, // uDMA Error
+ IntDefaultHandler, // ADC1 Sequence 0
+ IntDefaultHandler, // ADC1 Sequence 1
+ IntDefaultHandler, // ADC1 Sequence 2
+ IntDefaultHandler, // ADC1 Sequence 3
+ IntDefaultHandler, // External Bus Interface 0
+ IntDefaultHandler, // GPIO Port J
+ IntDefaultHandler, // GPIO Port K
+ IntDefaultHandler, // GPIO Port L
+ IntDefaultHandler, // SSI2 Rx and Tx
+ IntDefaultHandler, // SSI3 Rx and Tx
+ IntDefaultHandler, // UART3 Rx and Tx
+ IntDefaultHandler, // UART4 Rx and Tx
+ IntDefaultHandler, // UART5 Rx and Tx
+ IntDefaultHandler, // UART6 Rx and Tx
+ IntDefaultHandler, // UART7 Rx and Tx
+ IntDefaultHandler, // I2C2 Master and Slave
+ IntDefaultHandler, // I2C3 Master and Slave
+ IntDefaultHandler, // Timer 4 subtimer A
+ IntDefaultHandler, // Timer 4 subtimer B
+ IntDefaultHandler, // Timer 5 subtimer A
+ IntDefaultHandler, // Timer 5 subtimer B
+ IntDefaultHandler, // FPU
+ 0, // Reserved
+ 0, // Reserved
+ IntDefaultHandler, // I2C4 Master and Slave
+ IntDefaultHandler, // I2C5 Master and Slave
+ IntDefaultHandler, // GPIO Port M
+ IntDefaultHandler, // GPIO Port N
+ 0, // Reserved
+ IntDefaultHandler, // Tamper
+ IntDefaultHandler, // GPIO Port P (Summary or P0)
+ IntDefaultHandler, // GPIO Port P1
+ IntDefaultHandler, // GPIO Port P2
+ IntDefaultHandler, // GPIO Port P3
+ IntDefaultHandler, // GPIO Port P4
+ IntDefaultHandler, // GPIO Port P5
+ IntDefaultHandler, // GPIO Port P6
+ IntDefaultHandler, // GPIO Port P7
+ IntDefaultHandler, // GPIO Port Q (Summary or Q0)
+ IntDefaultHandler, // GPIO Port Q1
+ IntDefaultHandler, // GPIO Port Q2
+ IntDefaultHandler, // GPIO Port Q3
+ IntDefaultHandler, // GPIO Port Q4
+ IntDefaultHandler, // GPIO Port Q5
+ IntDefaultHandler, // GPIO Port Q6
+ IntDefaultHandler, // GPIO Port Q7
+ IntDefaultHandler, // GPIO Port R
+ IntDefaultHandler, // GPIO Port S
+ IntDefaultHandler, // SHA/MD5 0
+ IntDefaultHandler, // AES 0
+ IntDefaultHandler, // DES3DES 0
+ IntDefaultHandler, // LCD Controller 0
+ IntDefaultHandler, // Timer 6 subtimer A
+ IntDefaultHandler, // Timer 6 subtimer B
+ IntDefaultHandler, // Timer 7 subtimer A
+ IntDefaultHandler, // Timer 7 subtimer B
+ IntDefaultHandler, // I2C6 Master and Slave
+ IntDefaultHandler, // I2C7 Master and Slave
+ IntDefaultHandler, // HIM Scan Matrix Keyboard 0
+ IntDefaultHandler, // One Wire 0
+ IntDefaultHandler, // HIM PS/2 0
+ IntDefaultHandler, // HIM LED Sequencer 0
+ IntDefaultHandler, // HIM Consumer IR 0
+ IntDefaultHandler, // I2C8 Master and Slave
+ IntDefaultHandler, // I2C9 Master and Slave
+ IntDefaultHandler // GPIO Port T
+};
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor first starts execution
+// following a reset event. Only the absolutely necessary set is performed,
+// after which the application supplied entry() routine is called. Any fancy
+// actions (such as making decisions based on the reset cause register, and
+// resetting the bits in that register) are left solely in the hands of the
+// application.
+//
+//*****************************************************************************
+void
+ResetISR(void)
+{
+ //
+ // Jump to the CCS C initialization routine. This will enable the
+ // floating-point unit as well, so that does not need to be done here.
+ //
+ __asm(" .global _c_int00\n"
+ " b.w _c_int00");
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a NMI. This
+// simply enters an infinite loop, preserving the system state for examination
+// by a debugger.
+//
+//*****************************************************************************
+static void
+NmiSR(void)
+{
+ //
+ // Enter an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a fault
+// interrupt. This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+FaultISR(void)
+{
+ //
+ // Enter an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives an unexpected
+// interrupt. This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+IntDefaultHandler(void)
+{
+ //
+ // Go into an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/startup_ewarm.c b/boards/ek-tm4c1294xl/enet_weather/startup_ewarm.c
new file mode 100644
index 0000000..59facf6
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/startup_ewarm.c
@@ -0,0 +1,308 @@
+//*****************************************************************************
+//
+// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench,
+// version 5.
+//
+// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include "inc/hw_nvic.h"
+#include "inc/hw_types.h"
+
+//*****************************************************************************
+//
+// Enable the IAR extensions for this source file.
+//
+//*****************************************************************************
+#pragma language=extended
+
+//*****************************************************************************
+//
+// Forward declaration of the default fault handlers.
+//
+//*****************************************************************************
+void ResetISR(void);
+static void NmiSR(void);
+static void FaultISR(void);
+static void IntDefaultHandler(void);
+
+//*****************************************************************************
+//
+// External declarations for the interrupt handlers used by the application.
+//
+//*****************************************************************************
+extern void lwIPEthernetIntHandler(void);
+extern void SysTickIntHandler(void);
+extern void UARTStdioIntHandler(void);
+
+//*****************************************************************************
+//
+// The entry point for the application startup code.
+//
+//*****************************************************************************
+extern void __iar_program_start(void);
+
+//*****************************************************************************
+//
+// Reserve space for the system stack.
+//
+//*****************************************************************************
+static uint32_t pui32Stack[512] @ ".noinit";
+
+//*****************************************************************************
+//
+// A union that describes the entries of the vector table. The union is needed
+// since the first entry is the stack pointer and the remainder are function
+// pointers.
+//
+//*****************************************************************************
+typedef union
+{
+ void (*pfnHandler)(void);
+ uint32_t ui32Ptr;
+}
+uVectorEntry;
+
+//*****************************************************************************
+//
+// The vector table. Note that the proper constructs must be placed on this to
+// ensure that it ends up at physical address 0x0000.0000.
+//
+//*****************************************************************************
+__root const uVectorEntry __vector_table[] @ ".intvec" =
+{
+ { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) },
+ // The initial stack pointer
+ ResetISR, // The reset handler
+ NmiSR, // The NMI handler
+ FaultISR, // The hard fault handler
+ IntDefaultHandler, // The MPU fault handler
+ IntDefaultHandler, // The bus fault handler
+ IntDefaultHandler, // The usage fault handler
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ IntDefaultHandler, // SVCall handler
+ IntDefaultHandler, // Debug monitor handler
+ 0, // Reserved
+ IntDefaultHandler, // The PendSV handler
+ SysTickIntHandler, // The SysTick handler
+ IntDefaultHandler, // GPIO Port A
+ IntDefaultHandler, // GPIO Port B
+ IntDefaultHandler, // GPIO Port C
+ IntDefaultHandler, // GPIO Port D
+ IntDefaultHandler, // GPIO Port E
+ UARTStdioIntHandler, // UART0 Rx and Tx
+ IntDefaultHandler, // UART1 Rx and Tx
+ IntDefaultHandler, // SSI0 Rx and Tx
+ IntDefaultHandler, // I2C0 Master and Slave
+ IntDefaultHandler, // PWM Fault
+ IntDefaultHandler, // PWM Generator 0
+ IntDefaultHandler, // PWM Generator 1
+ IntDefaultHandler, // PWM Generator 2
+ IntDefaultHandler, // Quadrature Encoder 0
+ IntDefaultHandler, // ADC Sequence 0
+ IntDefaultHandler, // ADC Sequence 1
+ IntDefaultHandler, // ADC Sequence 2
+ IntDefaultHandler, // ADC Sequence 3
+ IntDefaultHandler, // Watchdog timer
+ IntDefaultHandler, // Timer 0 subtimer A
+ IntDefaultHandler, // Timer 0 subtimer B
+ IntDefaultHandler, // Timer 1 subtimer A
+ IntDefaultHandler, // Timer 1 subtimer B
+ IntDefaultHandler, // Timer 2 subtimer A
+ IntDefaultHandler, // Timer 2 subtimer B
+ IntDefaultHandler, // Analog Comparator 0
+ IntDefaultHandler, // Analog Comparator 1
+ IntDefaultHandler, // Analog Comparator 2
+ IntDefaultHandler, // System Control (PLL, OSC, BO)
+ IntDefaultHandler, // FLASH Control
+ IntDefaultHandler, // GPIO Port F
+ IntDefaultHandler, // GPIO Port G
+ IntDefaultHandler, // GPIO Port H
+ IntDefaultHandler, // UART2 Rx and Tx
+ IntDefaultHandler, // SSI1 Rx and Tx
+ IntDefaultHandler, // Timer 3 subtimer A
+ IntDefaultHandler, // Timer 3 subtimer B
+ IntDefaultHandler, // I2C1 Master and Slave
+ IntDefaultHandler, // CAN0
+ IntDefaultHandler, // CAN1
+ lwIPEthernetIntHandler, // Ethernet
+ IntDefaultHandler, // Hibernate
+ IntDefaultHandler, // USB0
+ IntDefaultHandler, // PWM Generator 3
+ IntDefaultHandler, // uDMA Software Transfer
+ IntDefaultHandler, // uDMA Error
+ IntDefaultHandler, // ADC1 Sequence 0
+ IntDefaultHandler, // ADC1 Sequence 1
+ IntDefaultHandler, // ADC1 Sequence 2
+ IntDefaultHandler, // ADC1 Sequence 3
+ IntDefaultHandler, // External Bus Interface 0
+ IntDefaultHandler, // GPIO Port J
+ IntDefaultHandler, // GPIO Port K
+ IntDefaultHandler, // GPIO Port L
+ IntDefaultHandler, // SSI2 Rx and Tx
+ IntDefaultHandler, // SSI3 Rx and Tx
+ IntDefaultHandler, // UART3 Rx and Tx
+ IntDefaultHandler, // UART4 Rx and Tx
+ IntDefaultHandler, // UART5 Rx and Tx
+ IntDefaultHandler, // UART6 Rx and Tx
+ IntDefaultHandler, // UART7 Rx and Tx
+ IntDefaultHandler, // I2C2 Master and Slave
+ IntDefaultHandler, // I2C3 Master and Slave
+ IntDefaultHandler, // Timer 4 subtimer A
+ IntDefaultHandler, // Timer 4 subtimer B
+ IntDefaultHandler, // Timer 5 subtimer A
+ IntDefaultHandler, // Timer 5 subtimer B
+ IntDefaultHandler, // FPU
+ 0, // Reserved
+ 0, // Reserved
+ IntDefaultHandler, // I2C4 Master and Slave
+ IntDefaultHandler, // I2C5 Master and Slave
+ IntDefaultHandler, // GPIO Port M
+ IntDefaultHandler, // GPIO Port N
+ 0, // Reserved
+ IntDefaultHandler, // Tamper
+ IntDefaultHandler, // GPIO Port P (Summary or P0)
+ IntDefaultHandler, // GPIO Port P1
+ IntDefaultHandler, // GPIO Port P2
+ IntDefaultHandler, // GPIO Port P3
+ IntDefaultHandler, // GPIO Port P4
+ IntDefaultHandler, // GPIO Port P5
+ IntDefaultHandler, // GPIO Port P6
+ IntDefaultHandler, // GPIO Port P7
+ IntDefaultHandler, // GPIO Port Q (Summary or Q0)
+ IntDefaultHandler, // GPIO Port Q1
+ IntDefaultHandler, // GPIO Port Q2
+ IntDefaultHandler, // GPIO Port Q3
+ IntDefaultHandler, // GPIO Port Q4
+ IntDefaultHandler, // GPIO Port Q5
+ IntDefaultHandler, // GPIO Port Q6
+ IntDefaultHandler, // GPIO Port Q7
+ IntDefaultHandler, // GPIO Port R
+ IntDefaultHandler, // GPIO Port S
+ IntDefaultHandler, // SHA/MD5 0
+ IntDefaultHandler, // AES 0
+ IntDefaultHandler, // DES3DES 0
+ IntDefaultHandler, // LCD Controller 0
+ IntDefaultHandler, // Timer 6 subtimer A
+ IntDefaultHandler, // Timer 6 subtimer B
+ IntDefaultHandler, // Timer 7 subtimer A
+ IntDefaultHandler, // Timer 7 subtimer B
+ IntDefaultHandler, // I2C6 Master and Slave
+ IntDefaultHandler, // I2C7 Master and Slave
+ IntDefaultHandler, // HIM Scan Matrix Keyboard 0
+ IntDefaultHandler, // One Wire 0
+ IntDefaultHandler, // HIM PS/2 0
+ IntDefaultHandler, // HIM LED Sequencer 0
+ IntDefaultHandler, // HIM Consumer IR 0
+ IntDefaultHandler, // I2C8 Master and Slave
+ IntDefaultHandler, // I2C9 Master and Slave
+ IntDefaultHandler // GPIO Port T
+};
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor first starts execution
+// following a reset event. Only the absolutely necessary set is performed,
+// after which the application supplied entry() routine is called. Any fancy
+// actions (such as making decisions based on the reset cause register, and
+// resetting the bits in that register) are left solely in the hands of the
+// application.
+//
+//*****************************************************************************
+void
+ResetISR(void)
+{
+ //
+ // Enable the floating-point unit. This must be done here to handle the
+ // case where main() uses floating-point and the function prologue saves
+ // floating-point registers (which will fault if floating-point is not
+ // enabled). Any configuration of the floating-point unit using DriverLib
+ // APIs must be done here prior to the floating-point unit being enabled.
+ //
+ // Note that this does not use DriverLib since it might not be included in
+ // this project.
+ //
+ HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) &
+ ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) |
+ NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL);
+
+ //
+ // Call the application's entry point.
+ //
+ __iar_program_start();
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a NMI. This
+// simply enters an infinite loop, preserving the system state for examination
+// by a debugger.
+//
+//*****************************************************************************
+static void
+NmiSR(void)
+{
+ //
+ // Enter an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a fault
+// interrupt. This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+FaultISR(void)
+{
+ //
+ // Enter an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives an unexpected
+// interrupt. This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+IntDefaultHandler(void)
+{
+ //
+ // Go into an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/startup_gcc.c b/boards/ek-tm4c1294xl/enet_weather/startup_gcc.c
new file mode 100644
index 0000000..e0d4c05
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/startup_gcc.c
@@ -0,0 +1,324 @@
+//*****************************************************************************
+//
+// startup_gcc.c - Startup code for use with GNU tools.
+//
+// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include "inc/hw_nvic.h"
+#include "inc/hw_types.h"
+
+//*****************************************************************************
+//
+// Forward declaration of the default fault handlers.
+//
+//*****************************************************************************
+void ResetISR(void);
+static void NmiSR(void);
+static void FaultISR(void);
+static void IntDefaultHandler(void);
+
+//*****************************************************************************
+//
+// External declarations for the interrupt handlers used by the application.
+//
+//*****************************************************************************
+extern void lwIPEthernetIntHandler(void);
+extern void SysTickIntHandler(void);
+extern void UARTStdioIntHandler(void);
+
+//*****************************************************************************
+//
+// The entry point for the application.
+//
+//*****************************************************************************
+extern int main(void);
+
+//*****************************************************************************
+//
+// Reserve space for the system stack.
+//
+//*****************************************************************************
+static uint32_t pui32Stack[512];
+
+//*****************************************************************************
+//
+// The vector table. Note that the proper constructs must be placed on this to
+// ensure that it ends up at physical address 0x0000.0000.
+//
+//*****************************************************************************
+__attribute__ ((section(".isr_vector")))
+void (* const g_pfnVectors[])(void) =
+{
+ (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)),
+ // The initial stack pointer
+ ResetISR, // The reset handler
+ NmiSR, // The NMI handler
+ FaultISR, // The hard fault handler
+ IntDefaultHandler, // The MPU fault handler
+ IntDefaultHandler, // The bus fault handler
+ IntDefaultHandler, // The usage fault handler
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ IntDefaultHandler, // SVCall handler
+ IntDefaultHandler, // Debug monitor handler
+ 0, // Reserved
+ IntDefaultHandler, // The PendSV handler
+ SysTickIntHandler, // The SysTick handler
+ IntDefaultHandler, // GPIO Port A
+ IntDefaultHandler, // GPIO Port B
+ IntDefaultHandler, // GPIO Port C
+ IntDefaultHandler, // GPIO Port D
+ IntDefaultHandler, // GPIO Port E
+ UARTStdioIntHandler, // UART0 Rx and Tx
+ IntDefaultHandler, // UART1 Rx and Tx
+ IntDefaultHandler, // SSI0 Rx and Tx
+ IntDefaultHandler, // I2C0 Master and Slave
+ IntDefaultHandler, // PWM Fault
+ IntDefaultHandler, // PWM Generator 0
+ IntDefaultHandler, // PWM Generator 1
+ IntDefaultHandler, // PWM Generator 2
+ IntDefaultHandler, // Quadrature Encoder 0
+ IntDefaultHandler, // ADC Sequence 0
+ IntDefaultHandler, // ADC Sequence 1
+ IntDefaultHandler, // ADC Sequence 2
+ IntDefaultHandler, // ADC Sequence 3
+ IntDefaultHandler, // Watchdog timer
+ IntDefaultHandler, // Timer 0 subtimer A
+ IntDefaultHandler, // Timer 0 subtimer B
+ IntDefaultHandler, // Timer 1 subtimer A
+ IntDefaultHandler, // Timer 1 subtimer B
+ IntDefaultHandler, // Timer 2 subtimer A
+ IntDefaultHandler, // Timer 2 subtimer B
+ IntDefaultHandler, // Analog Comparator 0
+ IntDefaultHandler, // Analog Comparator 1
+ IntDefaultHandler, // Analog Comparator 2
+ IntDefaultHandler, // System Control (PLL, OSC, BO)
+ IntDefaultHandler, // FLASH Control
+ IntDefaultHandler, // GPIO Port F
+ IntDefaultHandler, // GPIO Port G
+ IntDefaultHandler, // GPIO Port H
+ IntDefaultHandler, // UART2 Rx and Tx
+ IntDefaultHandler, // SSI1 Rx and Tx
+ IntDefaultHandler, // Timer 3 subtimer A
+ IntDefaultHandler, // Timer 3 subtimer B
+ IntDefaultHandler, // I2C1 Master and Slave
+ IntDefaultHandler, // CAN0
+ IntDefaultHandler, // CAN1
+ lwIPEthernetIntHandler, // Ethernet
+ IntDefaultHandler, // Hibernate
+ IntDefaultHandler, // USB0
+ IntDefaultHandler, // PWM Generator 3
+ IntDefaultHandler, // uDMA Software Transfer
+ IntDefaultHandler, // uDMA Error
+ IntDefaultHandler, // ADC1 Sequence 0
+ IntDefaultHandler, // ADC1 Sequence 1
+ IntDefaultHandler, // ADC1 Sequence 2
+ IntDefaultHandler, // ADC1 Sequence 3
+ IntDefaultHandler, // External Bus Interface 0
+ IntDefaultHandler, // GPIO Port J
+ IntDefaultHandler, // GPIO Port K
+ IntDefaultHandler, // GPIO Port L
+ IntDefaultHandler, // SSI2 Rx and Tx
+ IntDefaultHandler, // SSI3 Rx and Tx
+ IntDefaultHandler, // UART3 Rx and Tx
+ IntDefaultHandler, // UART4 Rx and Tx
+ IntDefaultHandler, // UART5 Rx and Tx
+ IntDefaultHandler, // UART6 Rx and Tx
+ IntDefaultHandler, // UART7 Rx and Tx
+ IntDefaultHandler, // I2C2 Master and Slave
+ IntDefaultHandler, // I2C3 Master and Slave
+ IntDefaultHandler, // Timer 4 subtimer A
+ IntDefaultHandler, // Timer 4 subtimer B
+ IntDefaultHandler, // Timer 5 subtimer A
+ IntDefaultHandler, // Timer 5 subtimer B
+ IntDefaultHandler, // FPU
+ 0, // Reserved
+ 0, // Reserved
+ IntDefaultHandler, // I2C4 Master and Slave
+ IntDefaultHandler, // I2C5 Master and Slave
+ IntDefaultHandler, // GPIO Port M
+ IntDefaultHandler, // GPIO Port N
+ 0, // Reserved
+ IntDefaultHandler, // Tamper
+ IntDefaultHandler, // GPIO Port P (Summary or P0)
+ IntDefaultHandler, // GPIO Port P1
+ IntDefaultHandler, // GPIO Port P2
+ IntDefaultHandler, // GPIO Port P3
+ IntDefaultHandler, // GPIO Port P4
+ IntDefaultHandler, // GPIO Port P5
+ IntDefaultHandler, // GPIO Port P6
+ IntDefaultHandler, // GPIO Port P7
+ IntDefaultHandler, // GPIO Port Q (Summary or Q0)
+ IntDefaultHandler, // GPIO Port Q1
+ IntDefaultHandler, // GPIO Port Q2
+ IntDefaultHandler, // GPIO Port Q3
+ IntDefaultHandler, // GPIO Port Q4
+ IntDefaultHandler, // GPIO Port Q5
+ IntDefaultHandler, // GPIO Port Q6
+ IntDefaultHandler, // GPIO Port Q7
+ IntDefaultHandler, // GPIO Port R
+ IntDefaultHandler, // GPIO Port S
+ IntDefaultHandler, // SHA/MD5 0
+ IntDefaultHandler, // AES 0
+ IntDefaultHandler, // DES3DES 0
+ IntDefaultHandler, // LCD Controller 0
+ IntDefaultHandler, // Timer 6 subtimer A
+ IntDefaultHandler, // Timer 6 subtimer B
+ IntDefaultHandler, // Timer 7 subtimer A
+ IntDefaultHandler, // Timer 7 subtimer B
+ IntDefaultHandler, // I2C6 Master and Slave
+ IntDefaultHandler, // I2C7 Master and Slave
+ IntDefaultHandler, // HIM Scan Matrix Keyboard 0
+ IntDefaultHandler, // One Wire 0
+ IntDefaultHandler, // HIM PS/2 0
+ IntDefaultHandler, // HIM LED Sequencer 0
+ IntDefaultHandler, // HIM Consumer IR 0
+ IntDefaultHandler, // I2C8 Master and Slave
+ IntDefaultHandler, // I2C9 Master and Slave
+ IntDefaultHandler // GPIO Port T
+};
+
+//*****************************************************************************
+//
+// The following are constructs created by the linker, indicating where the
+// the "data" and "bss" segments reside in memory. The initializers for the
+// for the "data" segment resides immediately following the "text" segment.
+//
+//*****************************************************************************
+extern uint32_t _etext;
+extern uint32_t _data;
+extern uint32_t _edata;
+extern uint32_t _bss;
+extern uint32_t _ebss;
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor first starts execution
+// following a reset event. Only the absolutely necessary set is performed,
+// after which the application supplied entry() routine is called. Any fancy
+// actions (such as making decisions based on the reset cause register, and
+// resetting the bits in that register) are left solely in the hands of the
+// application.
+//
+//*****************************************************************************
+void
+ResetISR(void)
+{
+ uint32_t *pui32Src, *pui32Dest;
+
+ //
+ // Copy the data segment initializers from flash to SRAM.
+ //
+ pui32Src = &_etext;
+ for(pui32Dest = &_data; pui32Dest < &_edata; )
+ {
+ *pui32Dest++ = *pui32Src++;
+ }
+
+ //
+ // Zero fill the bss segment.
+ //
+ __asm(" ldr r0, =_bss\n"
+ " ldr r1, =_ebss\n"
+ " mov r2, #0\n"
+ " .thumb_func\n"
+ "zero_loop:\n"
+ " cmp r0, r1\n"
+ " it lt\n"
+ " strlt r2, [r0], #4\n"
+ " blt zero_loop");
+
+ //
+ // Enable the floating-point unit. This must be done here to handle the
+ // case where main() uses floating-point and the function prologue saves
+ // floating-point registers (which will fault if floating-point is not
+ // enabled). Any configuration of the floating-point unit using DriverLib
+ // APIs must be done here prior to the floating-point unit being enabled.
+ //
+ // Note that this does not use DriverLib since it might not be included in
+ // this project.
+ //
+ HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) &
+ ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) |
+ NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL);
+
+ //
+ // Call the application's entry point.
+ //
+ main();
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a NMI. This
+// simply enters an infinite loop, preserving the system state for examination
+// by a debugger.
+//
+//*****************************************************************************
+static void
+NmiSR(void)
+{
+ //
+ // Enter an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a fault
+// interrupt. This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+FaultISR(void)
+{
+ //
+ // Enter an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives an unexpected
+// interrupt. This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+IntDefaultHandler(void)
+{
+ //
+ // Go into an infinite loop.
+ //
+ while(1)
+ {
+ }
+}
diff --git a/boards/ek-tm4c1294xl/enet_weather/startup_rvmdk.S b/boards/ek-tm4c1294xl/enet_weather/startup_rvmdk.S
new file mode 100644
index 0000000..e7ed604
--- /dev/null
+++ b/boards/ek-tm4c1294xl/enet_weather/startup_rvmdk.S
@@ -0,0 +1,333 @@
+; <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;
+; startup_rvmdk.S - Startup code for use with Keil's uVision.
+;
+; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+; Software License Agreement
+;
+; Texas Instruments (TI) is supplying this software for use solely and
+; exclusively on TI's microcontroller products. The software is owned by
+; TI and/or its suppliers, and is protected under applicable copyright
+; laws. You may not combine this software with "viral" open-source
+; software in order to form a larger program.
+;
+; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+; DAMAGES, FOR ANY REASON WHATSOEVER.
+;
+; This is part of revision 2.1.0.12573 of the EK-TM4C1294XL Firmware Package.
+;
+;******************************************************************************
+
+;******************************************************************************
+;
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+;******************************************************************************
+Stack EQU 0x00000800
+
+;******************************************************************************
+;
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+;******************************************************************************
+Heap EQU 0x00000000
+
+;******************************************************************************
+;
+; Allocate space for the stack.
+;
+;******************************************************************************
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+StackMem
+ SPACE Stack
+__initial_sp
+
+;******************************************************************************
+;
+; Allocate space for the heap.
+;
+;******************************************************************************
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+HeapMem
+ SPACE Heap
+__heap_limit
+
+;******************************************************************************
+;
+; Indicate that the code in this file preserves 8-byte alignment of the stack.
+;
+;******************************************************************************
+ PRESERVE8
+
+;******************************************************************************
+;
+; Place code into the reset code section.
+;
+;******************************************************************************
+ AREA RESET, CODE, READONLY
+ THUMB
+
+;******************************************************************************
+;
+; External declarations for the interrupt handlers used by the application.
+;
+;******************************************************************************
+ EXTERN lwIPEthernetIntHandler
+ EXTERN SysTickIntHandler
+ EXTERN UARTStdioIntHandler
+
+;******************************************************************************
+;
+; The vector table.
+;
+;******************************************************************************
+ EXPORT __Vectors
+__Vectors
+ DCD StackMem + Stack ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NmiSR ; NMI Handler
+ DCD FaultISR ; Hard Fault Handler
+ DCD IntDefaultHandler ; The MPU fault handler
+ DCD IntDefaultHandler ; The bus fault handler
+ DCD IntDefaultHandler ; The usage fault handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD IntDefaultHandler ; SVCall handler
+ DCD IntDefaultHandler ; Debug monitor handler
+ DCD 0 ; Reserved
+ DCD IntDefaultHandler ; The PendSV handler
+ DCD SysTickIntHandler ; The SysTick handler
+ DCD IntDefaultHandler ; GPIO Port A
+ DCD IntDefaultHandler ; GPIO Port B
+ DCD IntDefaultHandler ; GPIO Port C
+ DCD IntDefaultHandler ; GPIO Port D
+ DCD IntDefaultHandler ; GPIO Port E
+ DCD UARTStdioIntHandler ; UART0 Rx and Tx
+ DCD IntDefaultHandler ; UART1 Rx and Tx
+ DCD IntDefaultHandler ; SSI0 Rx and Tx
+ DCD IntDefaultHandler ; I2C0 Master and Slave
+ DCD IntDefaultHandler ; PWM Fault
+ DCD IntDefaultHandler ; PWM Generator 0
+ DCD IntDefaultHandler ; PWM Generator 1
+ DCD IntDefaultHandler ; PWM Generator 2
+ DCD IntDefaultHandler ; Quadrature Encoder 0
+ DCD IntDefaultHandler ; ADC Sequence 0
+ DCD IntDefaultHandler ; ADC Sequence 1
+ DCD IntDefaultHandler ; ADC Sequence 2
+ DCD IntDefaultHandler ; ADC Sequence 3
+ DCD IntDefaultHandler ; Watchdog timer
+ DCD IntDefaultHandler ; Timer 0 subtimer A
+ DCD IntDefaultHandler ; Timer 0 subtimer B
+ DCD IntDefaultHandler ; Timer 1 subtimer A
+ DCD IntDefaultHandler ; Timer 1 subtimer B
+ DCD IntDefaultHandler ; Timer 2 subtimer A
+ DCD IntDefaultHandler ; Timer 2 subtimer B
+ DCD IntDefaultHandler ; Analog Comparator 0
+ DCD IntDefaultHandler ; Analog Comparator 1
+ DCD IntDefaultHandler ; Analog Comparator 2
+ DCD IntDefaultHandler ; System Control (PLL, OSC, BO)
+ DCD IntDefaultHandler ; FLASH Control
+ DCD IntDefaultHandler ; GPIO Port F
+ DCD IntDefaultHandler ; GPIO Port G
+ DCD IntDefaultHandler ; GPIO Port H
+ DCD IntDefaultHandler ; UART2 Rx and Tx
+ DCD IntDefaultHandler ; SSI1 Rx and Tx
+ DCD IntDefaultHandler ; Timer 3 subtimer A
+ DCD IntDefaultHandler ; Timer 3 subtimer B
+ DCD IntDefaultHandler ; I2C1 Master and Slave
+ DCD IntDefaultHandler ; CAN0
+ DCD IntDefaultHandler ; CAN1
+ DCD lwIPEthernetIntHandler ; Ethernet
+ DCD IntDefaultHandler ; Hibernate
+ DCD IntDefaultHandler ; USB0
+ DCD IntDefaultHandler ; PWM Generator 3
+ DCD IntDefaultHandler ; uDMA Software Transfer
+ DCD IntDefaultHandler ; uDMA Error
+ DCD IntDefaultHandler ; ADC1 Sequence 0
+ DCD IntDefaultHandler ; ADC1 Sequence 1
+ DCD IntDefaultHandler ; ADC1 Sequence 2
+ DCD IntDefaultHandler ; ADC1 Sequence 3
+ DCD IntDefaultHandler ; External Bus Interface 0
+ DCD IntDefaultHandler ; GPIO Port J
+ DCD IntDefaultHandler ; GPIO Port K
+ DCD IntDefaultHandler ; GPIO Port L
+ DCD IntDefaultHandler ; SSI2 Rx and Tx
+ DCD IntDefaultHandler ; SSI3 Rx and Tx
+ DCD IntDefaultHandler ; UART3 Rx and Tx
+ DCD IntDefaultHandler ; UART4 Rx and Tx
+ DCD IntDefaultHandler ; UART5 Rx and Tx
+ DCD IntDefaultHandler ; UART6 Rx and Tx
+ DCD IntDefaultHandler ; UART7 Rx and Tx
+ DCD IntDefaultHandler ; I2C2 Master and Slave
+ DCD IntDefaultHandler ; I2C3 Master and Slave
+ DCD IntDefaultHandler ; Timer 4 subtimer A
+ DCD IntDefaultHandler ; Timer 4 subtimer B
+ DCD IntDefaultHandler ; Timer 5 subtimer A
+ DCD IntDefaultHandler ; Timer 5 subtimer B
+ DCD IntDefaultHandler ; FPU
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD IntDefaultHandler ; I2C4 Master and Slave
+ DCD IntDefaultHandler ; I2C5 Master and Slave
+ DCD IntDefaultHandler ; GPIO Port M
+ DCD IntDefaultHandler ; GPIO Port N
+ DCD 0 ; Reserved
+ DCD IntDefaultHandler ; Tamper
+ DCD IntDefaultHandler ; GPIO Port P (Summary or P0)
+ DCD IntDefaultHandler ; GPIO Port P1
+ DCD IntDefaultHandler ; GPIO Port P2
+ DCD IntDefaultHandler ; GPIO Port P3
+ DCD IntDefaultHandler ; GPIO Port P4
+ DCD IntDefaultHandler ; GPIO Port P5
+ DCD IntDefaultHandler ; GPIO Port P6
+ DCD IntDefaultHandler ; GPIO Port P7
+ DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0)
+ DCD IntDefaultHandler ; GPIO Port Q1
+ DCD IntDefaultHandler ; GPIO Port Q2
+ DCD IntDefaultHandler ; GPIO Port Q3
+ DCD IntDefaultHandler ; GPIO Port Q4
+ DCD IntDefaultHandler ; GPIO Port Q5
+ DCD IntDefaultHandler ; GPIO Port Q6
+ DCD IntDefaultHandler ; GPIO Port Q7
+ DCD IntDefaultHandler ; GPIO Port R
+ DCD IntDefaultHandler ; GPIO Port S
+ DCD IntDefaultHandler ; SHA/MD5 0
+ DCD IntDefaultHandler ; AES 0
+ DCD IntDefaultHandler ; DES3DES 0
+ DCD IntDefaultHandler ; LCD Controller 0
+ DCD IntDefaultHandler ; Timer 6 subtimer A
+ DCD IntDefaultHandler ; Timer 6 subtimer B
+ DCD IntDefaultHandler ; Timer 7 subtimer A
+ DCD IntDefaultHandler ; Timer 7 subtimer B
+ DCD IntDefaultHandler ; I2C6 Master and Slave
+ DCD IntDefaultHandler ; I2C7 Master and Slave
+ DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0
+ DCD IntDefaultHandler ; One Wire 0
+ DCD IntDefaultHandler ; HIM PS/2 0
+ DCD IntDefaultHandler ; HIM LED Sequencer 0
+ DCD IntDefaultHandler ; HIM Consumer IR 0
+ DCD IntDefaultHandler ; I2C8 Master and Slave
+ DCD IntDefaultHandler ; I2C9 Master and Slave
+ DCD IntDefaultHandler ; GPIO Port T
+
+;******************************************************************************
+;
+; This is the code that gets called when the processor first starts execution
+; following a reset event.
+;
+;******************************************************************************
+ EXPORT Reset_Handler
+Reset_Handler
+ ;
+ ; Enable the floating-point unit. This must be done here to handle the
+ ; case where main() uses floating-point and the function prologue saves
+ ; floating-point registers (which will fault if floating-point is not
+ ; enabled). Any configuration of the floating-point unit using
+ ; DriverLib APIs must be done here prior to the floating-point unit
+ ; being enabled.
+ ;
+ ; Note that this does not use DriverLib since it might not be included
+ ; in this project.
+ ;
+ MOVW R0, #0xED88
+ MOVT R0, #0xE000
+ LDR R1, [R0]
+ ORR R1, #0x00F00000
+ STR R1, [R0]
+
+ ;
+ ; Call the C library enty point that handles startup. This will copy
+ ; the .data section initializers from flash to SRAM and zero fill the
+ ; .bss section.
+ ;
+ IMPORT __main
+ B __main
+
+;******************************************************************************
+;
+; This is the code that gets called when the processor receives a NMI. This
+; simply enters an infinite loop, preserving the system state for examination
+; by a debugger.
+;
+;******************************************************************************
+NmiSR
+ B NmiSR
+
+;******************************************************************************
+;
+; This is the code that gets called when the processor receives a fault
+; interrupt. This simply enters an infinite loop, preserving the system state
+; for examination by a debugger.
+;
+;******************************************************************************
+FaultISR
+ B FaultISR
+
+;******************************************************************************
+;
+; This is the code that gets called when the processor receives an unexpected
+; interrupt. This simply enters an infinite loop, preserving the system state
+; for examination by a debugger.
+;
+;******************************************************************************
+IntDefaultHandler
+ B IntDefaultHandler
+
+;******************************************************************************
+;
+; Make sure the end of this section is aligned.
+;
+;******************************************************************************
+ ALIGN
+
+;******************************************************************************
+;
+; Some code in the normal code section for initializing the heap and stack.
+;
+;******************************************************************************
+ AREA |.text|, CODE, READONLY
+
+;******************************************************************************
+;
+; The function expected of the C library startup code for defining the stack
+; and heap memory locations. For the C library version of the startup code,
+; provide this function so that the C library initialization code can find out
+; the location of the stack and heap.
+;
+;******************************************************************************
+ IF :DEF: __MICROLIB
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+ ELSE
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+__user_initial_stackheap
+ LDR R0, =HeapMem
+ LDR R1, =(StackMem + Stack)
+ LDR R2, =(HeapMem + Heap)
+ LDR R3, =StackMem
+ BX LR
+ ENDIF
+
+;******************************************************************************
+;
+; Make sure the end of this section is aligned.
+;
+;******************************************************************************
+ ALIGN
+
+;******************************************************************************
+;
+; Tell the assembler that we're done.
+;
+;******************************************************************************
+ END