From 6d2d5e2aa0282c52ef693c0d9d67144fc370864d Mon Sep 17 00:00:00 2001 From: Kai Lauterbach Date: Fri, 16 Sep 2022 09:20:19 +0200 Subject: [PATCH] Updated library files. --- .../libraries/APDS9930-master/.gitattributes | 22 + firmware/libraries/APDS9930-master/.gitignore | 192 + firmware/libraries/APDS9930-master/LICENSE | 22 + firmware/libraries/APDS9930-master/README.md | 92 + .../AmbientLightInterrupt.ino | 180 + .../AmbientLightLED/AmbientLightLED.ino | 113 + .../AmbientLightSensor/AmbientLightSensor.ino | 120 + .../AmbientLightToneAC/AmbientLightToneAC.ino | 108 + .../ProximityInterrupt/ProximityInterrupt.ino | 157 + .../examples/ProximityLED/ProximityLED.ino | 131 + .../ProximitySensor/ProximitySensor.ino | 113 + .../libraries/APDS9930-master/keywords.txt | 0 .../APDS9930-master/library.properties | 9 + .../APDS9930-master/src/APDS9930.cpp | 1147 + .../libraries/APDS9930-master/src/APDS9930.h | 231 + .../Adafruit_APDS9960.cpp | 726 + .../Adafruit_APDS9960.h | 531 + .../Adafruit_APDS9960_Library/README.md | 18 + .../assets/board.jpg | Bin 0 -> 291777 bytes .../code-of-conduct.md | 127 + .../examples/color_sensor/color_sensor.ino | 59 + .../gesture_sensor/gesture_sensor.ino | 47 + .../proximity_sensor/proximity_sensor.ino | 56 + .../library.properties | 9 + .../Adafruit_APDS9960_Library/license.txt | 26 + .../Adafruit_BME280.cpp | 560 + .../Adafruit_BME280_Library/Adafruit_BME280.h | 339 + .../libraries/Adafruit_BME280_Library/LICENSE | 27 + .../Adafruit_BME280_Library/README.md | 31 + .../Adafruit_BME280_Library/assets/board.jpg | Bin 0 -> 441377 bytes .../advancedsettings/advancedsettings.ino | 159 + .../examples/bme280test/bme280test.ino | 89 + .../library.properties | 9 + .../Adafruit_Unified_Sensor/Adafruit_Sensor.h | 156 + .../Adafruit_Unified_Sensor/README.md | 229 + .../library.properties | 10 + .../ESP8266Influxdb/ESP8266Influxdb 2.cpp | 176 + .../ESP8266Influxdb/ESP8266Influxdb 2.h | 72 + .../ESP8266Influxdb/ESP8266Influxdb.cpp | 176 + .../ESP8266Influxdb/ESP8266Influxdb.h | 72 + .../libraries/ESP8266Influxdb/README 2.md | 1 + firmware/libraries/ESP8266Influxdb/README.md | 1 + .../influxdb_write/influxdb_write.ino | 63 + .../libraries/ESP8266Influxdb/keywords 2.txt | 24 + .../libraries/ESP8266Influxdb/keywords.txt | 24 + .../libraries/ESP8266_Influxdb/CHANGELOG.md | 148 + firmware/libraries/ESP8266_Influxdb/LICENSE | 21 + firmware/libraries/ESP8266_Influxdb/README.md | 696 + .../examples/BasicWrite/BasicWrite.ino | 98 + .../examples/Buckets/Buckets.ino | 136 + .../QueryAggregated/QueryAggregated.ino | 163 + .../examples/QueryParams/QueryParams.ino | 154 + .../examples/QueryTable/QueryTable.ino | 148 + .../SecureBatchWrite/SecureBatchWrite.ino | 167 + .../examples/SecureWrite/SecureWrite.ino | 113 + .../libraries/ESP8266_Influxdb/keywords.txt | 45 + .../ESP8266_Influxdb/library.properties | 10 + .../libraries/ESP8266_Influxdb/platformio.ini | 45 + .../ESP8266_Influxdb/src/BucketsClient.cpp | 244 + .../ESP8266_Influxdb/src/BucketsClient.h | 122 + .../ESP8266_Influxdb/src/HTTPService.cpp | 220 + .../ESP8266_Influxdb/src/HTTPService.h | 136 + .../ESP8266_Influxdb/src/InfluxData.cpp | 39 + .../ESP8266_Influxdb/src/InfluxData.h | 37 + .../ESP8266_Influxdb/src/InfluxDb.cpp | 157 + .../libraries/ESP8266_Influxdb/src/InfluxDb.h | 59 + .../ESP8266_Influxdb/src/InfluxDbClient.cpp | 778 + .../ESP8266_Influxdb/src/InfluxDbClient.h | 273 + .../ESP8266_Influxdb/src/InfluxDbCloud.h | 68 + .../ESP8266_Influxdb/src/Options.cpp | 43 + .../libraries/ESP8266_Influxdb/src/Options.h | 112 + .../libraries/ESP8266_Influxdb/src/Platform.h | 17 + .../libraries/ESP8266_Influxdb/src/Point.cpp | 203 + .../libraries/ESP8266_Influxdb/src/Point.h | 96 + .../libraries/ESP8266_Influxdb/src/Version.h | 32 + .../ESP8266_Influxdb/src/WritePrecision.h | 43 + .../ESP8266_Influxdb/src/query/CsvReader.cpp | 108 + .../ESP8266_Influxdb/src/query/CsvReader.h | 51 + .../ESP8266_Influxdb/src/query/FluxParser.cpp | 275 + .../ESP8266_Influxdb/src/query/FluxParser.h | 109 + .../ESP8266_Influxdb/src/query/FluxTypes.cpp | 239 + .../ESP8266_Influxdb/src/query/FluxTypes.h | 178 + .../src/query/HttpStreamScanner.cpp | 104 + .../src/query/HttpStreamScanner.h | 64 + .../ESP8266_Influxdb/src/query/Params.cpp | 151 + .../ESP8266_Influxdb/src/query/Params.h | 95 + .../ESP8266_Influxdb/src/util/debug.h | 41 + .../ESP8266_Influxdb/src/util/helpers.cpp | 188 + .../ESP8266_Influxdb/src/util/helpers.h | 63 + .../ESP8266_Influxdb/test/E2ETest.cpp | 101 + .../libraries/ESP8266_Influxdb/test/E2ETest.h | 39 + .../libraries/ESP8266_Influxdb/test/Test.cpp | 2479 ++ .../libraries/ESP8266_Influxdb/test/Test.h | 84 + .../ESP8266_Influxdb/test/TestBase.cpp | 57 + .../ESP8266_Influxdb/test/TestBase.h | 62 + .../ESP8266_Influxdb/test/TestSupport.cpp | 156 + .../ESP8266_Influxdb/test/TestSupport.h | 59 + .../ESP8266_Influxdb/test/customSettings.h | 6 + .../ESP8266_Influxdb/test/server/Readme.md | 16 + .../ESP8266_Influxdb/test/server/package.json | 15 + .../ESP8266_Influxdb/test/server/server.js | 796 + .../ESP8266_Influxdb/test/server/yarn.lock | 368 + .../libraries/ESP8266_Influxdb/test/test.ino | 110 + firmware/libraries/WiFi/README.adoc | 27 + .../ConnectNoEncryption.ino | 127 + .../ConnectWithWEP/ConnectWithWEP.ino | 132 + .../ConnectWithWPA/ConnectWithWPA.ino | 122 + .../examples/ScanNetworks/ScanNetworks.ino | 119 + .../SimpleWebServerWiFi.ino | 132 + .../WiFiChatServer/WiFiChatServer.ino | 117 + .../WiFiUdpNtpClient/WiFiUdpNtpClient.ino | 182 + .../WiFiUdpSendReceiveString.ino | 118 + .../examples/WiFiWebClient/WiFiWebClient.ino | 126 + .../WiFiWebClientRepeating.ino | 131 + .../examples/WiFiWebServer/WiFiWebServer.ino | 138 + .../libraries/WiFi/extras/binary/wifiHD.elf | Bin 0 -> 724331 bytes .../libraries/WiFi/extras/binary/wifiHD.hex | 16358 +++++++++++++ .../WiFi/extras/binary/wifiHD_2_1.elf | Bin 0 -> 1308530 bytes .../WiFi/extras/binary/wifi_dnld.elf | Bin 0 -> 182489 bytes .../WiFi/extras/binary/wifi_dnld.hex | 10470 +++++++++ .../WiFi/extras/binary/wifi_dnld_2_1.elf | Bin 0 -> 182264 bytes .../scripts/ArduinoWifiShield_upgrade.sh | 121 + .../libraries/WiFi/extras/wifiHD/.cproject | 4045 ++++ .../libraries/WiFi/extras/wifiHD/.cproject 2 | 4045 ++++ .../libraries/WiFi/extras/wifiHD/.project | 77 + .../libraries/WiFi/extras/wifiHD/.project 2 | 77 + .../WiFi/extras/wifiHD/Release/wifiHD.elf | Bin 0 -> 724331 bytes .../WiFi/extras/wifiHD/Release/wifiHD.hex | 16358 +++++++++++++ .../extras/wifiHD/src/CONFIG/conf_access.h | 170 + .../extras/wifiHD/src/CONFIG/conf_at45dbx.h | 83 + .../WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h | 108 + .../wifiHD/src/CONFIG/conf_sd_mmc_spi.h | 73 + .../src/SOFTWARE_FRAMEWORK/ASM/trampoline.x | 74 + .../BOARDS/ARDUINO/arduino 2.h | 237 + .../BOARDS/ARDUINO/arduino.h | 237 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.h | 191 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h | 191 + .../BOARDS/EVK1105/evk1105 2.h | 433 + .../BOARDS/EVK1105/evk1105.h | 433 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.h | 187 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h | 187 + .../src/SOFTWARE_FRAMEWORK/BOARDS/board 2.h | 120 + .../src/SOFTWARE_FRAMEWORK/BOARDS/board.h | 120 + .../src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my | 120 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.c | 653 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.h | 270 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx.c | 653 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx.h | 270 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.c | 234 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.h | 164 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c | 234 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h | 164 + .../v2.7.0/UCR1/GCC/lib_ucr1_hd_sdio_v2.7.0.a | Bin 0 -> 11978 bytes .../v2.7.0/UCR1/GCC/lib_ucr1_hd_spi_v2.7.0.a | Bin 0 -> 13134 bytes .../GCC/lib_ucr1_hd_wl_sta_intwpa_v2.7.0.a | Bin 0 -> 1007102 bytes .../v2.7.0/UCR2/GCC/lib_ucr2_hd_sdio_v2.7.0.a | Bin 0 -> 11946 bytes .../v2.7.0/UCR2/GCC/lib_ucr2_hd_spi_v2.7.0.a | Bin 0 -> 13110 bytes .../GCC/lib_ucr2_hd_wl_sta_intwpa_v2.7.0.a | Bin 0 -> 1004426 bytes .../COMPONENTS/WIFI/HD/v2.7.0/revision 2.txt | 1 + .../COMPONENTS/WIFI/HD/v2.7.0/revision.txt | 1 + .../COMPONENTS/WIFI/HD/wl_api 2.h | 1687 ++ .../COMPONENTS/WIFI/HD/wl_api.h | 1687 ++ .../COMPONENTS/WIFI/HD/wl_fw 2.h | 19287 ++++++++++++++++ .../COMPONENTS/WIFI/HD/wl_fw.h | 19287 ++++++++++++++++ .../COMPONENTS/WIFI/HD/wl_os 2.h | 35 + .../COMPONENTS/WIFI/HD/wl_os.h | 35 + .../COMPONENTS/WIFI/HD/wl_sdio 2.h | 172 + .../COMPONENTS/WIFI/HD/wl_sdio.h | 172 + .../COMPONENTS/WIFI/HD/wl_spi 2.h | 185 + .../COMPONENTS/WIFI/HD/wl_spi.h | 185 + .../COMPONENTS/WIFI/HD/wlap_api 2.h | 154 + .../COMPONENTS/WIFI/HD/wlap_api.h | 154 + .../CPU/CYCLE_COUNTER/cycle_counter 2.h | 309 + .../DRIVERS/CPU/CYCLE_COUNTER/cycle_counter.h | 309 + .../DRIVERS/EBI/SMC/smc 2.c | 995 + .../DRIVERS/EBI/SMC/smc 2.h | 68 + .../SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.c | 995 + .../SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.h | 68 + .../SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic 2.c | 183 + .../SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic 2.h | 275 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.c | 183 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.h | 275 + .../DRIVERS/FLASHC/flashc 2.c | 1117 + .../DRIVERS/FLASHC/flashc 2.h | 1002 + .../DRIVERS/FLASHC/flashc.c | 1117 + .../DRIVERS/FLASHC/flashc.h | 1002 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.c | 458 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.h | 583 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c | 458 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h | 583 + .../DRIVERS/INTC/exception.x | 239 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.c | 214 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.h | 100 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c | 214 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h | 100 + .../SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca 2.c | 296 + .../SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca 2.h | 251 + .../SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.c | 296 + .../SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.h | 251 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.c | 546 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.h | 493 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c | 546 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h | 493 + .../DRIVERS/PM/pm_conf_clocks 2.c | 268 + .../DRIVERS/PM/pm_conf_clocks.c | 268 + .../DRIVERS/PM/power_clocks_lib 2.c | 566 + .../DRIVERS/PM/power_clocks_lib 2.h | 379 + .../DRIVERS/PM/power_clocks_lib.c | 566 + .../DRIVERS/PM/power_clocks_lib.h | 379 + .../SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc 2.c | 213 + .../SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc 2.h | 191 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.c | 213 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.h | 191 + .../SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.c | 443 + .../SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.h | 342 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c | 443 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h | 342 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc 2.c | 314 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc 2.h | 591 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.c | 314 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.h | 591 + .../DRIVERS/USART/usart 2.c | 914 + .../DRIVERS/USART/usart 2.h | 889 + .../SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c | 914 + .../SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h | 889 + .../SERVICES/DELAY/delay 2.c | 87 + .../SERVICES/DELAY/delay 2.h | 80 + .../SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.c | 87 + .../SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.h | 80 + .../LWIP/lwip-1.3.2/src/core/dhcp 2.c | 1724 ++ .../SERVICES/LWIP/lwip-1.3.2/src/core/dhcp.c | 1724 ++ .../SERVICES/LWIP/lwip-1.3.2/src/core/dns 2.c | 982 + .../SERVICES/LWIP/lwip-1.3.2/src/core/dns.c | 982 + .../LWIP/lwip-1.3.2/src/core/init 2.c | 276 + .../SERVICES/LWIP/lwip-1.3.2/src/core/init.c | 276 + .../LWIP/lwip-1.3.2/src/core/ipv4/autoip 2.c | 499 + .../LWIP/lwip-1.3.2/src/core/ipv4/autoip.c | 499 + .../LWIP/lwip-1.3.2/src/core/ipv4/icmp 2.c | 333 + .../LWIP/lwip-1.3.2/src/core/ipv4/icmp.c | 333 + .../LWIP/lwip-1.3.2/src/core/ipv4/igmp 2.c | 759 + .../LWIP/lwip-1.3.2/src/core/ipv4/igmp.c | 759 + .../LWIP/lwip-1.3.2/src/core/ipv4/inet 2.c | 280 + .../LWIP/lwip-1.3.2/src/core/ipv4/inet.c | 280 + .../lwip-1.3.2/src/core/ipv4/inet_chksum 2.c | 440 + .../lwip-1.3.2/src/core/ipv4/inet_chksum.c | 440 + .../LWIP/lwip-1.3.2/src/core/ipv4/ip 2.c | 725 + .../LWIP/lwip-1.3.2/src/core/ipv4/ip.c | 725 + .../LWIP/lwip-1.3.2/src/core/ipv4/ip_addr 2.c | 86 + .../LWIP/lwip-1.3.2/src/core/ipv4/ip_addr.c | 86 + .../LWIP/lwip-1.3.2/src/core/ipv4/ip_frag 2.c | 794 + .../LWIP/lwip-1.3.2/src/core/ipv4/ip_frag.c | 794 + .../SERVICES/LWIP/lwip-1.3.2/src/core/mem 2.c | 635 + .../SERVICES/LWIP/lwip-1.3.2/src/core/mem.c | 635 + .../LWIP/lwip-1.3.2/src/core/memp 2.c | 388 + .../SERVICES/LWIP/lwip-1.3.2/src/core/memp.c | 388 + .../LWIP/lwip-1.3.2/src/core/netif 2.c | 683 + .../SERVICES/LWIP/lwip-1.3.2/src/core/netif.c | 683 + .../LWIP/lwip-1.3.2/src/core/pbuf 2.c | 931 + .../SERVICES/LWIP/lwip-1.3.2/src/core/pbuf.c | 931 + .../SERVICES/LWIP/lwip-1.3.2/src/core/raw 2.c | 355 + .../SERVICES/LWIP/lwip-1.3.2/src/core/raw.c | 355 + .../LWIP/lwip-1.3.2/src/core/stats 2.c | 151 + .../SERVICES/LWIP/lwip-1.3.2/src/core/stats.c | 151 + .../SERVICES/LWIP/lwip-1.3.2/src/core/tcp 2.c | 1463 ++ .../SERVICES/LWIP/lwip-1.3.2/src/core/tcp.c | 1463 ++ .../LWIP/lwip-1.3.2/src/core/tcp_in 2.c | 1508 ++ .../LWIP/lwip-1.3.2/src/core/tcp_in.c | 1508 ++ .../LWIP/lwip-1.3.2/src/core/tcp_out 2.c | 1071 + .../LWIP/lwip-1.3.2/src/core/tcp_out.c | 1071 + .../SERVICES/LWIP/lwip-1.3.2/src/core/udp 2.c | 843 + .../SERVICES/LWIP/lwip-1.3.2/src/core/udp.c | 843 + .../src/include/ipv4/lwip/autoip 2.h | 118 + .../lwip-1.3.2/src/include/ipv4/lwip/autoip.h | 118 + .../lwip-1.3.2/src/include/ipv4/lwip/icmp 2.h | 113 + .../lwip-1.3.2/src/include/ipv4/lwip/icmp.h | 113 + .../lwip-1.3.2/src/include/ipv4/lwip/igmp 2.h | 164 + .../lwip-1.3.2/src/include/ipv4/lwip/igmp.h | 164 + .../lwip-1.3.2/src/include/ipv4/lwip/inet 2.h | 105 + .../lwip-1.3.2/src/include/ipv4/lwip/inet.h | 105 + .../src/include/ipv4/lwip/inet_chksum 2.h | 62 + .../src/include/ipv4/lwip/inet_chksum.h | 62 + .../lwip-1.3.2/src/include/ipv4/lwip/ip 2.h | 200 + .../lwip-1.3.2/src/include/ipv4/lwip/ip.h | 200 + .../src/include/ipv4/lwip/ip_addr 2.h | 175 + .../src/include/ipv4/lwip/ip_addr.h | 175 + .../src/include/ipv4/lwip/ip_frag 2.h | 78 + .../src/include/ipv4/lwip/ip_frag.h | 78 + .../LWIP/lwip-1.3.2/src/include/lwip/api 2.h | 224 + .../LWIP/lwip-1.3.2/src/include/lwip/api.h | 224 + .../lwip-1.3.2/src/include/lwip/api_msg 2.h | 164 + .../lwip-1.3.2/src/include/lwip/api_msg.h | 164 + .../LWIP/lwip-1.3.2/src/include/lwip/arch 2.h | 235 + .../LWIP/lwip-1.3.2/src/include/lwip/arch.h | 235 + .../lwip-1.3.2/src/include/lwip/debug 2.h | 100 + .../LWIP/lwip-1.3.2/src/include/lwip/debug.h | 100 + .../LWIP/lwip-1.3.2/src/include/lwip/def 2.h | 49 + .../LWIP/lwip-1.3.2/src/include/lwip/def.h | 49 + .../LWIP/lwip-1.3.2/src/include/lwip/dhcp 2.h | 248 + .../LWIP/lwip-1.3.2/src/include/lwip/dhcp.h | 248 + .../LWIP/lwip-1.3.2/src/include/lwip/dns 2.h | 99 + .../LWIP/lwip-1.3.2/src/include/lwip/dns.h | 99 + .../LWIP/lwip-1.3.2/src/include/lwip/err 2.h | 89 + .../LWIP/lwip-1.3.2/src/include/lwip/err.h | 89 + .../LWIP/lwip-1.3.2/src/include/lwip/init 2.h | 74 + .../LWIP/lwip-1.3.2/src/include/lwip/init.h | 74 + .../LWIP/lwip-1.3.2/src/include/lwip/mem 2.h | 109 + .../LWIP/lwip-1.3.2/src/include/lwip/mem.h | 109 + .../LWIP/lwip-1.3.2/src/include/lwip/memp 2.h | 118 + .../LWIP/lwip-1.3.2/src/include/lwip/memp.h | 118 + .../lwip-1.3.2/src/include/lwip/memp_std 2.h | 104 + .../lwip-1.3.2/src/include/lwip/memp_std.h | 104 + .../lwip-1.3.2/src/include/lwip/netbuf 2.h | 88 + .../LWIP/lwip-1.3.2/src/include/lwip/netbuf.h | 88 + .../lwip-1.3.2/src/include/lwip/netdb 2.h | 113 + .../LWIP/lwip-1.3.2/src/include/lwip/netdb.h | 113 + .../lwip-1.3.2/src/include/lwip/netif 2.h | 265 + .../LWIP/lwip-1.3.2/src/include/lwip/netif.h | 265 + .../lwip-1.3.2/src/include/lwip/netifapi 2.h | 107 + .../lwip-1.3.2/src/include/lwip/netifapi.h | 107 + .../LWIP/lwip-1.3.2/src/include/lwip/opt 2.h | 1842 ++ .../LWIP/lwip-1.3.2/src/include/lwip/opt.h | 1842 ++ .../LWIP/lwip-1.3.2/src/include/lwip/pbuf 2.h | 122 + .../LWIP/lwip-1.3.2/src/include/lwip/pbuf.h | 122 + .../LWIP/lwip-1.3.2/src/include/lwip/raw 2.h | 99 + .../LWIP/lwip-1.3.2/src/include/lwip/raw.h | 99 + .../LWIP/lwip-1.3.2/src/include/lwip/sio 2.h | 143 + .../LWIP/lwip-1.3.2/src/include/lwip/sio.h | 143 + .../LWIP/lwip-1.3.2/src/include/lwip/snmp 2.h | 366 + .../LWIP/lwip-1.3.2/src/include/lwip/snmp.h | 366 + .../lwip-1.3.2/src/include/lwip/snmp_asn1 2.h | 103 + .../lwip-1.3.2/src/include/lwip/snmp_asn1.h | 103 + .../lwip-1.3.2/src/include/lwip/snmp_msg 2.h | 313 + .../lwip-1.3.2/src/include/lwip/snmp_msg.h | 313 + .../src/include/lwip/snmp_structs 2.h | 264 + .../src/include/lwip/snmp_structs.h | 264 + .../lwip-1.3.2/src/include/lwip/sockets 2.h | 359 + .../lwip-1.3.2/src/include/lwip/sockets.h | 359 + .../lwip-1.3.2/src/include/lwip/stats 2.h | 285 + .../LWIP/lwip-1.3.2/src/include/lwip/stats.h | 285 + .../LWIP/lwip-1.3.2/src/include/lwip/sys 2.h | 245 + .../LWIP/lwip-1.3.2/src/include/lwip/sys.h | 245 + .../LWIP/lwip-1.3.2/src/include/lwip/tcp 2.h | 709 + .../LWIP/lwip-1.3.2/src/include/lwip/tcp.h | 709 + .../lwip-1.3.2/src/include/lwip/tcpip 2.h | 143 + .../LWIP/lwip-1.3.2/src/include/lwip/tcpip.h | 143 + .../LWIP/lwip-1.3.2/src/include/lwip/udp 2.h | 155 + .../LWIP/lwip-1.3.2/src/include/lwip/udp.h | 155 + .../lwip-1.3.2/src/include/netif/etharp 2.h | 194 + .../lwip-1.3.2/src/include/netif/etharp.h | 194 + .../lwip-1.3.2/src/include/netif/loopif 2.h | 55 + .../lwip-1.3.2/src/include/netif/loopif.h | 55 + .../lwip-1.3.2/src/include/netif/ppp_oe 2.h | 163 + .../lwip-1.3.2/src/include/netif/ppp_oe.h | 163 + .../lwip-1.3.2/src/include/netif/slipif 2.h | 53 + .../lwip-1.3.2/src/include/netif/slipif.h | 53 + .../LWIP/lwip-1.3.2/src/netif/etharp 2.c | 1224 + .../LWIP/lwip-1.3.2/src/netif/etharp.c | 1224 + .../LWIP/lwip-1.3.2/src/netif/loopif 2.c | 68 + .../LWIP/lwip-1.3.2/src/netif/loopif.c | 68 + .../lwip-port-1.3.2/HD/if/include/arch/cc 2.h | 79 + .../lwip-port-1.3.2/HD/if/include/arch/cc.h | 79 + .../HD/if/include/arch/perf 2.h | 7 + .../lwip-port-1.3.2/HD/if/include/arch/perf.h | 7 + .../HD/if/include/lwipopts 2.h | 426 + .../lwip-port-1.3.2/HD/if/include/lwipopts.h | 426 + .../HD/if/include/netif/wlif 2.h | 10 + .../HD/if/include/netif/wlif.h | 10 + .../LWIP/lwip-port-1.3.2/HD/if/netif/wlif 2.c | 386 + .../LWIP/lwip-port-1.3.2/HD/if/netif/wlif.c | 386 + .../LWIP/lwip-port-1.3.2/HD/readme 2.txt | 1 + .../LWIP/lwip-port-1.3.2/HD/readme.txt | 1 + .../MEMORY/CTRL_ACCESS/ctrl_access 2.c | 571 + .../MEMORY/CTRL_ACCESS/ctrl_access 2.h | 369 + .../SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c | 571 + .../SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h | 369 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.c | 133 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.h | 116 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c | 133 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h | 116 + .../UTILS/DEBUG/print_funcs 2.c | 215 + .../UTILS/DEBUG/print_funcs 2.h | 294 + .../UTILS/DEBUG/print_funcs.c | 215 + .../UTILS/DEBUG/print_funcs.h | 294 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu 2.h | 63 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h | 63 + .../NEWLIB_ADDONS/INCLUDE/nlao_exceptions 2.h | 120 + .../NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h | 120 + .../NEWLIB_ADDONS/INCLUDE/nlao_interrupts 2.h | 82 + .../NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h | 82 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io 2.h | 174 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h | 174 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart 2.h | 208 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h | 208 + .../libnewlib_addons-at32ucr2-speed_opt.a | Bin 0 -> 25540 bytes .../AT32UC3A/0512/GCC/link_uc3a0512.lds | 266 + .../AT32UC3A/1256/GCC/link_uc3a1256.lds | 266 + .../UTILS/PREPROCESSOR/mrepeat 2.h | 328 + .../UTILS/PREPROCESSOR/mrepeat.h | 328 + .../UTILS/PREPROCESSOR/preprocessor 2.h | 55 + .../UTILS/PREPROCESSOR/preprocessor.h | 55 + .../UTILS/PREPROCESSOR/stringz 2.h | 75 + .../UTILS/PREPROCESSOR/stringz.h | 75 + .../UTILS/PREPROCESSOR/tpaste 2.h | 95 + .../UTILS/PREPROCESSOR/tpaste.h | 95 + .../UTILS/STARTUP_FILES/GCC/crt0.x | 121 + .../src/SOFTWARE_FRAMEWORK/UTILS/compiler 2.h | 1145 + .../src/SOFTWARE_FRAMEWORK/UTILS/compiler.h | 1145 + .../src/SOFTWARE_FRAMEWORK/UTILS/conf_isp 2.h | 136 + .../src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h | 136 + .../src/SOFTWARE_FRAMEWORK/UTILS/parts 2.h | 203 + .../src/SOFTWARE_FRAMEWORK/UTILS/parts.h | 203 + .../WiFi/extras/wifiHD/src/ard_spi 2.c | 1969 ++ .../WiFi/extras/wifiHD/src/ard_spi 2.h | 88 + .../WiFi/extras/wifiHD/src/ard_spi.c | 1969 ++ .../WiFi/extras/wifiHD/src/ard_spi.h | 88 + .../WiFi/extras/wifiHD/src/ard_tcp 2.c | 987 + .../WiFi/extras/wifiHD/src/ard_tcp 2.h | 124 + .../WiFi/extras/wifiHD/src/ard_tcp.c | 987 + .../WiFi/extras/wifiHD/src/ard_tcp.h | 124 + .../WiFi/extras/wifiHD/src/ard_utils 2.c | 347 + .../WiFi/extras/wifiHD/src/ard_utils 2.h | 295 + .../WiFi/extras/wifiHD/src/ard_utils.c | 347 + .../WiFi/extras/wifiHD/src/ard_utils.h | 295 + .../WiFi/extras/wifiHD/src/avr32_spi 2.c | 394 + .../WiFi/extras/wifiHD/src/avr32_spi.c | 394 + .../WiFi/extras/wifiHD/src/board_init 2.c | 297 + .../WiFi/extras/wifiHD/src/board_init 2.h | 313 + .../WiFi/extras/wifiHD/src/board_init.c | 297 + .../WiFi/extras/wifiHD/src/board_init.h | 313 + .../WiFi/extras/wifiHD/src/cmd_wl 2.c | 731 + .../WiFi/extras/wifiHD/src/cmd_wl 2.h | 66 + .../libraries/WiFi/extras/wifiHD/src/cmd_wl.c | 731 + .../libraries/WiFi/extras/wifiHD/src/cmd_wl.h | 66 + .../WiFi/extras/wifiHD/src/console 2.c | 212 + .../WiFi/extras/wifiHD/src/console 2.h | 46 + .../WiFi/extras/wifiHD/src/console.c | 212 + .../WiFi/extras/wifiHD/src/console.h | 46 + .../WiFi/extras/wifiHD/src/debug 2.h | 191 + .../libraries/WiFi/extras/wifiHD/src/debug.h | 191 + .../WiFi/extras/wifiHD/src/fw_download 2.h | 38 + .../WiFi/extras/wifiHD/src/fw_download.h | 38 + .../wifiHD/src/fw_download_extflash 2.c | 82 + .../extras/wifiHD/src/fw_download_extflash.c | 82 + .../WiFi/extras/wifiHD/src/license 2.txt | 42 + .../WiFi/extras/wifiHD/src/license.txt | 42 + .../WiFi/extras/wifiHD/src/lwip_setup 2.c | 145 + .../WiFi/extras/wifiHD/src/lwip_setup 2.h | 30 + .../WiFi/extras/wifiHD/src/lwip_setup.c | 145 + .../WiFi/extras/wifiHD/src/lwip_setup.h | 30 + .../WiFi/extras/wifiHD/src/lwipopts 2.h | 450 + .../WiFi/extras/wifiHD/src/lwipopts.h | 450 + .../libraries/WiFi/extras/wifiHD/src/main 2.c | 454 + .../libraries/WiFi/extras/wifiHD/src/main.c | 454 + .../WiFi/extras/wifiHD/src/nvram 2.c | 153 + .../WiFi/extras/wifiHD/src/nvram 2.h | 10 + .../libraries/WiFi/extras/wifiHD/src/nvram.c | 153 + .../libraries/WiFi/extras/wifiHD/src/nvram.h | 10 + .../WiFi/extras/wifiHD/src/owl_os 2.c | 140 + .../libraries/WiFi/extras/wifiHD/src/owl_os.c | 140 + .../libraries/WiFi/extras/wifiHD/src/ping 2.c | 340 + .../libraries/WiFi/extras/wifiHD/src/ping 2.h | 45 + .../libraries/WiFi/extras/wifiHD/src/ping.c | 340 + .../libraries/WiFi/extras/wifiHD/src/ping.h | 45 + .../WiFi/extras/wifiHD/src/printf-stdarg 2.c | 323 + .../WiFi/extras/wifiHD/src/printf-stdarg 2.h | 34 + .../WiFi/extras/wifiHD/src/printf-stdarg.c | 323 + .../WiFi/extras/wifiHD/src/printf-stdarg.h | 34 + .../WiFi/extras/wifiHD/src/timer 2.c | 232 + .../WiFi/extras/wifiHD/src/timer 2.h | 51 + .../libraries/WiFi/extras/wifiHD/src/timer.c | 232 + .../libraries/WiFi/extras/wifiHD/src/timer.h | 51 + .../WiFi/extras/wifiHD/src/top_defs 2.h | 120 + .../WiFi/extras/wifiHD/src/top_defs.h | 120 + .../WiFi/extras/wifiHD/src/trace 2.h | 44 + .../libraries/WiFi/extras/wifiHD/src/trace.h | 44 + .../libraries/WiFi/extras/wifiHD/src/util 2.c | 260 + .../libraries/WiFi/extras/wifiHD/src/util 2.h | 71 + .../libraries/WiFi/extras/wifiHD/src/util.c | 260 + .../libraries/WiFi/extras/wifiHD/src/util.h | 71 + .../WiFi/extras/wifiHD/src/wifi_spi 2.h | 160 + .../WiFi/extras/wifiHD/src/wifi_spi.h | 160 + .../WiFi/extras/wifiHD/src/wl_cm 2.c | 431 + .../WiFi/extras/wifiHD/src/wl_cm 2.h | 51 + .../libraries/WiFi/extras/wifiHD/src/wl_cm.c | 431 + .../libraries/WiFi/extras/wifiHD/src/wl_cm.h | 51 + .../WiFi/extras/wifiHD/src/wl_definitions 2.h | 39 + .../WiFi/extras/wifiHD/src/wl_definitions.h | 39 + .../libraries/WiFi/extras/wifiHD/wifiHD.cproj | 1291 ++ .../libraries/WiFi/extras/wifi_dnld/.cproject | 1281 + .../WiFi/extras/wifi_dnld/.cproject 2 | 1281 + .../libraries/WiFi/extras/wifi_dnld/.project | 70 + .../WiFi/extras/wifi_dnld/.project 2 | 70 + .../extras/wifi_dnld/Release/wifi_dnld.elf | Bin 0 -> 182489 bytes .../extras/wifi_dnld/src/CONFIG/conf_access.h | 170 + .../wifi_dnld/src/CONFIG/conf_at45dbx.h | 83 + .../src/Doc/SPB104 product brief.pdf | Bin 0 -> 760252 bytes .../wifi_dnld/src/Doc/gettingstarted.pdf | Bin 0 -> 701930 bytes .../ASM/.trampoline 2.x.icloud | Bin 0 -> 162 bytes .../src/SOFTWARE_FRAMEWORK/ASM/trampoline.x | 74 + .../BOARDS/ARDUINO/arduino 2.h | 234 + .../BOARDS/ARDUINO/arduino.h | 234 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.h | 191 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h | 191 + .../BOARDS/EVK1105/evk1105 2.h | 433 + .../BOARDS/EVK1105/evk1105.h | 433 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.h | 187 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c | 346 + .../SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h | 187 + .../src/SOFTWARE_FRAMEWORK/BOARDS/board 2.h | 120 + .../src/SOFTWARE_FRAMEWORK/BOARDS/board.h | 120 + .../src/SOFTWARE_FRAMEWORK/BOARDS/board.h.ori | 121 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.c | 672 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.h | 269 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx.c | 672 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx.h | 269 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.c | 234 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.h | 164 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c | 234 + .../MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h | 164 + .../DRIVERS/FLASHC/flashc 2.c | 1117 + .../DRIVERS/FLASHC/flashc 2.h | 1002 + .../DRIVERS/FLASHC/flashc.c | 1117 + .../DRIVERS/FLASHC/flashc.h | 1002 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.c | 458 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.h | 583 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c | 458 + .../SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h | 583 + .../DRIVERS/INTC/.exception 2.x.icloud | Bin 0 -> 161 bytes .../DRIVERS/INTC/exception.x | 239 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.c | 214 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.h | 100 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c | 214 + .../SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h | 100 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.c | 546 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.h | 493 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c | 546 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h | 493 + .../DRIVERS/PM/pm_conf_clocks 2.c | 268 + .../DRIVERS/PM/pm_conf_clocks.c | 268 + .../DRIVERS/PM/power_clocks_lib 2.c | 566 + .../DRIVERS/PM/power_clocks_lib 2.h | 379 + .../DRIVERS/PM/power_clocks_lib.c | 566 + .../DRIVERS/PM/power_clocks_lib.h | 379 + .../SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.c | 443 + .../SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.h | 342 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c | 443 + .../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h | 342 + .../DRIVERS/USART/usart 2.c | 914 + .../DRIVERS/USART/usart 2.h | 889 + .../SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c | 914 + .../SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h | 889 + .../MEMORY/CTRL_ACCESS/ctrl_access 2.c | 571 + .../MEMORY/CTRL_ACCESS/ctrl_access 2.h | 369 + .../SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c | 571 + .../SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h | 369 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.c | 119 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.h | 116 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c | 119 + .../SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h | 116 + .../UTILS/DEBUG/print_funcs 2.c | 215 + .../UTILS/DEBUG/print_funcs 2.h | 294 + .../UTILS/DEBUG/print_funcs.c | 215 + .../UTILS/DEBUG/print_funcs.h | 294 + ...ewlib_addons-at32ucr2-speed_opt 2.a.icloud | Bin 0 -> 189 bytes .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu 2.h | 63 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h | 63 + .../NEWLIB_ADDONS/INCLUDE/nlao_exceptions 2.h | 120 + .../NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h | 120 + .../NEWLIB_ADDONS/INCLUDE/nlao_interrupts 2.h | 82 + .../NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h | 82 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io 2.h | 174 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h | 174 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart 2.h | 208 + .../LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h | 208 + .../libnewlib_addons-at32ucr2-speed_opt.a | Bin 0 -> 25540 bytes .../AT32UC3A/0512/GCC/link_uc3a0512.lds | 266 + .../AT32UC3A/1256/GCC/link_uc3a1256.lds | 266 + .../UTILS/PREPROCESSOR/mrepeat 2.h | 328 + .../UTILS/PREPROCESSOR/mrepeat.h | 328 + .../UTILS/PREPROCESSOR/preprocessor 2.h | 55 + .../UTILS/PREPROCESSOR/preprocessor.h | 55 + .../UTILS/PREPROCESSOR/stringz 2.h | 75 + .../UTILS/PREPROCESSOR/stringz.h | 75 + .../UTILS/PREPROCESSOR/tpaste 2.h | 95 + .../UTILS/PREPROCESSOR/tpaste.h | 95 + .../UTILS/STARTUP_FILES/GCC/crt0.x | 121 + .../src/SOFTWARE_FRAMEWORK/UTILS/compiler 2.h | 1145 + .../src/SOFTWARE_FRAMEWORK/UTILS/compiler.h | 1145 + .../src/SOFTWARE_FRAMEWORK/UTILS/conf_isp 2.h | 136 + .../src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h | 136 + .../src/SOFTWARE_FRAMEWORK/UTILS/parts 2.h | 203 + .../src/SOFTWARE_FRAMEWORK/UTILS/parts.h | 203 + .../WiFi/extras/wifi_dnld/src/clocks 2.c | 101 + .../WiFi/extras/wifi_dnld/src/clocks 2.h | 78 + .../WiFi/extras/wifi_dnld/src/clocks.c | 101 + .../WiFi/extras/wifi_dnld/src/clocks.h | 78 + .../WiFi/extras/wifi_dnld/src/flash_fw 2.c | 125 + .../WiFi/extras/wifi_dnld/src/flash_fw.c | 125 + .../WiFi/extras/wifi_dnld/src/license 2.txt | 42 + .../WiFi/extras/wifi_dnld/src/license.txt | 42 + .../WiFi/extras/wifi_dnld/src/nor_flash 2.c | 99 + .../WiFi/extras/wifi_dnld/src/nor_flash 2.h | 41 + .../WiFi/extras/wifi_dnld/src/nor_flash.c | 99 + .../WiFi/extras/wifi_dnld/src/nor_flash.h | 41 + .../extras/wifi_dnld/src/printf-stdarg 2.c | 323 + .../extras/wifi_dnld/src/printf-stdarg 2.h | 36 + .../WiFi/extras/wifi_dnld/src/printf-stdarg.c | 323 + .../WiFi/extras/wifi_dnld/src/printf-stdarg.h | 36 + .../WiFi/extras/wifi_dnld/src/startup 2.c | 75 + .../WiFi/extras/wifi_dnld/src/startup 2.h | 35 + .../WiFi/extras/wifi_dnld/src/startup.c | 75 + .../WiFi/extras/wifi_dnld/src/startup.h | 35 + .../WiFi/extras/wifi_dnld/src/wl_fw 2.h | 19287 ++++++++++++++++ .../WiFi/extras/wifi_dnld/src/wl_fw.h | 19287 ++++++++++++++++ .../WiFi/extras/wifi_dnld/wifi_dnld.cproj | 495 + .../libraries/WiFi/extras/wifishield.atsln | 36 + firmware/libraries/WiFi/keywords 2.txt | 59 + firmware/libraries/WiFi/keywords.txt | 59 + firmware/libraries/WiFi/library.properties | 9 + firmware/libraries/WiFi/src/WiFi 2.cpp | 248 + firmware/libraries/WiFi/src/WiFi 2.h | 246 + firmware/libraries/WiFi/src/WiFi.cpp | 248 + firmware/libraries/WiFi/src/WiFi.h | 246 + firmware/libraries/WiFi/src/WiFiClient 2.cpp | 199 + firmware/libraries/WiFi/src/WiFiClient 2.h | 59 + firmware/libraries/WiFi/src/WiFiClient.cpp | 199 + firmware/libraries/WiFi/src/WiFiClient.h | 59 + firmware/libraries/WiFi/src/WiFiServer 2.cpp | 108 + firmware/libraries/WiFi/src/WiFiServer 2.h | 46 + firmware/libraries/WiFi/src/WiFiServer.cpp | 108 + firmware/libraries/WiFi/src/WiFiServer.h | 46 + firmware/libraries/WiFi/src/WiFiUdp 2.cpp | 180 + firmware/libraries/WiFi/src/WiFiUdp 2.h | 80 + firmware/libraries/WiFi/src/WiFiUdp.cpp | 180 + firmware/libraries/WiFi/src/WiFiUdp.h | 80 + firmware/libraries/WiFi/src/utility/debug.h | 95 + .../libraries/WiFi/src/utility/server_drv.cpp | 327 + .../libraries/WiFi/src/utility/server_drv.h | 60 + .../libraries/WiFi/src/utility/spi_drv.cpp | 496 + firmware/libraries/WiFi/src/utility/spi_drv.h | 106 + .../libraries/WiFi/src/utility/wifi_drv.cpp | 579 + .../libraries/WiFi/src/utility/wifi_drv.h | 267 + .../libraries/WiFi/src/utility/wifi_spi.h | 173 + .../WiFi/src/utility/wl_definitions.h | 72 + .../libraries/WiFi/src/utility/wl_types.h | 49 + firmware/libraries/WiFiManager/LICENSE | 22 + firmware/libraries/WiFiManager/README.md | 581 + .../libraries/WiFiManager/WiFiManager.cpp | 3884 ++++ firmware/libraries/WiFiManager/WiFiManager.h | 765 + .../examples/Advanced/Advanced.ino | 141 + .../WiFiManager/examples/Basic/Basic.ino | 41 + .../AutoConnectNonBlocking.ino | 27 + .../AutoConnectNonBlockingwParams.ino | 36 + .../onDemandNonBlocking.ino | 85 + .../AutoConnectWithFeedback.ino | 42 + .../AutoConnectWithReset.ino | 43 + .../AutoConnectWithStaticIP.ino | 71 + .../AutoConnectWithTimeout.ino | 38 + .../OnDemandConfigPortal.ino | 47 + .../OnDemandWebPortal/onDemandWebPortal.ino | 51 + .../LittleFS/LittleFSParameters.ino | 79 + .../AutoConnectWithFSParameters.ino | 169 + ...AutoConnectWithFSParametersAndCustomIP.ino | 194 + .../ParamsChildClass/ParamsChildClass.ino | 143 + .../OnDemandConfigPortal.ino | 417 + .../examples/Unique/cb/AnonymousCB.ino | 26 + .../extras/WiFiManager.template.html | 395 + .../libraries/WiFiManager/extras/parse.js | 60 + .../extras/png_signal_strength_master.png | Bin 0 -> 59671 bytes .../libraries/WiFiManager/extras/template.h | 12 + .../libraries/WiFiManager/extras/test.html | 182 + firmware/libraries/WiFiManager/keywords.txt | 39 + firmware/libraries/WiFiManager/library.json | 29 + .../libraries/WiFiManager/library.properties | 9 + firmware/libraries/WiFiManager/strings_en.h | 501 + .../libraries/WiFiManager/travis/common.sh | 60 + 683 files changed, 316603 insertions(+) create mode 100755 firmware/libraries/APDS9930-master/.gitattributes create mode 100755 firmware/libraries/APDS9930-master/.gitignore create mode 100755 firmware/libraries/APDS9930-master/LICENSE create mode 100755 firmware/libraries/APDS9930-master/README.md create mode 100755 firmware/libraries/APDS9930-master/examples/AmbientLightInterrupt/AmbientLightInterrupt.ino create mode 100755 firmware/libraries/APDS9930-master/examples/AmbientLightLED/AmbientLightLED.ino create mode 100755 firmware/libraries/APDS9930-master/examples/AmbientLightSensor/AmbientLightSensor.ino create mode 100755 firmware/libraries/APDS9930-master/examples/AmbientLightToneAC/AmbientLightToneAC.ino create mode 100755 firmware/libraries/APDS9930-master/examples/ProximityInterrupt/ProximityInterrupt.ino create mode 100755 firmware/libraries/APDS9930-master/examples/ProximityLED/ProximityLED.ino create mode 100755 firmware/libraries/APDS9930-master/examples/ProximitySensor/ProximitySensor.ino create mode 100755 firmware/libraries/APDS9930-master/keywords.txt create mode 100755 firmware/libraries/APDS9930-master/library.properties create mode 100755 firmware/libraries/APDS9930-master/src/APDS9930.cpp create mode 100755 firmware/libraries/APDS9930-master/src/APDS9930.h create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.h create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/README.md create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/assets/board.jpg create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/code-of-conduct.md create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/examples/color_sensor/color_sensor.ino create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/examples/gesture_sensor/gesture_sensor.ino create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/examples/proximity_sensor/proximity_sensor.ino create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/library.properties create mode 100755 firmware/libraries/Adafruit_APDS9960_Library/license.txt create mode 100755 firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp create mode 100755 firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.h create mode 100755 firmware/libraries/Adafruit_BME280_Library/LICENSE create mode 100755 firmware/libraries/Adafruit_BME280_Library/README.md create mode 100755 firmware/libraries/Adafruit_BME280_Library/assets/board.jpg create mode 100755 firmware/libraries/Adafruit_BME280_Library/examples/advancedsettings/advancedsettings.ino create mode 100755 firmware/libraries/Adafruit_BME280_Library/examples/bme280test/bme280test.ino create mode 100755 firmware/libraries/Adafruit_BME280_Library/library.properties create mode 100755 firmware/libraries/Adafruit_Unified_Sensor/Adafruit_Sensor.h create mode 100755 firmware/libraries/Adafruit_Unified_Sensor/README.md create mode 100755 firmware/libraries/Adafruit_Unified_Sensor/library.properties create mode 100755 firmware/libraries/ESP8266Influxdb/ESP8266Influxdb 2.cpp create mode 100755 firmware/libraries/ESP8266Influxdb/ESP8266Influxdb 2.h create mode 100755 firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.cpp create mode 100755 firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.h create mode 100755 firmware/libraries/ESP8266Influxdb/README 2.md create mode 100755 firmware/libraries/ESP8266Influxdb/README.md create mode 100755 firmware/libraries/ESP8266Influxdb/examples/influxdb_write/influxdb_write.ino create mode 100755 firmware/libraries/ESP8266Influxdb/keywords 2.txt create mode 100755 firmware/libraries/ESP8266Influxdb/keywords.txt create mode 100644 firmware/libraries/ESP8266_Influxdb/CHANGELOG.md create mode 100644 firmware/libraries/ESP8266_Influxdb/LICENSE create mode 100644 firmware/libraries/ESP8266_Influxdb/README.md create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/BasicWrite/BasicWrite.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/Buckets/Buckets.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/QueryAggregated/QueryAggregated.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/QueryParams/QueryParams.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/QueryTable/QueryTable.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/SecureBatchWrite/SecureBatchWrite.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/examples/SecureWrite/SecureWrite.ino create mode 100644 firmware/libraries/ESP8266_Influxdb/keywords.txt create mode 100644 firmware/libraries/ESP8266_Influxdb/library.properties create mode 100644 firmware/libraries/ESP8266_Influxdb/platformio.ini create mode 100644 firmware/libraries/ESP8266_Influxdb/src/BucketsClient.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/BucketsClient.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/HTTPService.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/HTTPService.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxData.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxData.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxDb.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxDb.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxDbClient.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxDbClient.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/InfluxDbCloud.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/Options.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/Options.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/Platform.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/Point.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/Point.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/Version.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/WritePrecision.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/CsvReader.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/CsvReader.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/FluxParser.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/FluxParser.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/FluxTypes.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/FluxTypes.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/HttpStreamScanner.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/HttpStreamScanner.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/Params.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/query/Params.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/util/debug.h create mode 100644 firmware/libraries/ESP8266_Influxdb/src/util/helpers.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/src/util/helpers.h create mode 100644 firmware/libraries/ESP8266_Influxdb/test/E2ETest.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/test/E2ETest.h create mode 100644 firmware/libraries/ESP8266_Influxdb/test/Test.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/test/Test.h create mode 100644 firmware/libraries/ESP8266_Influxdb/test/TestBase.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/test/TestBase.h create mode 100644 firmware/libraries/ESP8266_Influxdb/test/TestSupport.cpp create mode 100644 firmware/libraries/ESP8266_Influxdb/test/TestSupport.h create mode 100644 firmware/libraries/ESP8266_Influxdb/test/customSettings.h create mode 100644 firmware/libraries/ESP8266_Influxdb/test/server/Readme.md create mode 100644 firmware/libraries/ESP8266_Influxdb/test/server/package.json create mode 100644 firmware/libraries/ESP8266_Influxdb/test/server/server.js create mode 100644 firmware/libraries/ESP8266_Influxdb/test/server/yarn.lock create mode 100644 firmware/libraries/ESP8266_Influxdb/test/test.ino create mode 100755 firmware/libraries/WiFi/README.adoc create mode 100755 firmware/libraries/WiFi/examples/ConnectNoEncryption/ConnectNoEncryption.ino create mode 100755 firmware/libraries/WiFi/examples/ConnectWithWEP/ConnectWithWEP.ino create mode 100755 firmware/libraries/WiFi/examples/ConnectWithWPA/ConnectWithWPA.ino create mode 100755 firmware/libraries/WiFi/examples/ScanNetworks/ScanNetworks.ino create mode 100755 firmware/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino create mode 100755 firmware/libraries/WiFi/examples/WiFiChatServer/WiFiChatServer.ino create mode 100755 firmware/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino create mode 100755 firmware/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino create mode 100755 firmware/libraries/WiFi/examples/WiFiWebClient/WiFiWebClient.ino create mode 100755 firmware/libraries/WiFi/examples/WiFiWebClientRepeating/WiFiWebClientRepeating.ino create mode 100755 firmware/libraries/WiFi/examples/WiFiWebServer/WiFiWebServer.ino create mode 100755 firmware/libraries/WiFi/extras/binary/wifiHD.elf create mode 100755 firmware/libraries/WiFi/extras/binary/wifiHD.hex create mode 100755 firmware/libraries/WiFi/extras/binary/wifiHD_2_1.elf create mode 100755 firmware/libraries/WiFi/extras/binary/wifi_dnld.elf create mode 100755 firmware/libraries/WiFi/extras/binary/wifi_dnld.hex create mode 100755 firmware/libraries/WiFi/extras/binary/wifi_dnld_2_1.elf create mode 100755 firmware/libraries/WiFi/extras/scripts/ArduinoWifiShield_upgrade.sh create mode 100755 firmware/libraries/WiFi/extras/wifiHD/.cproject create mode 100755 firmware/libraries/WiFi/extras/wifiHD/.cproject 2 create mode 100755 firmware/libraries/WiFi/extras/wifiHD/.project create mode 100755 firmware/libraries/WiFi/extras/wifiHD/.project 2 create mode 100755 firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.elf create mode 100755 firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.hex create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_access.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_at45dbx.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_sd_mmc_spi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_sdio_v2.7.0.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_spi_v2.7.0.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_wl_sta_intwpa_v2.7.0.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_sdio_v2.7.0.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_spi_v2.7.0.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_wl_sta_intwpa_v2.7.0.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/revision 2.txt create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/revision.txt create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_api 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_api.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_os 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_os.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_sdio 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_sdio.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_spi 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_spi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wlap_api 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wlap_api.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER/cycle_counter 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER/cycle_counter.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dhcp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dhcp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dns 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dns.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/init 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/init.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/autoip 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/autoip.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/icmp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/icmp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/igmp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/igmp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet_chksum 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet_chksum.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_addr 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_addr.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_frag 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_frag.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/mem 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/mem.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/memp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/memp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/netif 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/netif.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/pbuf 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/pbuf.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/raw 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/raw.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/stats 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/stats.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_in 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_in.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_out 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_out.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/udp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/udp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/autoip 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/autoip.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/icmp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/icmp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/igmp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/igmp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet_chksum 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet_chksum.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_addr 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_addr.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_frag 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_frag.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api_msg 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api_msg.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/arch 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/arch.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/debug 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/debug.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/def 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/def.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dhcp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dhcp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dns 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dns.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/err 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/err.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/init 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/init.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/mem 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/mem.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp_std 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp_std.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netbuf 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netbuf.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netdb 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netdb.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netif 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netif.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netifapi 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netifapi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/opt 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/opt.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/pbuf 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/pbuf.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/raw 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/raw.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sio 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sio.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_asn1 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_asn1.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_msg 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_msg.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_structs 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_structs.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sockets 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sockets.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/stats 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/stats.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sys 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sys.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcpip 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcpip.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/udp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/udp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/etharp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/etharp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/loopif 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/loopif.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/ppp_oe 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/ppp_oe.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/slipif 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/slipif.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/etharp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/etharp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/loopif 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/loopif.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/cc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/cc.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/perf 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/perf.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/lwipopts 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/lwipopts.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/netif/wlif 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/netif/wlif.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/netif/wlif 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/netif/wlif.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/readme 2.txt create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/readme.txt create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/compiler 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/parts 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/parts.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_spi 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_spi 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_utils 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_utils 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/avr32_spi 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/avr32_spi.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/board_init 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/board_init 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/board_init.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/board_init.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/console 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/console 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/console.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/console.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/debug 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/debug.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/fw_download 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/fw_download.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/fw_download_extflash 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/fw_download_extflash.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/license 2.txt create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/license.txt create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/lwipopts 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/lwipopts.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/main 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/main.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/nvram 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/nvram 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/nvram.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/nvram.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/owl_os 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/owl_os.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ping 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ping 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ping.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/ping.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/timer 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/timer 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/timer.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/timer.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/top_defs 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/top_defs.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/trace 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/trace.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/util 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/util 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/util.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/util.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wifi_spi 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wifi_spi.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wl_cm 2.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wl_cm 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.c create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wl_definitions 2.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/src/wl_definitions.h create mode 100755 firmware/libraries/WiFi/extras/wifiHD/wifiHD.cproj create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/.cproject create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/.cproject 2 create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/.project create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/.project 2 create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/Release/wifi_dnld.elf create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_access.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_at45dbx.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/SPB104 product brief.pdf create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/gettingstarted.pdf create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/ASM/.trampoline 2.x.icloud create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.ori create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/.exception 2.x.icloud create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/.libnewlib_addons-at32ucr2-speed_opt 2.a.icloud create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/compiler 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/parts 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/parts.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/clocks 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/clocks 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/flash_fw 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/flash_fw.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/license 2.txt create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/license.txt create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/startup 2.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/startup 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/startup.c create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/startup.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/wl_fw 2.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/src/wl_fw.h create mode 100755 firmware/libraries/WiFi/extras/wifi_dnld/wifi_dnld.cproj create mode 100755 firmware/libraries/WiFi/extras/wifishield.atsln create mode 100755 firmware/libraries/WiFi/keywords 2.txt create mode 100755 firmware/libraries/WiFi/keywords.txt create mode 100755 firmware/libraries/WiFi/library.properties create mode 100755 firmware/libraries/WiFi/src/WiFi 2.cpp create mode 100755 firmware/libraries/WiFi/src/WiFi 2.h create mode 100755 firmware/libraries/WiFi/src/WiFi.cpp create mode 100755 firmware/libraries/WiFi/src/WiFi.h create mode 100755 firmware/libraries/WiFi/src/WiFiClient 2.cpp create mode 100755 firmware/libraries/WiFi/src/WiFiClient 2.h create mode 100755 firmware/libraries/WiFi/src/WiFiClient.cpp create mode 100755 firmware/libraries/WiFi/src/WiFiClient.h create mode 100755 firmware/libraries/WiFi/src/WiFiServer 2.cpp create mode 100755 firmware/libraries/WiFi/src/WiFiServer 2.h create mode 100755 firmware/libraries/WiFi/src/WiFiServer.cpp create mode 100755 firmware/libraries/WiFi/src/WiFiServer.h create mode 100755 firmware/libraries/WiFi/src/WiFiUdp 2.cpp create mode 100755 firmware/libraries/WiFi/src/WiFiUdp 2.h create mode 100755 firmware/libraries/WiFi/src/WiFiUdp.cpp create mode 100755 firmware/libraries/WiFi/src/WiFiUdp.h create mode 100755 firmware/libraries/WiFi/src/utility/debug.h create mode 100755 firmware/libraries/WiFi/src/utility/server_drv.cpp create mode 100755 firmware/libraries/WiFi/src/utility/server_drv.h create mode 100755 firmware/libraries/WiFi/src/utility/spi_drv.cpp create mode 100755 firmware/libraries/WiFi/src/utility/spi_drv.h create mode 100755 firmware/libraries/WiFi/src/utility/wifi_drv.cpp create mode 100755 firmware/libraries/WiFi/src/utility/wifi_drv.h create mode 100755 firmware/libraries/WiFi/src/utility/wifi_spi.h create mode 100755 firmware/libraries/WiFi/src/utility/wl_definitions.h create mode 100755 firmware/libraries/WiFi/src/utility/wl_types.h create mode 100644 firmware/libraries/WiFiManager/LICENSE create mode 100644 firmware/libraries/WiFiManager/README.md create mode 100644 firmware/libraries/WiFiManager/WiFiManager.cpp create mode 100644 firmware/libraries/WiFiManager/WiFiManager.h create mode 100644 firmware/libraries/WiFiManager/examples/Advanced/Advanced.ino create mode 100644 firmware/libraries/WiFiManager/examples/Basic/Basic.ino create mode 100644 firmware/libraries/WiFiManager/examples/NonBlocking/AutoConnectNonBlocking/AutoConnectNonBlocking.ino create mode 100644 firmware/libraries/WiFiManager/examples/NonBlocking/AutoConnectNonBlockingwParams/AutoConnectNonBlockingwParams.ino create mode 100644 firmware/libraries/WiFiManager/examples/NonBlocking/OnDemandNonBlocking/onDemandNonBlocking.ino create mode 100644 firmware/libraries/WiFiManager/examples/Old_examples/AutoConnectWithFeedback/AutoConnectWithFeedback.ino create mode 100644 firmware/libraries/WiFiManager/examples/Old_examples/AutoConnectWithReset/AutoConnectWithReset.ino create mode 100644 firmware/libraries/WiFiManager/examples/Old_examples/AutoConnectWithStaticIP/AutoConnectWithStaticIP.ino create mode 100644 firmware/libraries/WiFiManager/examples/Old_examples/AutoConnectWithTimeout/AutoConnectWithTimeout.ino create mode 100644 firmware/libraries/WiFiManager/examples/OnDemand/OnDemandConfigPortal/OnDemandConfigPortal.ino create mode 100644 firmware/libraries/WiFiManager/examples/OnDemand/OnDemandWebPortal/onDemandWebPortal.ino create mode 100644 firmware/libraries/WiFiManager/examples/Parameters/LittleFS/LittleFSParameters.ino create mode 100644 firmware/libraries/WiFiManager/examples/Parameters/SPIFFS/AutoConnectWithFSParameters/AutoConnectWithFSParameters.ino create mode 100644 firmware/libraries/WiFiManager/examples/Parameters/SPIFFS/AutoConnectWithFSParametersAndCustomIP/AutoConnectWithFSParametersAndCustomIP.ino create mode 100644 firmware/libraries/WiFiManager/examples/ParamsChildClass/ParamsChildClass.ino create mode 100644 firmware/libraries/WiFiManager/examples/Super/OnDemandConfigPortal/OnDemandConfigPortal.ino create mode 100644 firmware/libraries/WiFiManager/examples/Unique/cb/AnonymousCB.ino create mode 100644 firmware/libraries/WiFiManager/extras/WiFiManager.template.html create mode 100644 firmware/libraries/WiFiManager/extras/parse.js create mode 100644 firmware/libraries/WiFiManager/extras/png_signal_strength_master.png create mode 100644 firmware/libraries/WiFiManager/extras/template.h create mode 100644 firmware/libraries/WiFiManager/extras/test.html create mode 100644 firmware/libraries/WiFiManager/keywords.txt create mode 100644 firmware/libraries/WiFiManager/library.json create mode 100644 firmware/libraries/WiFiManager/library.properties create mode 100644 firmware/libraries/WiFiManager/strings_en.h create mode 100644 firmware/libraries/WiFiManager/travis/common.sh diff --git a/firmware/libraries/APDS9930-master/.gitattributes b/firmware/libraries/APDS9930-master/.gitattributes new file mode 100755 index 0000000..412eeda --- /dev/null +++ b/firmware/libraries/APDS9930-master/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/firmware/libraries/APDS9930-master/.gitignore b/firmware/libraries/APDS9930-master/.gitignore new file mode 100755 index 0000000..2778edb --- /dev/null +++ b/firmware/libraries/APDS9930-master/.gitignore @@ -0,0 +1,192 @@ +################# +## SparkFun Useful stuff +################# + +## AVR Development +*.eep +*.elf +*.lst +*.lss +*.sym +*.d +*.o +*.srec +*.map + +## Notepad++ backup files +*.bak + +## BOM files +*bom* + +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +############# +## Eagle +############# + +# Ignore the board and schematic backup files +*.b#? +*.s#? + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/firmware/libraries/APDS9930-master/LICENSE b/firmware/libraries/APDS9930-master/LICENSE new file mode 100755 index 0000000..9d6e5b5 --- /dev/null +++ b/firmware/libraries/APDS9930-master/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Davide Depau + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/firmware/libraries/APDS9930-master/README.md b/firmware/libraries/APDS9930-master/README.md new file mode 100755 index 0000000..ce60370 --- /dev/null +++ b/firmware/libraries/APDS9930-master/README.md @@ -0,0 +1,92 @@ +APDS9930 Ambient Light and Proximity sensor +=========================================== + +This is a fork of the [library from Sparkfun for the APDS-9960 sensor](https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor). It has been adapted to read values from this other model. + +[**Quick-start guide available here**](https://web.archive.org/web/20151224052223/http://davideddu.org/blog/posts/apds-9930-arduino-quickstart/) + +[**Purchase an Avago APDS-9930 Breakout Board here**](http://www.dx.com/p/384037?Utm_rid=14976370&Utm_source=affiliate) + + +# DO NOT EMAIL ME IF YOU HAVE AN ISSUE +It will be deleted without reading. If you have an issue, [create an issue](https://github.com/Depau/APDS9930/issues) here on GitHub. + +# Unmaintained +I'm not going to maintain this library any more. I will merge pull requests, though. Contributions are welcome. Just don't expect anything from me. + +![Avago APDS-9930 Breakout Board](http://img.dxcdn.com/productimages/sku_384037_1.jpg) + +**Note:** even though it says APDS-9960, it's an APDS-9930. That's how I ended up getting one of those. I wanted the RGB sensor. I found this crap in my mailbox. But I decided to write a library for it anyways ;) + +Getting Started +--------------- + +* Download the Git repository as a ZIP ("Download ZIP" button) +* Unzip +* Copy the entire library directory (APDS-9930) to +\/libraries +* Open the Arduino program +* Select File -> Examples -> APDS9930 -> GestureTest +* Plug in your Arduino and APDS-9930 with the following connections + +*-OR-* + +* Use the library manager + +| Arduino Pin | APDS-9930 Board | Function | +|---|---|---| +| 3.3V | VCC | Power | +| GND | GND | Ground | +| A4 | SDA | I²C Data | +| A5 | SCL | I²C Clock | +| 2 | INT | Interrupt | + +*P.S.: you already know you can't use this purple little thing with your 5V Arduino without a level shifter, right? :) In case you don't have a level shifter, you can detach the microcontroller from an Arduino Uno, reconnect the oscillator pins, the RX and TX pins, the reset and the LED/SCK pins back to the board with some jumper wires. You can then power the microcontroller from a 3.3V source (the 3V3 output on the board should work) and connect the sensor directly to the MCU. Look up "Arduino on Breadboard".* + +* Go to Tools -> Board and select your Arduino board +* Go to Tools -> Serial Port and select the COM port of your Arduino board +* Click "Upload" +* Go to Tools -> Serial Monitor +* Ensure the baud rate is set at 9600 baud +* Swipe your hand over the sensor in various directions! + +Repository Contents +------------------- + +* **/examples** - Example sketches for the library (.ino). Run these from the Arduino IDE. +* **/extras** - Additional documentation for the user. These files are ignored by the IDE. +* **/src** - Source files for the library (.cpp, .h). +* **keywords.txt** - Keywords from this library that will be highlighted in the Arduino IDE. +* **library.properties** - General library properties for the Arduino package manager. + +Documentation +-------------- + +* **[Quickstart Guide](https://web.archive.org/web/20151224052223/http://davideddu.org/blog/posts/apds-9930-arduino-quickstart/)** - Basic hookup guide for the sensor. +* **[Product Repository](https://github.com/Davideddu/APDS9930)** - Main repository (including hardware files) for the APDS9930 ambient light and proximity sensor. +* **[Installing an Arduino Library Guide](https://learn.sparkfun.com/tutorials/installing-an-arduino-library)** - Basic information on how to install an Arduino library. + + +Version History +--------------- +* master - Adapted for use with APDS-9930 +* [V_1.4.0](https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor_Arduino_Library/tree/V_1.4.0) - Updated to new library structure +* V_1.3.0 - Implemented disableProximitySensor(). Thanks to jmg5150 for catching that! +* V_1.2.0 - Added pinMode line to GestureTest demo to fix interrupt bug with some Arduinos +* V_1.1.0 - Updated GestureTest demo to not freeze with fast swipes +* V_1.0.0: Initial release +* Ambient and RGB light sensing implemented +* Ambient light interrupts working +* Proximity sensing implemented +* Proximity interrupts working + +License Information +------------------- + +This product is _**open source**_! + +Please use, reuse, and modify these files as you see fit. Please maintain attribution to SparkFun Electronics and release anything derivative under the same license. + +Distributed as-is; no warranty is given. + +- Your friends at SparkFun. And Davide Depau :* diff --git a/firmware/libraries/APDS9930-master/examples/AmbientLightInterrupt/AmbientLightInterrupt.ino b/firmware/libraries/APDS9930-master/examples/AmbientLightInterrupt/AmbientLightInterrupt.ino new file mode 100755 index 0000000..2c44b52 --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/AmbientLightInterrupt/AmbientLightInterrupt.ino @@ -0,0 +1,180 @@ +/**************************************************************** +AmbientLightInterrupt.ino +APDS-9930 RGB and Gesture Sensor +Shawn Hymel @ SparkFun Electronics +October 24, 2014 +https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor + +Tests the ambient light interrupt abilities of the APDS-9930. +Configures the APDS-9930 over I2C and waits for an external +interrupt based on high or low light conditions. Try covering +the sensor with your hand or bringing the sensor close to a +bright light source. You might need to adjust the LIGHT_INT_HIGH +and LIGHT_INT_LOW values to get the interrupt to work correctly. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + 2 INT Interrupt + 13 - LED + +Resources: +Include Wire.h and APDS9930.h + +Development environment specifics: +Written in Arduino 1.0.5 +Tested with SparkFun Arduino Pro Mini 3.3V + +This code is beerware; if you see me (or any other SparkFun +employee) at the local, and you've found our code helpful, please +buy us a round! + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define DUMP_REGS + +#include +#include + +// Pins +#define APDS9930_INT 2 // Needs to be an interrupt pin +#define LED_PIN 13 // LED for showing interrupt + +// Constants +#define LIGHT_INT_HIGH 1000 // High light level for interrupt +#define LIGHT_INT_LOW 10 // Low light level for interrupt + +// Global variables +APDS9930 apds = APDS9930(); +float ambient_light = 0; +uint16_t ch0 = 0; +uint16_t ch1 = 1; +volatile bool isr_flag = false; +uint16_t threshold = 0; + +void setup() { + + // Set LED as output + pinMode(LED_PIN, OUTPUT); + pinMode(APDS9930_INT, INPUT); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("----------------------------")); + Serial.println(F("APDS-9930 - Light Interrupts")); + Serial.println(F("----------------------------")); + + // Initialize interrupt service routine + attachInterrupt(0, interruptRoutine, FALLING); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // Set high and low interrupt thresholds + if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) { + Serial.println(F("Error writing low threshold")); + } + if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) { + Serial.println(F("Error writing high threshold")); + } + + // Start running the APDS-9930 light sensor (no interrupts) + if ( apds.enableLightSensor(false) ) { + Serial.println(F("Light sensor is now running")); + } else { + Serial.println(F("Something went wrong during light sensor init!")); + } + + // Read high and low interrupt thresholds + if ( !apds.getLightIntLowThreshold(threshold) ) { + Serial.println(F("Error reading low threshold")); + } else { + Serial.print(F("Low Threshold: ")); + Serial.println(threshold); + } + if ( !apds.getLightIntHighThreshold(threshold) ) { + Serial.println(F("Error reading high threshold")); + } else { + Serial.print(F("High Threshold: ")); + Serial.println(threshold); + } + + // Enable interrupts + if ( !apds.setAmbientLightIntEnable(1) ) { + Serial.println(F("Error enabling interrupts")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif + + // Wait for initialization and calibration to finish + delay(500); +} + +void loop() { + + // If interrupt occurs, print out the light levels + if ( isr_flag ) { + + // Read the light levels (ambient, red, green, blue) and print + if ( !apds.readAmbientLightLux(ambient_light) || + !apds.readCh0Light(ch0) || + !apds.readCh1Light(ch1) ) { + Serial.println("Error reading light values"); + } else { + Serial.print("Interrupt! Ambient: "); + Serial.print(ambient_light); + Serial.print(F(" Ch0: ")); + Serial.print(ch0); + Serial.print(F(" Ch1: ")); + Serial.println(ch1); + } + + // Turn on LED for a half a second + digitalWrite(LED_PIN, HIGH); + delay(500); + digitalWrite(LED_PIN, LOW); + + // Reset flag and clear APDS-9930 interrupt (IMPORTANT!) + isr_flag = false; + if ( !apds.clearAmbientLightInt() ) { + Serial.println("Error clearing interrupt"); + } + + } +} + +void interruptRoutine() { + isr_flag = true; +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/examples/AmbientLightLED/AmbientLightLED.ino b/firmware/libraries/APDS9930-master/examples/AmbientLightLED/AmbientLightLED.ino new file mode 100755 index 0000000..1cd8869 --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/AmbientLightLED/AmbientLightLED.ino @@ -0,0 +1,113 @@ +/**************************************************************** +AmbientLightLED.ino + +Tests the ambient light sensing abilities of the +APDS-9930. Configures APDS-9930 over I2C and polls the sensor for +ambient light levels, which are displayed over the +serial console. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + + 10 (pwm) LED anode + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define PWM_LED_PIN 10 +#define DUMP_REGS + +#include +#include + +// Global Variables +APDS9930 apds = APDS9930(); +float ambient_light = 0; // can also be an unsigned long +uint16_t ch0 = 0; +uint16_t ch1 = 1; +float max_light = 0; + +void setup() { + //analogReference(EXTERNAL); + pinMode(PWM_LED_PIN, OUTPUT); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("--------------------------------")); + Serial.println(F("APDS-9930 - Ambient light sensor")); + Serial.println(F("--------------------------------")); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // Start running the APDS-9930 light sensor (no interrupts) + if ( apds.enableLightSensor(false) ) { + Serial.println(F("Light sensor is now running")); + } else { + Serial.println(F("Something went wrong during light sensor init!")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif + + // Wait for initialization and calibration to finish + delay(500); +} + +void loop() { + + // Read the light levels (ambient, red, green, blue) + if ( !apds.readAmbientLightLux(ambient_light) || + !apds.readCh0Light(ch0) || + !apds.readCh1Light(ch1) ) { + Serial.println(F("Error reading light values")); + } else { + Serial.print(F("Ambient: ")); + Serial.print(ambient_light); + Serial.print(F(" Ch0: ")); + Serial.print(ch0); + Serial.print(F(" Ch1: ")); + Serial.println(ch1); + + if ( ambient_light > max_light ) { + max_light = ambient_light; + } + ambient_light = map(ambient_light, 0, max_light, 0, 1023); + analogWrite(PWM_LED_PIN, ambient_light); + + } + + // Wait 1 second before next reading + delay(50); +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/examples/AmbientLightSensor/AmbientLightSensor.ino b/firmware/libraries/APDS9930-master/examples/AmbientLightSensor/AmbientLightSensor.ino new file mode 100755 index 0000000..9d390fe --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/AmbientLightSensor/AmbientLightSensor.ino @@ -0,0 +1,120 @@ +/**************************************************************** +AmbientLightSensor.ino +APDS-9930 Ambient light and proximity sensor +Davide Depau +December 11, 2015 +https://github.com/Davideddu/APDS9930 + +Shawn Hymel @ SparkFun Electronics +October 15, 2014 +https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor + +Tests thembient light sensing abilities of the +APDS-9930. Configures APDS-9930 over I2C and polls the sensor for +ambient light levels, which are displayed over the +serial console. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + +Resources: +Include Wire.h and APDS-9930.h + +Development environment specifics: +Written in Arduino 1.6.5 +Tested with Arduino Uno and Mega. + +This code is beerware; if you see me (or any other SparkFun +employee) at the local, and you've found our code helpful, please +buy us a round! + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define DUMP_REGS + +#include +#include + +// Global Variables +APDS9930 apds = APDS9930(); +float ambient_light = 0; // can also be an unsigned long +uint16_t ch0 = 0; +uint16_t ch1 = 1; + +void setup() { + //analogReference(EXTERNAL); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("--------------------------------")); + Serial.println(F("APDS-9930 - Ambient light sensor")); + Serial.println(F("--------------------------------")); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // Start running the APDS-9930 light sensor (no interrupts) + if ( apds.enableLightSensor(false) ) { + Serial.println(F("Light sensor is now running")); + } else { + Serial.println(F("Something went wrong during light sensor init!")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif + + // Wait for initialization and calibration to finish + delay(500); +} + +void loop() { + + // Read the light levels (ambient, red, green, blue) + if ( !apds.readAmbientLightLux(ambient_light) || + !apds.readCh0Light(ch0) || + !apds.readCh1Light(ch1) ) { + Serial.println(F("Error reading light values")); + } else { + Serial.print(F("Ambient: ")); + Serial.print(ambient_light); + Serial.print(F(" Ch0: ")); + Serial.print(ch0); + Serial.print(F(" Ch1: ")); + Serial.println(ch1); + } + + // Wait 1 second before next reading + delay(1000); +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/examples/AmbientLightToneAC/AmbientLightToneAC.ino b/firmware/libraries/APDS9930-master/examples/AmbientLightToneAC/AmbientLightToneAC.ino new file mode 100755 index 0000000..ff369b3 --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/AmbientLightToneAC/AmbientLightToneAC.ino @@ -0,0 +1,108 @@ +/**************************************************************** +AmbientLightToneAC.ino + +Tests the ambient light sensing abilities of the +APDS-9930. Configures APDS-9930 over I2C and polls the sensor for +ambient light levels, which are displayed over the +serial console. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + +Connect speakers to the correct pins. Check toneAC.h for more info. + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define DUMP_REGS + +#include +#include +#include + +// Global Variables +APDS9930 apds = APDS9930(); +float ambient_light = 0; // can also be an unsigned long +uint16_t ch0 = 0; +uint16_t ch1 = 1; +float max_light = 0; + +void setup() { + //analogReference(EXTERNAL); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("--------------------------------")); + Serial.println(F("APDS-9930 - Ambient light sensor")); + Serial.println(F("--------------------------------")); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // Start running the APDS-9930 light sensor (no interrupts) + if ( apds.enableLightSensor(false) ) { + Serial.println(F("Light sensor is now running")); + } else { + Serial.println(F("Something went wrong during light sensor init!")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif + + // Wait for initialization and calibration to finish + delay(500); +} + +void loop() { + + // Read the light levels (ambient, red, green, blue) + if ( !apds.readAmbientLightLux(ambient_light) || + !apds.readCh0Light(ch0) || + !apds.readCh1Light(ch1) ) { + Serial.println(F("Error reading light values")); + } else { + Serial.print(F("Ambient: ")); + Serial.print(ambient_light); + Serial.print(F(" Ch0: ")); + Serial.print(ch0); + Serial.print(F(" Ch1: ")); + Serial.println(ch1); + + unsigned long freq = map(ch0, 0, 1024, 60, 16000); + toneAC(freq, 10, 50, true); + } + + // Wait 1 second before next reading + delay(50); +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/examples/ProximityInterrupt/ProximityInterrupt.ino b/firmware/libraries/APDS9930-master/examples/ProximityInterrupt/ProximityInterrupt.ino new file mode 100755 index 0000000..b93e914 --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/ProximityInterrupt/ProximityInterrupt.ino @@ -0,0 +1,157 @@ +/**************************************************************** +ProximityInterrupt.ino +APDS-9930 Ambient light and proximity sensor +Davide Depau +December 11, 2015 +https://github.com/Davideddu/APDS9930 + +Shawn Hymel @ SparkFun Electronics +October 24, 2014 +https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor + +Tests the proximity interrupt abilities of the APDS-9930. +Configures the APDS-9930 over I2C and waits for an external +interrupt based on high or low proximity conditions. Move your +hand near the sensor and watch the LED on pin 13. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + 2 INT Interrupt + 13 - LED + +Resources: +Include Wire.h and APDS9930.h + +Development environment specifics: +Written in Arduino 1.6.5 +Tested with Arduino Uno and Mega + +This code is beerware; if you see me (or any other SparkFun +employee) at the local, and you've found our code helpful, please +buy us a round! + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define DUMP_REGS + +#include +#include + +// Pins +#define APDS9930_INT 2 // Needs to be an interrupt pin +#define LED_PIN 13 // LED for showing interrupt + +// Constants +#define PROX_INT_HIGH 600 // Proximity level for interrupt +#define PROX_INT_LOW 0 // No far interrupt + +// Global variables +APDS9930 apds = APDS9930(); +uint16_t proximity_data = 0; +volatile bool isr_flag = false; + +void setup() { + + // Set LED as output + pinMode(LED_PIN, OUTPUT); + pinMode(APDS9930_INT, INPUT); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("------------------------------")); + Serial.println(F("APDS-9930 - ProximityInterrupt")); + Serial.println(F("------------------------------")); + + // Initialize interrupt service routine + attachInterrupt(0, interruptRoutine, FALLING); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // Adjust the Proximity sensor gain + if ( !apds.setProximityGain(PGAIN_2X) ) { + Serial.println(F("Something went wrong trying to set PGAIN")); + } + + // Set proximity interrupt thresholds + if ( !apds.setProximityIntLowThreshold(PROX_INT_LOW) ) { + Serial.println(F("Error writing low threshold")); + } + if ( !apds.setProximityIntHighThreshold(PROX_INT_HIGH) ) { + Serial.println(F("Error writing high threshold")); + } + + // Start running the APDS-9930 proximity sensor (interrupts) + if ( apds.enableProximitySensor(true) ) { + Serial.println(F("Proximity sensor is now running")); + } else { + Serial.println(F("Something went wrong during sensor init!")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif + +} + +void loop() { + + // If interrupt occurs, print out the proximity level + if ( isr_flag ) { + + // Read proximity level and print it out + if ( !apds.readProximity(proximity_data) ) { + Serial.println("Error reading proximity value"); + } else { + Serial.print("Proximity detected! Level: "); + Serial.println(proximity_data); + } + + // Turn on LED for a half a second + digitalWrite(LED_PIN, HIGH); + delay(500); + digitalWrite(LED_PIN, LOW); + + // Reset flag and clear APDS-9930 interrupt (IMPORTANT!) + isr_flag = false; + if ( !apds.clearProximityInt() ) { + Serial.println("Error clearing interrupt"); + } + + } +} + +void interruptRoutine() { + isr_flag = true; +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/examples/ProximityLED/ProximityLED.ino b/firmware/libraries/APDS9930-master/examples/ProximityLED/ProximityLED.ino new file mode 100755 index 0000000..1694b4e --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/ProximityLED/ProximityLED.ino @@ -0,0 +1,131 @@ +/**************************************************************** +ProximityLED.ino +Davide Depau +December 11, 2015 +https://github.com/Davideddu/APDS9930 + +https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor + +Tests the proximity sensing abilities of the APDS-9930. +Configures the APDS-9930 over I2C and polls for the distance to +the object nearest the sensor, then turns on an LED accordingly. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + + 10 (PWM) LED Anode + +Resources: +Include Wire.h and APDS9930.h + +Development environment specifics: +Written in Sublime Text + Stino + Arduino 1.7.2 +Tested with Arduino Uno + level shifter + +This code is chocolateware; if you see me at the grocery store, +and you've found our code helpful, please buy us me a chocolate bar! :D + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define DUMP_REGS +#define PWM_LED_PIN 10 + +#include +#include + +// Global Variables +APDS9930 apds = APDS9930(); +uint16_t proximity_data = 0; +int proximity_max = 0; + +void setup() { + //analogReference(EXTERNAL); + pinMode(PWM_LED_PIN, OUTPUT); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("------------------------")); + Serial.println(F("APDS-9930 - ProximityLED")); + Serial.println(F("------------------------")); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // Adjust the Proximity sensor gain + if ( !apds.setProximityGain(PGAIN_1X) ) { + Serial.println(F("Something went wrong trying to set PGAIN")); + } + + // Start running the APDS-9930 proximity sensor (no interrupts) + if ( apds.enableProximitySensor(false) ) { + Serial.println(F("Proximity sensor is now running")); + } else { + Serial.println(F("Something went wrong during sensor init!")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif +} + +void loop() { + + // Read the proximity value + if ( !apds.readProximity(proximity_data) ) { + Serial.println("Error reading proximity value"); + } else { + Serial.print("Proximity: "); + Serial.print(proximity_data); + + // This is an ugly hack to reduce sensor noise. + // You may want to adjust POFFSET instead. + /* + proximity_data -= 200; + if (proximity_data > 50000) { + proximity_data = 0; + } + if (proximity_data > proximity_max) { + proximity_max = proximity_data; + } + proximity_data = map(proximity_data, 0, proximity_max, 0, 1023); + */ + + Serial.print(F(" Remapped: ")); + Serial.println(proximity_data); + analogWrite(PWM_LED_PIN, proximity_data); + } + + // Wait 250 ms before next reading + delay(10); +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/examples/ProximitySensor/ProximitySensor.ino b/firmware/libraries/APDS9930-master/examples/ProximitySensor/ProximitySensor.ino new file mode 100755 index 0000000..1fe2054 --- /dev/null +++ b/firmware/libraries/APDS9930-master/examples/ProximitySensor/ProximitySensor.ino @@ -0,0 +1,113 @@ +/**************************************************************** +ProximitySensor.ino +APDS-9930 ambient light and proximity sensor +Davide Depau +December 11, 2015 +https://github.com/Davideddu/APDS9930 + +Shawn Hymel @ SparkFun Electronics +October 28, 2014 +https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor + +Tests the proximity sensing abilities of the APDS-9930. +Configures the APDS-9930 over I2C and polls for the distance to +the object nearest the sensor. + +Hardware Connections: + +IMPORTANT: The APDS-9930 can only accept 3.3V! + + Arduino Pin APDS-9930 Board Function + + 3.3V VCC Power + GND GND Ground + A4 SDA I2C Data + A5 SCL I2C Clock + +Resources: +Include Wire.h and SparkFun_APDS-9930.h + +Development environment specifics: +Written in Arduino 1.0.5 +Tested with SparkFun Arduino Pro Mini 3.3V + +This code is beerware; if you see me (or any other SparkFun +employee) at the local, and you've found our code helpful, please +buy us a round! + +Distributed as-is; no warranty is given. +****************************************************************/ + +#define DUMP_REGS + +#include +#include + +// Global Variables +APDS9930 apds = APDS9930(); +uint16_t proximity_data = 0; + +void setup() { + //analogReference(EXTERNAL); + + // Initialize Serial port + Serial.begin(9600); + Serial.println(); + Serial.println(F("---------------------------")); + Serial.println(F("APDS-9930 - ProximitySensor")); + Serial.println(F("---------------------------")); + + // Initialize APDS-9930 (configure I2C and initial values) + if ( apds.init() ) { + Serial.println(F("APDS-9930 initialization complete")); + } else { + Serial.println(F("Something went wrong during APDS-9930 init!")); + } + + // // Adjust the Proximity sensor gain + // if ( !apds.setProximityGain(PGAIN_2X) ) { + // Serial.println(F("Something went wrong trying to set PGAIN")); + // } + + // Start running the APDS-9930 proximity sensor (no interrupts) + if ( apds.enableProximitySensor(false) ) { + Serial.println(F("Proximity sensor is now running")); + } else { + Serial.println(F("Something went wrong during sensor init!")); + } + +#ifdef DUMP_REGS + /* Register dump */ + uint8_t reg; + uint8_t val; + + for(reg = 0x00; reg <= 0x19; reg++) { + if( (reg != 0x10) && \ + (reg != 0x11) ) + { + apds.wireReadDataByte(reg, val); + Serial.print(reg, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); + } + } + apds.wireReadDataByte(0x1E, val); + Serial.print(0x1E, HEX); + Serial.print(": 0x"); + Serial.println(val, HEX); +#endif +} + +void loop() { + + // Read the proximity value + if ( !apds.readProximity(proximity_data) ) { + Serial.println("Error reading proximity value"); + } else { + Serial.print("Proximity: "); + Serial.println(proximity_data); + } + + // Wait 250 ms before next reading + delay(250); +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/keywords.txt b/firmware/libraries/APDS9930-master/keywords.txt new file mode 100755 index 0000000..e69de29 diff --git a/firmware/libraries/APDS9930-master/library.properties b/firmware/libraries/APDS9930-master/library.properties new file mode 100755 index 0000000..7487b16 --- /dev/null +++ b/firmware/libraries/APDS9930-master/library.properties @@ -0,0 +1,9 @@ +name=APDS-9930 Ambient Light and Proximity Sensor +version=1.5.1 +author=Davide Depau +maintainer=Davide Depau +sentence=Library for the Avago APDS-9930 sensor +paragraph=This library works with the breakout board for the Avago APDS-9930 proximity and light sensor +category=Sensors +url=https://github.com/Davideddu/APDS9930 +architectures=* diff --git a/firmware/libraries/APDS9930-master/src/APDS9930.cpp b/firmware/libraries/APDS9930-master/src/APDS9930.cpp new file mode 100755 index 0000000..ccfd0ff --- /dev/null +++ b/firmware/libraries/APDS9930-master/src/APDS9930.cpp @@ -0,0 +1,1147 @@ +/** + * @file APDS-9930.cpp + * @brief Library for the SparkFun APDS-9930 breakout board + * @author Shawn Hymel (SparkFun Electronics) + * + * @copyright This code is public domain but you buy me a beer if you use + * this and we meet someday (Beerware license). + * + * This library interfaces the Avago APDS-9930 to Arduino over I2C. The library + * relies on the Arduino Wire (I2C) library. to use the library, instantiate an + * APDS9930 object, call init(), and call the appropriate functions. + * + * APDS-9930 current draw tests (default parameters): + * Off: 1mA + * Waiting for gesture: 14mA + * Gesture in progress: 35mA + */ + + #include + #include + + #include "APDS9930.h" + +/** + * @brief Constructor - Instantiates APDS9930 object + */ +APDS9930::APDS9930() +{ + +} + +/** + * @brief Destructor + */ +APDS9930::~APDS9930() +{ + +} + +/** + * @brief Configures I2C communications and initializes registers to defaults + * + * @return True if initialized successfully. False otherwise. + */ +bool APDS9930::init() +{ + uint8_t id; + + /* Initialize I2C */ + Wire.begin(); + + /* Read ID register and check against known values for APDS-9930 */ + if( !wireReadDataByte(APDS9930_ID, id) ) { + Serial.println(F("ID read")); + return false; + } + if( !(id == APDS9930_ID_1 || id == APDS9930_ID_2) ) { + Serial.println(F("ID check")); + Serial.println(String("ID is ") + String(id, HEX)); + //return false; + } + + /* Set ENABLE register to 0 (disable all features) */ + if( !setMode(ALL, OFF) ) { + Serial.println(F("Regs off")); + return false; + } + + /* Set default values for ambient light and proximity registers */ + if( !wireWriteDataByte(APDS9930_ATIME, DEFAULT_ATIME) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_WTIME, DEFAULT_WTIME) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_PPULSE, DEFAULT_PPULSE) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_POFFSET, DEFAULT_POFFSET) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_CONFIG, DEFAULT_CONFIG) ) { + return false; + } + if( !setLEDDrive(DEFAULT_PDRIVE) ) { + return false; + } + if( !setProximityGain(DEFAULT_PGAIN) ) { + return false; + } + if( !setAmbientLightGain(DEFAULT_AGAIN) ) { + return false; + } + if( !setProximityDiode(DEFAULT_PDIODE) ) { + return false; + } + if( !setProximityIntLowThreshold(DEFAULT_PILT) ) { + return false; + } + if( !setProximityIntHighThreshold(DEFAULT_PIHT) ) { + return false; + } + if( !setLightIntLowThreshold(DEFAULT_AILT) ) { + return false; + } + if( !setLightIntHighThreshold(DEFAULT_AIHT) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_PERS, DEFAULT_PERS) ) { + return false; + } + + return true; +} + +/******************************************************************************* + * Public methods for controlling the APDS-9930 + ******************************************************************************/ + +/** + * @brief Reads and returns the contents of the ENABLE register + * + * @return Contents of the ENABLE register. 0xFF if error. + */ +uint8_t APDS9930::getMode() +{ + uint8_t enable_value; + + /* Read current ENABLE register */ + if( !wireReadDataByte(APDS9930_ENABLE, enable_value) ) { + return ERROR; + } + + return enable_value; +} + +/** + * @brief Enables or disables a feature in the APDS-9930 + * + * @param[in] mode which feature to enable + * @param[in] enable ON (1) or OFF (0) + * @return True if operation success. False otherwise. + */ +bool APDS9930::setMode(uint8_t mode, uint8_t enable) +{ + uint8_t reg_val; + + /* Read current ENABLE register */ + reg_val = getMode(); + if( reg_val == ERROR ) { + return false; + } + + /* Change bit(s) in ENABLE register */ + enable = enable & 0x01; + if( mode >= 0 && mode <= 6 ) { + if (enable) { + reg_val |= (1 << mode); + } else { + reg_val &= ~(1 << mode); + } + } else if( mode == ALL ) { + if (enable) { + reg_val = 0x7F; + } else { + reg_val = 0x00; + } + } + + /* Write value back to ENABLE register */ + if( !wireWriteDataByte(APDS9930_ENABLE, reg_val) ) { + return false; + } + + return true; +} + +/** + * @brief Starts the light (Ambient/IR) sensor on the APDS-9930 + * + * @param[in] interrupts true to enable hardware interrupt on high or low light + * @return True if sensor enabled correctly. False on error. + */ +bool APDS9930::enableLightSensor(bool interrupts) +{ + + /* Set default gain, interrupts, enable power, and enable sensor */ + if( !setAmbientLightGain(DEFAULT_AGAIN) ) { + return false; + } + if( interrupts ) { + if( !setAmbientLightIntEnable(1) ) { + return false; + } + } else { + if( !setAmbientLightIntEnable(0) ) { + return false; + } + } + if( !enablePower() ){ + return false; + } + if( !setMode(AMBIENT_LIGHT, 1) ) { + return false; + } + + return true; + +} + +/** + * @brief Ends the light sensor on the APDS-9930 + * + * @return True if sensor disabled correctly. False on error. + */ +bool APDS9930::disableLightSensor() +{ + if( !setAmbientLightIntEnable(0) ) { + return false; + } + if( !setMode(AMBIENT_LIGHT, 0) ) { + return false; + } + + return true; +} + +/** + * @brief Starts the proximity sensor on the APDS-9930 + * + * @param[in] interrupts true to enable hardware external interrupt on proximity + * @return True if sensor enabled correctly. False on error. + */ +bool APDS9930::enableProximitySensor(bool interrupts) +{ + /* Set default gain, LED, interrupts, enable power, and enable sensor */ + if( !setProximityGain(DEFAULT_PGAIN) ) { + return false; + } + if( !setLEDDrive(DEFAULT_PDRIVE) ) { + return false; + } + if( interrupts ) { + if( !setProximityIntEnable(1) ) { + return false; + } + } else { + if( !setProximityIntEnable(0) ) { + return false; + } + } + if( !enablePower() ){ + return false; + } + if( !setMode(PROXIMITY, 1) ) { + return false; + } + + return true; +} + +/** + * @brief Ends the proximity sensor on the APDS-9930 + * + * @return True if sensor disabled correctly. False on error. + */ +bool APDS9930::disableProximitySensor() +{ + if( !setProximityIntEnable(0) ) { + return false; + } + if( !setMode(PROXIMITY, 0) ) { + return false; + } + + return true; +} + +/** + * Turn the APDS-9930 on + * + * @return True if operation successful. False otherwise. + */ +bool APDS9930::enablePower() +{ + if( !setMode(POWER, 1) ) { + return false; + } + + return true; +} + +/** + * Turn the APDS-9930 off + * + * @return True if operation successful. False otherwise. + */ +bool APDS9930::disablePower() +{ + if( !setMode(POWER, 0) ) { + return false; + } + + return true; +} + +/******************************************************************************* + * Ambient light sensor controls + ******************************************************************************/ + +/** + * @brief Reads the ambient (clear) light level as a 16-bit value + * + * @param[out] val value of the light sensor. + * @return True if operation successful. False otherwise. + */ +bool APDS9930::readAmbientLightLux(float &val) +{ + uint16_t Ch0; + uint16_t Ch1; + + /* Read value from channel 0 */ + if( !readCh0Light(Ch0) ) { + return false; + } + + /* Read value from channel 1 */ + if( !readCh1Light(Ch1) ) { + return false; + } + + val = floatAmbientToLux(Ch0, Ch1); + return true; +} + +bool APDS9930::readAmbientLightLux(unsigned long &val) +{ + uint16_t Ch0; + uint16_t Ch1; + + /* Read value from channel 0 */ + if( !readCh0Light(Ch0) ) { + return false; + } + + /* Read value from channel 1 */ + if( !readCh1Light(Ch1) ) { + return false; + } + + val = ulongAmbientToLux(Ch0, Ch1); + return true; +} + +float APDS9930::floatAmbientToLux(uint16_t Ch0, uint16_t Ch1) +{ + uint8_t x[4]={1,8,16,120}; + float ALSIT = 2.73 * (256 - DEFAULT_ATIME); + float iac = max(Ch0 - B * Ch1, C * Ch0 - D * Ch1); + if (iac < 0) iac = 0; + float lpc = GA * DF / (ALSIT * x[getAmbientLightGain()]); + return iac * lpc; +} + +unsigned long APDS9930::ulongAmbientToLux(uint16_t Ch0, uint16_t Ch1) +{ + uint8_t x[4]={1,8,16,120}; + unsigned long ALSIT = 2.73 * (256 - DEFAULT_ATIME); + unsigned long iac = max(Ch0 - B * Ch1, C * Ch0 - D * Ch1); + if (iac < 0) iac = 0; + unsigned long lpc = GA * DF / (ALSIT * x[getAmbientLightGain()]); + return iac * lpc; +} + +bool APDS9930::readCh0Light(uint16_t &val) +{ + uint8_t val_byte; + val = 0; + + /* Read value from channel 0 */ + if( !wireReadDataByte(APDS9930_Ch0DATAL, val_byte) ) { + return false; + } + val = val_byte; + if( !wireReadDataByte(APDS9930_Ch0DATAH, val_byte) ) { + return false; + } + val += ((uint16_t)val_byte << 8); + return true; +} + +bool APDS9930::readCh1Light(uint16_t &val) +{ + uint8_t val_byte; + val = 0; + + /* Read value from channel 0 */ + if( !wireReadDataByte(APDS9930_Ch1DATAL, val_byte) ) { + return false; + } + val = val_byte; + if( !wireReadDataByte(APDS9930_Ch1DATAH, val_byte) ) { + return false; + } + val += ((uint16_t)val_byte << 8); + return true; +} + +/******************************************************************************* + * Proximity sensor controls + ******************************************************************************/ + +/** + * @brief Reads the proximity level as an 8-bit value + * + * @param[out] val value of the proximity sensor. + * @return True if operation successful. False otherwise. + */ +bool APDS9930::readProximity(uint16_t &val) +{ + val = 0; + uint8_t val_byte; + + /* Read value from proximity data register */ + if( !wireReadDataByte(APDS9930_PDATAL, val_byte) ) { + return false; + } + val = val_byte; + if( !wireReadDataByte(APDS9930_PDATAH, val_byte) ) { + return false; + } + val += ((uint16_t)val_byte << 8); + + return true; +} + +/******************************************************************************* + * Getters and setters for register values + ******************************************************************************/ + +/** + * @brief Returns the lower threshold for proximity detection + * + * @return lower threshold + */ +uint16_t APDS9930::getProximityIntLowThreshold() +{ + uint16_t val; + uint8_t val_byte; + + /* Read value from PILT register */ + if( !wireReadDataByte(APDS9930_PILTL, val_byte) ) { + val = 0; + } + val = val_byte; + if( !wireReadDataByte(APDS9930_PILTH, val_byte) ) { + val = 0; + } + val |= ((uint16_t)val_byte << 8); + + return val; +} + +/** + * @brief Sets the lower threshold for proximity detection + * + * @param[in] threshold the lower proximity threshold + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setProximityIntLowThreshold(uint16_t threshold) +{ + uint8_t lo; + uint8_t hi; + hi = threshold >> 8; + lo = threshold & 0x00FF; + + if( !wireWriteDataByte(APDS9930_PILTL, lo) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_PILTH, hi) ) { + return false; + } + + return true; +} + +/** + * @brief Returns the high threshold for proximity detection + * + * @return high threshold + */ +uint16_t APDS9930::getProximityIntHighThreshold() +{ + uint16_t val; + uint8_t val_byte; + + /* Read value from PILT register */ + if( !wireReadDataByte(APDS9930_PIHTL, val_byte) ) { + val = 0; + } + val = val_byte; + if( !wireReadDataByte(APDS9930_PIHTH, val_byte) ) { + val = 0; + } + val |= ((uint16_t)val_byte << 8); + + return val; +} + +/** + * @brief Sets the high threshold for proximity detection + * + * @param[in] threshold the high proximity threshold + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setProximityIntHighThreshold(uint16_t threshold) +{ + uint8_t lo; + uint8_t hi; + hi = threshold >> 8; + lo = threshold & 0x00FF; + + if( !wireWriteDataByte(APDS9930_PIHTL, lo) ) { + return false; + } + if( !wireWriteDataByte(APDS9930_PIHTH, hi) ) { + return false; + } + + return true; +} + +/** + * @brief Returns LED drive strength for proximity and ALS + * + * Value LED Current + * 0 100 mA + * 1 50 mA + * 2 25 mA + * 3 12.5 mA + * + * @return the value of the LED drive strength. 0xFF on failure. + */ +uint8_t APDS9930::getLEDDrive() +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return ERROR; + } + + /* Shift and mask out LED drive bits */ + val = (val >> 6) & 0b00000011; + + return val; +} + +/** + * @brief Sets the LED drive strength for proximity and ALS + * + * Value LED Current + * 0 100 mA + * 1 50 mA + * 2 25 mA + * 3 12.5 mA + * + * @param[in] drive the value (0-3) for the LED drive strength + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setLEDDrive(uint8_t drive) +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + /* Set bits in register to given value */ + drive &= 0b00000011; + drive = drive << 6; + val &= 0b00111111; + val |= drive; + + /* Write register value back into CONTROL register */ + if( !wireWriteDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + return true; +} + +/** + * @brief Returns receiver gain for proximity detection + * + * Value Gain + * 0 1x + * 1 2x + * 2 4x + * 3 8x + * + * @return the value of the proximity gain. 0xFF on failure. + */ +uint8_t APDS9930::getProximityGain() +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return ERROR; + } + + /* Shift and mask out PDRIVE bits */ + val = (val >> 2) & 0b00000011; + + return val; +} + +/** + * @brief Sets the receiver gain for proximity detection + * + * Value Gain + * 0 1x + * 1 2x + * 2 4x + * 3 8x + * + * @param[in] drive the value (0-3) for the gain + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setProximityGain(uint8_t drive) +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + /* Set bits in register to given value */ + drive &= 0b00000011; + drive = drive << 2; + val &= 0b11110011; + val |= drive; + + /* Write register value back into CONTROL register */ + if( !wireWriteDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + return true; +} + +/** + * @brief Returns the proximity diode + * + * Value Diode selection + * 0 Reserved + * 1 Reserved + * 2 Use Ch1 diode + * 3 Reserved + * + * @return the selected diode. 0xFF on failure. + */ +uint8_t APDS9930::getProximityDiode() +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return ERROR; + } + + /* Shift and mask out PDRIVE bits */ + val = (val >> 4) & 0b00000011; + + return val; +} + +/** + * @brief Selects the proximity diode + * + * Value Diode selection + * 0 Reserved + * 1 Reserved + * 2 Use Ch1 diode + * 3 Reserved + * + * @param[in] drive the value (0-3) for the diode + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setProximityDiode(uint8_t drive) +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + /* Set bits in register to given value */ + drive &= 0b00000011; + drive = drive << 4; + val &= 0b11001111; + val |= drive; + + /* Write register value back into CONTROL register */ + if( !wireWriteDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + return true; +} + +/** + * @brief Returns receiver gain for the ambient light sensor (ALS) + * + * Value Gain + * 0 1x + * 1 4x + * 2 16x + * 3 120x + * + * @return the value of the ALS gain. 0xFF on failure. + */ +uint8_t APDS9930::getAmbientLightGain() +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return ERROR; + } + + /* Shift and mask out ADRIVE bits */ + val &= 0b00000011; + + return val; +} + +/** + * @brief Sets the receiver gain for the ambient light sensor (ALS) + * + * Value Gain + * 0 1x + * 1 4x + * 2 16x + * 3 64x + * + * @param[in] drive the value (0-3) for the gain + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setAmbientLightGain(uint8_t drive) +{ + uint8_t val; + + /* Read value from CONTROL register */ + if( !wireReadDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + /* Set bits in register to given value */ + drive &= 0b00000011; + val &= 0b11111100; + val |= drive; + + /* Write register value back into CONTROL register */ + if( !wireWriteDataByte(APDS9930_CONTROL, val) ) { + return false; + } + + return true; +} + +/** + * @brief Gets the low threshold for ambient light interrupts + * + * @param[out] threshold current low threshold stored on the APDS-9930 + * @return True if operation successful. False otherwise. + */ +bool APDS9930::getLightIntLowThreshold(uint16_t &threshold) +{ + uint8_t val_byte; + threshold = 0; + + /* Read value from ambient light low threshold, low byte register */ + if( !wireReadDataByte(APDS9930_AILTL, val_byte) ) { + return false; + } + threshold = val_byte; + + /* Read value from ambient light low threshold, high byte register */ + if( !wireReadDataByte(APDS9930_AILTH, val_byte) ) { + return false; + } + threshold = threshold + ((uint16_t)val_byte << 8); + + return true; +} + +/** + * @brief Sets the low threshold for ambient light interrupts + * + * @param[in] threshold low threshold value for interrupt to trigger + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setLightIntLowThreshold(uint16_t threshold) +{ + uint8_t val_low; + uint8_t val_high; + + /* Break 16-bit threshold into 2 8-bit values */ + val_low = threshold & 0x00FF; + val_high = (threshold & 0xFF00) >> 8; + + /* Write low byte */ + if( !wireWriteDataByte(APDS9930_AILTL, val_low) ) { + return false; + } + + /* Write high byte */ + if( !wireWriteDataByte(APDS9930_AILTH, val_high) ) { + return false; + } + + return true; +} + +/** + * @brief Gets the high threshold for ambient light interrupts + * + * @param[out] threshold current low threshold stored on the APDS-9930 + * @return True if operation successful. False otherwise. + */ +bool APDS9930::getLightIntHighThreshold(uint16_t &threshold) +{ + uint8_t val_byte; + threshold = 0; + + /* Read value from ambient light high threshold, low byte register */ + if( !wireReadDataByte(APDS9930_AIHTL, val_byte) ) { + return false; + } + threshold = val_byte; + + /* Read value from ambient light high threshold, high byte register */ + if( !wireReadDataByte(APDS9930_AIHTH, val_byte) ) { + return false; + } + threshold = threshold + ((uint16_t)val_byte << 8); + + return true; +} + +/** + * @brief Sets the high threshold for ambient light interrupts + * + * @param[in] threshold high threshold value for interrupt to trigger + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setLightIntHighThreshold(uint16_t threshold) +{ + uint8_t val_low; + uint8_t val_high; + + /* Break 16-bit threshold into 2 8-bit values */ + val_low = threshold & 0x00FF; + val_high = (threshold & 0xFF00) >> 8; + + /* Write low byte */ + if( !wireWriteDataByte(APDS9930_AIHTL, val_low) ) { + return false; + } + + /* Write high byte */ + if( !wireWriteDataByte(APDS9930_AIHTH, val_high) ) { + return false; + } + + return true; +} + + +/** + * @brief Gets if ambient light interrupts are enabled or not + * + * @return 1 if interrupts are enabled, 0 if not. 0xFF on error. + */ +uint8_t APDS9930::getAmbientLightIntEnable() +{ + uint8_t val; + + /* Read value from ENABLE register */ + if( !wireReadDataByte(APDS9930_ENABLE, val) ) { + return ERROR; + } + + /* Shift and mask out AIEN bit */ + val = (val >> 4) & 0b00000001; + + return val; +} + +/** + * @brief Turns ambient light interrupts on or off + * + * @param[in] enable 1 to enable interrupts, 0 to turn them off + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setAmbientLightIntEnable(uint8_t enable) +{ + uint8_t val; + + /* Read value from ENABLE register */ + if( !wireReadDataByte(APDS9930_ENABLE, val) ) { + return false; + } + + /* Set bits in register to given value */ + enable &= 0b00000001; + enable = enable << 4; + val &= 0b11101111; + val |= enable; + + /* Write register value back into ENABLE register */ + if( !wireWriteDataByte(APDS9930_ENABLE, val) ) { + return false; + } + + return true; +} + +/** + * @brief Gets if proximity interrupts are enabled or not + * + * @return 1 if interrupts are enabled, 0 if not. 0xFF on error. + */ +uint8_t APDS9930::getProximityIntEnable() +{ + uint8_t val; + + /* Read value from ENABLE register */ + if( !wireReadDataByte(APDS9930_ENABLE, val) ) { + return ERROR; + } + + /* Shift and mask out PIEN bit */ + val = (val >> 5) & 0b00000001; + + return val; +} + +/** + * @brief Turns proximity interrupts on or off + * + * @param[in] enable 1 to enable interrupts, 0 to turn them off + * @return True if operation successful. False otherwise. + */ +bool APDS9930::setProximityIntEnable(uint8_t enable) +{ + uint8_t val; + + /* Read value from ENABLE register */ + if( !wireReadDataByte(APDS9930_ENABLE, val) ) { + return false; + } + + /* Set bits in register to given value */ + enable &= 0b00000001; + enable = enable << 5; + val &= 0b11011111; + val |= enable; + + /* Write register value back into ENABLE register */ + if( !wireWriteDataByte(APDS9930_ENABLE, val) ) { + return false; + } + + return true; +} + +/** + * @brief Clears the ambient light interrupt + * + * @return True if operation completed successfully. False otherwise. + */ +bool APDS9930::clearAmbientLightInt() +{ + if( !wireWriteByte(CLEAR_ALS_INT) ) { + return false; + } + + return true; +} + +/** + * @brief Clears the proximity interrupt + * + * @return True if operation completed successfully. False otherwise. + */ +bool APDS9930::clearProximityInt() +{ + if( !wireWriteByte(CLEAR_PROX_INT) ) { + return false; + } + + return true; +} + +/** + * @brief Clears all interrupts + * + * @return True if operation completed successfully. False otherwise. + */ +bool APDS9930::clearAllInts() +{ + if( !wireWriteByte(CLEAR_ALL_INTS) ) { + return false; + } + + return true; +} + +/******************************************************************************* + * Raw I2C Reads and Writes + ******************************************************************************/ + +/** + * @brief Writes a single byte to the I2C device (no register) + * + * @param[in] val the 1-byte value to write to the I2C device + * @return True if successful write operation. False otherwise. + */ +bool APDS9930::wireWriteByte(uint8_t val) +{ + Wire.beginTransmission(APDS9930_I2C_ADDR); + Wire.write(val); + if( Wire.endTransmission() != 0 ) { + return false; + } + + return true; +} + +/** + * @brief Writes a single byte to the I2C device and specified register + * + * @param[in] reg the register in the I2C device to write to + * @param[in] val the 1-byte value to write to the I2C device + * @return True if successful write operation. False otherwise. + */ +bool APDS9930::wireWriteDataByte(uint8_t reg, uint8_t val) +{ + Wire.beginTransmission(APDS9930_I2C_ADDR); + Wire.write(reg | AUTO_INCREMENT); + Wire.write(val); + if( Wire.endTransmission() != 0 ) { + return false; + } + + return true; +} + +/** + * @brief Writes a block (array) of bytes to the I2C device and register + * + * @param[in] reg the register in the I2C device to write to + * @param[in] val pointer to the beginning of the data byte array + * @param[in] len the length (in bytes) of the data to write + * @return True if successful write operation. False otherwise. + */ +bool APDS9930::wireWriteDataBlock( uint8_t reg, + uint8_t *val, + unsigned int len) +{ + unsigned int i; + + Wire.beginTransmission(APDS9930_I2C_ADDR); + Wire.write(reg | AUTO_INCREMENT); + for(i = 0; i < len; i++) { + Wire.beginTransmission(APDS9930_I2C_ADDR); + Wire.write(val[i]); + } + if( Wire.endTransmission() != 0 ) { + return false; + } + + return true; +} + +/** + * @brief Reads a single byte from the I2C device and specified register + * + * @param[in] reg the register to read from + * @param[out] the value returned from the register + * @return True if successful read operation. False otherwise. + */ +bool APDS9930::wireReadDataByte(uint8_t reg, uint8_t &val) +{ + + /* Indicate which register we want to read from */ + if (!wireWriteByte(reg | AUTO_INCREMENT)) { + return false; + } + + /* Read from register */ + Wire.requestFrom(APDS9930_I2C_ADDR, 1); + while (Wire.available()) { + val = Wire.read(); + } + + return true; +} + + +/** + * @brief Reads a block (array) of bytes from the I2C device and register + * + * @param[in] reg the register to read from + * @param[out] val pointer to the beginning of the data + * @param[in] len number of bytes to read + * @return Number of bytes read. -1 on read error. + */ +int APDS9930::wireReadDataBlock( uint8_t reg, + uint8_t *val, + unsigned int len) +{ + unsigned char i = 0; + + /* Indicate which register we want to read from */ + if (!wireWriteByte(reg | AUTO_INCREMENT)) { + return -1; + } + + /* Read block data */ + Wire.requestFrom(APDS9930_I2C_ADDR, len); + while (Wire.available()) { + if (i >= len) { + return -1; + } + val[i] = Wire.read(); + i++; + } + + return i; +} \ No newline at end of file diff --git a/firmware/libraries/APDS9930-master/src/APDS9930.h b/firmware/libraries/APDS9930-master/src/APDS9930.h new file mode 100755 index 0000000..640544d --- /dev/null +++ b/firmware/libraries/APDS9930-master/src/APDS9930.h @@ -0,0 +1,231 @@ +/** + * @file APDS-9930.h + * @brief Library for the SparkFun APDS-9930 breakout board + * @author Shawn Hymel (SparkFun Electronics) + * + * @copyright This code is public domain but you buy me a beer if you use + * this and we meet someday (Beerware license). + * + * This library interfaces the Avago APDS-9930 to Arduino over I2C. The library + * relies on the Arduino Wire (I2C) library. to use the library, instantiate an + * APDS9930 object, call init(), and call the appropriate functions. + */ + +#ifndef APDS9930_H +#define APDS9930_H + +#include + +/* Debug */ +#define DEBUG 0 + +/* APDS-9930 I2C address */ +#define APDS9930_I2C_ADDR 0x39 + +/* Command register modes */ +#define REPEATED_BYTE 0x80 +#define AUTO_INCREMENT 0xA0 +#define SPECIAL_FN 0xE0 + +/* Error code for returned values */ +#define ERROR 0xFF + +/* Acceptable device IDs */ +#define APDS9930_ID_1 0x12 +#define APDS9930_ID_2 0x39 + +/* Misc parameters */ +#define FIFO_PAUSE_TIME 30 // Wait period (ms) between FIFO reads + +/* APDS-9930 register addresses */ +#define APDS9930_ENABLE 0x00 +#define APDS9930_ATIME 0x01 +#define APDS9930_PTIME 0x02 +#define APDS9930_WTIME 0x03 +#define APDS9930_AILTL 0x04 +#define APDS9930_AILTH 0x05 +#define APDS9930_AIHTL 0x06 +#define APDS9930_AIHTH 0x07 +#define APDS9930_PILTL 0x08 +#define APDS9930_PILTH 0x09 +#define APDS9930_PIHTL 0x0A +#define APDS9930_PIHTH 0x0B +#define APDS9930_PERS 0x0C +#define APDS9930_CONFIG 0x0D +#define APDS9930_PPULSE 0x0E +#define APDS9930_CONTROL 0x0F +#define APDS9930_ID 0x12 +#define APDS9930_STATUS 0x13 +#define APDS9930_Ch0DATAL 0x14 +#define APDS9930_Ch0DATAH 0x15 +#define APDS9930_Ch1DATAL 0x16 +#define APDS9930_Ch1DATAH 0x17 +#define APDS9930_PDATAL 0x18 +#define APDS9930_PDATAH 0x19 +#define APDS9930_POFFSET 0x1E + + +/* Bit fields */ +#define APDS9930_PON 0b00000001 +#define APDS9930_AEN 0b00000010 +#define APDS9930_PEN 0b00000100 +#define APDS9930_WEN 0b00001000 +#define APSD9930_AIEN 0b00010000 +#define APDS9930_PIEN 0b00100000 +#define APDS9930_SAI 0b01000000 + +/* On/Off definitions */ +#define OFF 0 +#define ON 1 + +/* Acceptable parameters for setMode */ +#define POWER 0 +#define AMBIENT_LIGHT 1 +#define PROXIMITY 2 +#define WAIT 3 +#define AMBIENT_LIGHT_INT 4 +#define PROXIMITY_INT 5 +#define SLEEP_AFTER_INT 6 +#define ALL 7 + +/* LED Drive values */ +#define LED_DRIVE_100MA 0 +#define LED_DRIVE_50MA 1 +#define LED_DRIVE_25MA 2 +#define LED_DRIVE_12_5MA 3 + +/* Proximity Gain (PGAIN) values */ +#define PGAIN_1X 0 +#define PGAIN_2X 1 +#define PGAIN_4X 2 +#define PGAIN_8X 3 + +/* ALS Gain (AGAIN) values */ +#define AGAIN_1X 0 +#define AGAIN_8X 1 +#define AGAIN_16X 2 +#define AGAIN_120X 3 + +/* Interrupt clear values */ +#define CLEAR_PROX_INT 0xE5 +#define CLEAR_ALS_INT 0xE6 +#define CLEAR_ALL_INTS 0xE7 + +/* Default values */ +#define DEFAULT_ATIME 0xED +#define DEFAULT_WTIME 0xFF +#define DEFAULT_PTIME 0xFF +#define DEFAULT_PPULSE 0x08 +#define DEFAULT_POFFSET 0 // 0 offset +#define DEFAULT_CONFIG 0 +#define DEFAULT_PDRIVE LED_DRIVE_100MA +#define DEFAULT_PDIODE 2 +#define DEFAULT_PGAIN PGAIN_8X +#define DEFAULT_AGAIN AGAIN_1X +#define DEFAULT_PILT 0 // Low proximity threshold +#define DEFAULT_PIHT 50 // High proximity threshold +#define DEFAULT_AILT 0xFFFF // Force interrupt for calibration +#define DEFAULT_AIHT 0 +#define DEFAULT_PERS 0x22 // 2 consecutive prox or ALS for int. + +/* ALS coefficients */ +#define DF 52 +#define GA 0.49 +#define B 1.862 +#define C 0.746 +#define D 1.291 + +/* State definitions */ +enum { + NOTAVAILABLE_STATE, + NEAR_STATE, + FAR_STATE, + ALL_STATE +}; + +#ifdef _AVR_IO_H_ + // Do not use this alias as it's deprecated + #define NA_STATE NOTAVAILABLE_STATE +#endif + +/* APDS9930 Class */ +class APDS9930 { +public: + + /* Initialization methods */ + APDS9930(); + ~APDS9930(); + bool init(); + uint8_t getMode(); + bool setMode(uint8_t mode, uint8_t enable); + + /* Turn the APDS-9930 on and off */ + bool enablePower(); + bool disablePower(); + + /* Enable or disable specific sensors */ + bool enableLightSensor(bool interrupts = false); + bool disableLightSensor(); + bool enableProximitySensor(bool interrupts = false); + bool disableProximitySensor(); + + /* LED drive strength control */ + uint8_t getLEDDrive(); + bool setLEDDrive(uint8_t drive); + // uint8_t getGestureLEDDrive(); + // bool setGestureLEDDrive(uint8_t drive); + + /* Gain control */ + uint8_t getAmbientLightGain(); + bool setAmbientLightGain(uint8_t gain); + uint8_t getProximityGain(); + bool setProximityGain(uint8_t gain); + bool setProximityDiode(uint8_t drive); + uint8_t getProximityDiode(); + + + /* Get and set light interrupt thresholds */ + bool getLightIntLowThreshold(uint16_t &threshold); + bool setLightIntLowThreshold(uint16_t threshold); + bool getLightIntHighThreshold(uint16_t &threshold); + bool setLightIntHighThreshold(uint16_t threshold); + + /* Get and set interrupt enables */ + uint8_t getAmbientLightIntEnable(); + bool setAmbientLightIntEnable(uint8_t enable); + uint8_t getProximityIntEnable(); + bool setProximityIntEnable(uint8_t enable); + + /* Clear interrupts */ + bool clearAmbientLightInt(); + bool clearProximityInt(); + bool clearAllInts(); + + /* Proximity methods */ + bool readProximity(uint16_t &val); + + /* Ambient light methods */ + bool readAmbientLightLux(float &val); + bool readAmbientLightLux(unsigned long &val); + float floatAmbientToLux(uint16_t Ch0, uint16_t Ch1); + unsigned long ulongAmbientToLux(uint16_t Ch0, uint16_t Ch1); + bool readCh0Light(uint16_t &val); + bool readCh1Light(uint16_t &val); + +//private: + + /* Proximity Interrupt Threshold */ + uint16_t getProximityIntLowThreshold(); + bool setProximityIntLowThreshold(uint16_t threshold); + uint16_t getProximityIntHighThreshold(); + bool setProximityIntHighThreshold(uint16_t threshold); + + /* Raw I2C Commands */ + bool wireWriteByte(uint8_t val); + bool wireWriteDataByte(uint8_t reg, uint8_t val); + bool wireWriteDataBlock(uint8_t reg, uint8_t *val, unsigned int len); + bool wireReadDataByte(uint8_t reg, uint8_t &val); + int wireReadDataBlock(uint8_t reg, uint8_t *val, unsigned int len); +}; + +#endif diff --git a/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp b/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp new file mode 100755 index 0000000..8650b33 --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp @@ -0,0 +1,726 @@ +/*! + * @file Adafruit_APDS9960.cpp + * + * @mainpage Adafruit APDS9960 Proximity, Light, RGB, and Gesture Sensor + * + * @section author Author + * + * Ladyada, Dean Miller (Adafruit Industries) + * + * @section license License + * + * Software License Agreement (BSD License) + * + * Copyright (c) 2017, Adafruit Industries + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __AVR +#include +#elif defined(ESP8266) +#include +#endif +#include +#include + +#include "Adafruit_APDS9960.h" + +/*! + * @brief Implements missing powf function + * @param x + * Base number + * @param y + * Exponent + * @return x raised to the power of y + */ +float powf(const float x, const float y) { + return (float)(pow((double)x, (double)y)); +} + +/*! + * @brief Enables the device + * Disables the device (putting it in lower power sleep mode) + * @param en + * Enable (True/False) + */ +void Adafruit_APDS9960::enable(boolean en) { + _enable.PON = en; + this->write8(APDS9960_ENABLE, _enable.get()); +} + +/*! + * @brief Initializes I2C and configures the sensor + * @param iTimeMS + * Integration time + * @param aGain + * Gain + * @param addr + * I2C address + * @param *theWire + * Wire object + * @return True if initialization was successful, otherwise false. + */ +boolean Adafruit_APDS9960::begin(uint16_t iTimeMS, apds9960AGain_t aGain, + uint8_t addr, TwoWire *theWire) { + _wire = theWire; + _i2c_init(); + _i2caddr = addr; + + /* Make sure we're actually connected */ + uint8_t x = read8(APDS9960_ID); + if (x != 0xAB) { + return false; + } + + /* Set default integration time and gain */ + setADCIntegrationTime(iTimeMS); + setADCGain(aGain); + + // disable everything to start + enableGesture(false); + enableProximity(false); + enableColor(false); + + disableColorInterrupt(); + disableProximityInterrupt(); + clearInterrupt(); + + /* Note: by default, the device is in power down mode on bootup */ + enable(false); + delay(10); + enable(true); + delay(10); + + // default to all gesture dimensions + setGestureDimensions(APDS9960_DIMENSIONS_ALL); + setGestureFIFOThreshold(APDS9960_GFIFO_4); + setGestureGain(APDS9960_GGAIN_4); + setGestureProximityThreshold(50); + resetCounts(); + + _gpulse.GPLEN = APDS9960_GPULSE_32US; + _gpulse.GPULSE = 9; // 10 pulses + this->write8(APDS9960_GPULSE, _gpulse.get()); + + return true; +} + +/*! + * @brief Sets the integration time for the ADC of the APDS9960, in millis + * @param iTimeMS + * Integration time + */ +void Adafruit_APDS9960::setADCIntegrationTime(uint16_t iTimeMS) { + float temp; + + // convert ms into 2.78ms increments + temp = iTimeMS; + temp /= 2.78; + temp = 256 - temp; + if (temp > 255) + temp = 255; + if (temp < 0) + temp = 0; + + /* Update the timing register */ + write8(APDS9960_ATIME, (uint8_t)temp); +} + +/*! + * @brief Returns the integration time for the ADC of the APDS9960, in millis + * @return Integration time + */ +float Adafruit_APDS9960::getADCIntegrationTime() { + float temp; + + temp = read8(APDS9960_ATIME); + + // convert to units of 2.78 ms + temp = 256 - temp; + temp *= 2.78; + return temp; +} + +/*! + * @brief Adjusts the color/ALS gain on the APDS9960 (adjusts the sensitivity + * to light) + * @param aGain + * Gain + */ +void Adafruit_APDS9960::setADCGain(apds9960AGain_t aGain) { + _control.AGAIN = aGain; + + /* Update the timing register */ + write8(APDS9960_CONTROL, _control.get()); +} + +/*! + * @brief Returns the ADC gain + * @return ADC gain + */ +apds9960AGain_t Adafruit_APDS9960::getADCGain() { + return (apds9960AGain_t)(read8(APDS9960_CONTROL) & 0x03); +} + +/*! + * @brief Adjusts the Proximity gain on the APDS9960 + * @param pGain + * Gain + */ +void Adafruit_APDS9960::setProxGain(apds9960PGain_t pGain) { + _control.PGAIN = pGain; + + /* Update the timing register */ + write8(APDS9960_CONTROL, _control.get()); +} + +/*! + * @brief Returns the Proximity gain on the APDS9960 + * @return Proxmity gain + */ +apds9960PGain_t Adafruit_APDS9960::getProxGain() { + return (apds9960PGain_t)(read8(APDS9960_CONTROL) & 0x0C); +} + +/*! + * @brief Sets number of proxmity pulses + * @param pLen + * Pulse Length + * @param pulses + * Number of pulses + */ +void Adafruit_APDS9960::setProxPulse(apds9960PPulseLen_t pLen, uint8_t pulses) { + if (pulses < 1) + pulses = 1; + if (pulses > 64) + pulses = 64; + pulses--; + + _ppulse.PPLEN = pLen; + _ppulse.PPULSE = pulses; + + write8(APDS9960_PPULSE, _ppulse.get()); +} + +/*! + * @brief Enable proximity readings on APDS9960 + * @param en + * Enable (True/False) + */ +void Adafruit_APDS9960::enableProximity(boolean en) { + _enable.PEN = en; + + write8(APDS9960_ENABLE, _enable.get()); +} + +/*! + * @brief Enable proximity interrupts + */ +void Adafruit_APDS9960::enableProximityInterrupt() { + _enable.PIEN = 1; + write8(APDS9960_ENABLE, _enable.get()); + clearInterrupt(); +} + +/*! + * @brief Disable proximity interrupts + */ +void Adafruit_APDS9960::disableProximityInterrupt() { + _enable.PIEN = 0; + write8(APDS9960_ENABLE, _enable.get()); +} + +/*! + * @brief Set proxmity interrupt thresholds + * @param low + * Low threshold + * @param high + * High threshold + * @param persistance + * Persistance + */ +void Adafruit_APDS9960::setProximityInterruptThreshold(uint8_t low, + uint8_t high, + uint8_t persistance) { + write8(APDS9960_PILT, low); + write8(APDS9960_PIHT, high); + + if (persistance > 7) + persistance = 7; + _pers.PPERS = persistance; + write8(APDS9960_PERS, _pers.get()); +} + +/*! + * @brief Returns proxmity interrupt status + * @return True if enabled, false otherwise. + */ +bool Adafruit_APDS9960::getProximityInterrupt() { + _status.set(this->read8(APDS9960_STATUS)); + return _status.PINT; +}; + +/*! + * @brief Read proximity data + * @return Proximity + */ +uint8_t Adafruit_APDS9960::readProximity() { return read8(APDS9960_PDATA); } + +/*! + * @brief Returns validity status of a gesture + * @return Status (True/False) + */ +bool Adafruit_APDS9960::gestureValid() { + _gstatus.set(this->read8(APDS9960_GSTATUS)); + return _gstatus.GVALID; +} + +/*! + * @brief Sets gesture dimensions + * @param dims + * Dimensions (APDS9960_DIMENSIONS_ALL, APDS9960_DIMENSIONS_UP_DOWM, + * APDS9960_DIMENSIONS_UP_DOWN, APGS9960_DIMENSIONS_LEFT_RIGHT) + */ +void Adafruit_APDS9960::setGestureDimensions(uint8_t dims) { + _gconf3.GDIMS = dims; + this->write8(APDS9960_GCONF3, _gconf3.get()); +} + +/*! + * @brief Sets gesture FIFO Threshold + * @param thresh + * Threshold (APDS9960_GFIFO_1, APDS9960_GFIFO_4, APDS9960_GFIFO_8, + * APDS9960_GFIFO_16) + */ +void Adafruit_APDS9960::setGestureFIFOThreshold(uint8_t thresh) { + _gconf1.GFIFOTH = thresh; + this->write8(APDS9960_GCONF1, _gconf1.get()); +} + +/*! + * @brief Sets gesture sensor gain + * @param gain + * Gain (APDS9960_GAIN_1, APDS9960_GAIN_2, APDS9960_GAIN_4, + * APDS9960_GAIN_8) + */ +void Adafruit_APDS9960::setGestureGain(uint8_t gain) { + _gconf2.GGAIN = gain; + this->write8(APDS9960_GCONF2, _gconf2.get()); +} + +/*! + * @brief Sets gesture sensor threshold + * @param thresh + * Threshold + */ +void Adafruit_APDS9960::setGestureProximityThreshold(uint8_t thresh) { + this->write8(APDS9960_GPENTH, thresh); +} + +/*! + * @brief Sets gesture sensor offset + * @param offset_up + * Up offset + * @param offset_down + * Down offset + * @param offset_left + * Left offset + * @param offset_right + * Right offset + */ +void Adafruit_APDS9960::setGestureOffset(uint8_t offset_up, uint8_t offset_down, + uint8_t offset_left, + uint8_t offset_right) { + this->write8(APDS9960_GOFFSET_U, offset_up); + this->write8(APDS9960_GOFFSET_D, offset_down); + this->write8(APDS9960_GOFFSET_L, offset_left); + this->write8(APDS9960_GOFFSET_R, offset_right); +} + +/*! + * @brief Enable gesture readings on APDS9960 + * @param en + * Enable (True/False) + */ +void Adafruit_APDS9960::enableGesture(boolean en) { + if (!en) { + _gconf4.GMODE = 0; + write8(APDS9960_GCONF4, _gconf4.get()); + } + _enable.GEN = en; + write8(APDS9960_ENABLE, _enable.get()); + resetCounts(); +} + +/*! + * @brief Resets gesture counts + */ +void Adafruit_APDS9960::resetCounts() { + gestCnt = 0; + UCount = 0; + DCount = 0; + LCount = 0; + RCount = 0; +} + +/*! + * @brief Reads gesture + * @return Received gesture (APDS9960_DOWN APDS9960_UP, APDS9960_LEFT + * APDS9960_RIGHT) + */ +uint8_t Adafruit_APDS9960::readGesture() { + uint8_t toRead, bytesRead; + uint8_t buf[256]; + unsigned long t = 0; + uint8_t gestureReceived; + while (1) { + int up_down_diff = 0; + int left_right_diff = 0; + gestureReceived = 0; + if (!gestureValid()) + return 0; + + delay(30); + toRead = this->read8(APDS9960_GFLVL); + + // bytesRead is unused but produces sideffects needed for readGesture to work + bytesRead = this->read(APDS9960_GFIFO_U, buf, toRead); + + if (abs((int)buf[0] - (int)buf[1]) > 13) + up_down_diff += (int)buf[0] - (int)buf[1]; + + if (abs((int)buf[2] - (int)buf[3]) > 13) + left_right_diff += (int)buf[2] - (int)buf[3]; + + if (up_down_diff != 0) { + if (up_down_diff < 0) { + if (DCount > 0) { + gestureReceived = APDS9960_UP; + } else + UCount++; + } else if (up_down_diff > 0) { + if (UCount > 0) { + gestureReceived = APDS9960_DOWN; + } else + DCount++; + } + } + + if (left_right_diff != 0) { + if (left_right_diff < 0) { + if (RCount > 0) { + gestureReceived = APDS9960_LEFT; + } else + LCount++; + } else if (left_right_diff > 0) { + if (LCount > 0) { + gestureReceived = APDS9960_RIGHT; + } else + RCount++; + } + } + + if (up_down_diff != 0 || left_right_diff != 0) + t = millis(); + + if (gestureReceived || millis() - t > 300) { + resetCounts(); + return gestureReceived; + } + } +} + +/*! + * @brief Set LED brightness for proximity/gesture + * @param drive + * LED Drive + * @param boost + * LED Boost + */ +void Adafruit_APDS9960::setLED(apds9960LedDrive_t drive, + apds9960LedBoost_t boost) { + // set BOOST + _config2.LED_BOOST = boost; + write8(APDS9960_CONFIG2, _config2.get()); + + _control.LDRIVE = drive; + write8(APDS9960_CONTROL, _control.get()); +} + +/*! + * @brief Enable proximity readings on APDS9960 + * @param en + * Enable (True/False) + */ +void Adafruit_APDS9960::enableColor(boolean en) { + _enable.AEN = en; + write8(APDS9960_ENABLE, _enable.get()); +} + +/*! + * @brief Returns status of color data + * @return True if color data ready, False otherwise + */ +bool Adafruit_APDS9960::colorDataReady() { + _status.set(this->read8(APDS9960_STATUS)); + return _status.AVALID; +} + +/*! + * @brief Reads the raw red, green, blue and clear channel values + * @param *r + * Red value + * @param *g + * Green value + * @param *b + * Blue value + * @param *c + * Clear channel value + */ +void Adafruit_APDS9960::getColorData(uint16_t *r, uint16_t *g, uint16_t *b, + uint16_t *c) { + + *c = read16R(APDS9960_CDATAL); + *r = read16R(APDS9960_RDATAL); + *g = read16R(APDS9960_GDATAL); + *b = read16R(APDS9960_BDATAL); +} + +/*! + * @brief Converts the raw R/G/B values to color temperature in degrees Kelvin + * @param r + * Red value + * @param g + * Green value + * @param b + * Blue value + * @return Color temperature + */ +uint16_t Adafruit_APDS9960::calculateColorTemperature(uint16_t r, uint16_t g, + uint16_t b) { + float X, Y, Z; /* RGB to XYZ correlation */ + float xc, yc; /* Chromaticity co-ordinates */ + float n; /* McCamy's formula */ + float cct; + + /* 1. Map RGB values to their XYZ counterparts. */ + /* Based on 6500K fluorescent, 3000K fluorescent */ + /* and 60W incandescent values for a wide range. */ + /* Note: Y = Illuminance or lux */ + X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b); + Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b); + Z = (-0.68202F * r) + (0.77073F * g) + (0.56332F * b); + + /* 2. Calculate the chromaticity co-ordinates */ + xc = (X) / (X + Y + Z); + yc = (Y) / (X + Y + Z); + + /* 3. Use McCamy's formula to determine the CCT */ + n = (xc - 0.3320F) / (0.1858F - yc); + + /* Calculate the final CCT */ + cct = + (449.0F * powf(n, 3)) + (3525.0F * powf(n, 2)) + (6823.3F * n) + 5520.33F; + + /* Return the results in degrees Kelvin */ + return (uint16_t)cct; +} + +/*! + * @brief Calculate ambient light values + * @param r + * Red value + * @param g + * Green value + * @param b + * Blue value + * @return LUX value + */ +uint16_t Adafruit_APDS9960::calculateLux(uint16_t r, uint16_t g, uint16_t b) { + float illuminance; + + /* This only uses RGB ... how can we integrate clear or calculate lux */ + /* based exclusively on clear since this might be more reliable? */ + illuminance = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b); + + return (uint16_t)illuminance; +} + +/*! + * @brief Enables color interrupt + */ +void Adafruit_APDS9960::enableColorInterrupt() { + _enable.AIEN = 1; + write8(APDS9960_ENABLE, _enable.get()); +} + +/*! + * @brief Disables color interrupt + */ +void Adafruit_APDS9960::disableColorInterrupt() { + _enable.AIEN = 0; + write8(APDS9960_ENABLE, _enable.get()); +} + +/*! + * @brief Clears interrupt + */ +void Adafruit_APDS9960::clearInterrupt() { + this->write(APDS9960_AICLEAR, NULL, 0); +} + +/*! + * @brief Sets interrupt limits + * @param low + * Low limit + * @param high + * High limit + */ +void Adafruit_APDS9960::setIntLimits(uint16_t low, uint16_t high) { + write8(APDS9960_AILTIL, low & 0xFF); + write8(APDS9960_AILTH, low >> 8); + write8(APDS9960_AIHTL, high & 0xFF); + write8(APDS9960_AIHTH, high >> 8); +} + +/*! + * @brief Writes specified value to given register + * @param reg + * Register to write to + * @param value + * Value to write + */ +void Adafruit_APDS9960::write8(byte reg, byte value) { + this->write(reg, &value, 1); +} + +/*! + * @brief Reads 8 bits from specified register + * @param reg + * Register to write to + * @return Value in register + */ +uint8_t Adafruit_APDS9960::read8(byte reg) { + uint8_t ret; + this->read(reg, &ret, 1); + + return ret; +} + +/*! + * @brief Reads 32 bits from specified register + * @param reg + * Register to write to + * @return Value in register + */ +uint32_t Adafruit_APDS9960::read32(uint8_t reg) { + uint8_t ret[4]; + this->read(reg, ret, 4); + + return (ret[0] << 24) | (ret[1] << 16) | (ret[2] << 8) | ret[3]; +} + +/*! + * @brief Reads 16 bites from specified register + * @param reg + * Register to write to + * @return Value in register + */ +uint16_t Adafruit_APDS9960::read16(uint8_t reg) { + uint8_t ret[2]; + this->read(reg, ret, 2); + + return (ret[0] << 8) | ret[1]; +} + +/*! + * @brief Reads 16 bites from specified register + * @param reg + * Register to write to + * @return Value in register + */ +uint16_t Adafruit_APDS9960::read16R(uint8_t reg) { + uint8_t ret[2]; + this->read(reg, ret, 2); + + return (ret[1] << 8) | ret[0]; +} + +/*! + * @brief Begins I2C communication + */ +void Adafruit_APDS9960::_i2c_init() { _wire->begin(); } + +/*! + * @brief Reads num bytes from specified register into a given buffer + * @param reg + * Register + * @param *buf + * Buffer + * @param num + * Number of bytes + * @return Position after reading + */ +uint8_t Adafruit_APDS9960::read(uint8_t reg, uint8_t *buf, uint8_t num) { + uint8_t pos = 0; + bool eof = false; + + // on arduino we need to read in 32 byte chunks + while (pos < num && !eof) { + + uint8_t read_now = min(32, num - pos); + _wire->beginTransmission((uint8_t)_i2caddr); + _wire->write((uint8_t)reg + pos); + _wire->endTransmission(); + + _wire->requestFrom((uint8_t)_i2caddr, read_now); + + for (int i = 0; i < read_now; i++) { + if (!_wire->available()) { + eof = true; + break; + } + buf[pos] = _wire->read(); + pos++; + } + } + return pos; +} + +/*! + * @brief Writes num bytes from specified buffer into a given register + * @param reg + * Register + * @param *buf + * Buffer + * @param num + * Number of bytes + */ +void Adafruit_APDS9960::write(uint8_t reg, uint8_t *buf, uint8_t num) { + _wire->beginTransmission((uint8_t)_i2caddr); + _wire->write((uint8_t)reg); + _wire->write((uint8_t *)buf, num); + _wire->endTransmission(); +} diff --git a/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.h b/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.h new file mode 100755 index 0000000..1ba957d --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.h @@ -0,0 +1,531 @@ +/*! + * @file Adafruit_APDS9960.h + * + * Software License Agreement (BSD License) + * + * Copyright (c) 2017, Adafruit Industries + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _APDS9960_H_ +#define _APDS9960_H_ + +#include +#include + +#define APDS9960_ADDRESS (0x39) /**< I2C Address */ + +/** I2C Registers */ +enum { + APDS9960_RAM = 0x00, + APDS9960_ENABLE = 0x80, + APDS9960_ATIME = 0x81, + APDS9960_WTIME = 0x83, + APDS9960_AILTIL = 0x84, + APDS9960_AILTH = 0x85, + APDS9960_AIHTL = 0x86, + APDS9960_AIHTH = 0x87, + APDS9960_PILT = 0x89, + APDS9960_PIHT = 0x8B, + APDS9960_PERS = 0x8C, + APDS9960_CONFIG1 = 0x8D, + APDS9960_PPULSE = 0x8E, + APDS9960_CONTROL = 0x8F, + APDS9960_CONFIG2 = 0x90, + APDS9960_ID = 0x92, + APDS9960_STATUS = 0x93, + APDS9960_CDATAL = 0x94, + APDS9960_CDATAH = 0x95, + APDS9960_RDATAL = 0x96, + APDS9960_RDATAH = 0x97, + APDS9960_GDATAL = 0x98, + APDS9960_GDATAH = 0x99, + APDS9960_BDATAL = 0x9A, + APDS9960_BDATAH = 0x9B, + APDS9960_PDATA = 0x9C, + APDS9960_POFFSET_UR = 0x9D, + APDS9960_POFFSET_DL = 0x9E, + APDS9960_CONFIG3 = 0x9F, + APDS9960_GPENTH = 0xA0, + APDS9960_GEXTH = 0xA1, + APDS9960_GCONF1 = 0xA2, + APDS9960_GCONF2 = 0xA3, + APDS9960_GOFFSET_U = 0xA4, + APDS9960_GOFFSET_D = 0xA5, + APDS9960_GOFFSET_L = 0xA7, + APDS9960_GOFFSET_R = 0xA9, + APDS9960_GPULSE = 0xA6, + APDS9960_GCONF3 = 0xAA, + APDS9960_GCONF4 = 0xAB, + APDS9960_GFLVL = 0xAE, + APDS9960_GSTATUS = 0xAF, + APDS9960_IFORCE = 0xE4, + APDS9960_PICLEAR = 0xE5, + APDS9960_CICLEAR = 0xE6, + APDS9960_AICLEAR = 0xE7, + APDS9960_GFIFO_U = 0xFC, + APDS9960_GFIFO_D = 0xFD, + APDS9960_GFIFO_L = 0xFE, + APDS9960_GFIFO_R = 0xFF, +}; + +/** ADC gain settings */ +typedef enum { + APDS9960_AGAIN_1X = 0x00, /**< No gain */ + APDS9960_AGAIN_4X = 0x01, /**< 2x gain */ + APDS9960_AGAIN_16X = 0x02, /**< 16x gain */ + APDS9960_AGAIN_64X = 0x03 /**< 64x gain */ +} apds9960AGain_t; + +/** Proxmity gain settings */ +typedef enum { + APDS9960_PGAIN_1X = 0x00, /**< 1x gain */ + APDS9960_PGAIN_2X = 0x04, /**< 2x gain */ + APDS9960_PGAIN_4X = 0x08, /**< 4x gain */ + APDS9960_PGAIN_8X = 0x0C /**< 8x gain */ +} apds9960PGain_t; + +/** Pulse length settings */ +typedef enum { + APDS9960_PPULSELEN_4US = 0x00, /**< 4uS */ + APDS9960_PPULSELEN_8US = 0x40, /**< 8uS */ + APDS9960_PPULSELEN_16US = 0x80, /**< 16uS */ + APDS9960_PPULSELEN_32US = 0xC0 /**< 32uS */ +} apds9960PPulseLen_t; + +/** LED drive settings */ +typedef enum { + APDS9960_LEDDRIVE_100MA = 0x00, /**< 100mA */ + APDS9960_LEDDRIVE_50MA = 0x40, /**< 50mA */ + APDS9960_LEDDRIVE_25MA = 0x80, /**< 25mA */ + APDS9960_LEDDRIVE_12MA = 0xC0 /**< 12.5mA */ +} apds9960LedDrive_t; + +/** LED boost settings */ +typedef enum { + APDS9960_LEDBOOST_100PCNT = 0x00, /**< 100% */ + APDS9960_LEDBOOST_150PCNT = 0x10, /**< 150% */ + APDS9960_LEDBOOST_200PCNT = 0x20, /**< 200% */ + APDS9960_LEDBOOST_300PCNT = 0x30 /**< 300% */ +} apds9960LedBoost_t; + +/** Dimensions */ +enum { + APDS9960_DIMENSIONS_ALL = 0x00, // All dimensions + APDS9960_DIMENSIONS_UP_DOWN = 0x01, // Up/Down dimensions + APGS9960_DIMENSIONS_LEFT_RIGHT = 0x02, // Left/Right dimensions +}; + +/** FIFO Interrupts */ +enum { + APDS9960_GFIFO_1 = 0x00, // Generate interrupt after 1 dataset in FIFO + APDS9960_GFIFO_4 = 0x01, // Generate interrupt after 2 datasets in FIFO + APDS9960_GFIFO_8 = 0x02, // Generate interrupt after 3 datasets in FIFO + APDS9960_GFIFO_16 = 0x03, // Generate interrupt after 4 datasets in FIFO +}; + +/** Gesture Gain */ +enum { + APDS9960_GGAIN_1 = 0x00, // Gain 1x + APDS9960_GGAIN_2 = 0x01, // Gain 2x + APDS9960_GGAIN_4 = 0x02, // Gain 4x + APDS9960_GGAIN_8 = 0x03, // Gain 8x +}; + +/** Pulse Lenghts */ +enum { + APDS9960_GPULSE_4US = 0x00, // Pulse 4us + APDS9960_GPULSE_8US = 0x01, // Pulse 8us + APDS9960_GPULSE_16US = 0x02, // Pulse 16us + APDS9960_GPULSE_32US = 0x03, // Pulse 32us +}; + +#define APDS9960_UP 0x01 /**< Gesture Up */ +#define APDS9960_DOWN 0x02 /**< Gesture Down */ +#define APDS9960_LEFT 0x03 /**< Gesture Left */ +#define APDS9960_RIGHT 0x04 /**< Gesture Right */ + +/*! + * @brief Class that stores state and functions for interacting with + * APDS9960 Sensor + */ +class Adafruit_APDS9960 { +public: + Adafruit_APDS9960(){}; + ~Adafruit_APDS9960(){}; + + boolean begin(uint16_t iTimeMS = 10, apds9960AGain_t = APDS9960_AGAIN_4X, + uint8_t addr = APDS9960_ADDRESS, TwoWire *theWire = &Wire); + void setADCIntegrationTime(uint16_t iTimeMS); + float getADCIntegrationTime(); + void setADCGain(apds9960AGain_t gain); + apds9960AGain_t getADCGain(); + void setLED(apds9960LedDrive_t drive, apds9960LedBoost_t boost); + + // proximity + void enableProximity(boolean en = true); + void setProxGain(apds9960PGain_t gain); + apds9960PGain_t getProxGain(); + void setProxPulse(apds9960PPulseLen_t pLen, uint8_t pulses); + void enableProximityInterrupt(); + void disableProximityInterrupt(); + uint8_t readProximity(); + void setProximityInterruptThreshold(uint8_t low, uint8_t high, + uint8_t persistance = 4); + bool getProximityInterrupt(); + + // gesture + void enableGesture(boolean en = true); + bool gestureValid(); + void setGestureDimensions(uint8_t dims); + void setGestureFIFOThreshold(uint8_t thresh); + void setGestureGain(uint8_t gain); + void setGestureProximityThreshold(uint8_t thresh); + void setGestureOffset(uint8_t offset_up, uint8_t offset_down, + uint8_t offset_left, uint8_t offset_right); + uint8_t readGesture(); + void resetCounts(); + + // light & color + void enableColor(boolean en = true); + bool colorDataReady(); + void getColorData(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c); + uint16_t calculateColorTemperature(uint16_t r, uint16_t g, uint16_t b); + uint16_t calculateLux(uint16_t r, uint16_t g, uint16_t b); + void enableColorInterrupt(); + void disableColorInterrupt(); + void clearInterrupt(); + void setIntLimits(uint16_t l, uint16_t h); + + // turn on/off elements + void enable(boolean en = true); + +private: + uint8_t _i2caddr; + TwoWire *_wire; + + uint32_t read32(uint8_t reg); + uint16_t read16(uint8_t reg); + uint16_t read16R(uint8_t reg); + + void write8(byte reg, byte value); + uint8_t read8(byte reg); + + uint8_t gestCnt; + + uint8_t UCount; + uint8_t DCount; + + uint8_t LCount; + uint8_t RCount; + + uint8_t read(uint8_t reg, uint8_t *buf, uint8_t num); + void write(uint8_t reg, uint8_t *buf, uint8_t num); + void _i2c_init(); + + struct enable { + + // power on + uint8_t PON : 1; + + // ALS enable + uint8_t AEN : 1; + + // Proximity detect enable + uint8_t PEN : 1; + + // wait timer enable + uint8_t WEN : 1; + + // ALS interrupt enable + uint8_t AIEN : 1; + + // proximity interrupt enable + uint8_t PIEN : 1; + + // gesture enable + uint8_t GEN : 1; + + uint8_t get() { + return (GEN << 6) | (PIEN << 5) | (AIEN << 4) | (WEN << 3) | (PEN << 2) | + (AEN << 1) | PON; + }; + }; + struct enable _enable; + + struct pers { + // ALS Interrupt Persistence. Controls rate of Clear channel interrupt to + // the host processor + uint8_t APERS : 4; + + // proximity interrupt persistence, controls rate of prox interrupt to host + // processor + uint8_t PPERS : 4; + + uint8_t get() { return (PPERS << 4) | APERS; }; + }; + pers _pers; + + struct config1 { + uint8_t WLONG : 1; + + uint8_t get() { return WLONG << 1; }; + }; + config1 _config1; + + struct ppulse { + + /*Proximity Pulse Count. Specifies the number of proximity pulses to be + generated on LDR. Number of pulses is set by PPULSE value plus 1. + */ + uint8_t PPULSE : 6; + + // Proximity Pulse Length. Sets the LED-ON pulse width during a proximity + // LDR pulse. + uint8_t PPLEN : 2; + + uint8_t get() { return (PPLEN << 6) | PPULSE; } + }; + ppulse _ppulse; + + struct control { + // ALS and Color gain control + uint8_t AGAIN : 2; + + // proximity gain control + uint8_t PGAIN : 2; + + // led drive strength + uint8_t LDRIVE : 2; + + uint8_t get() { return (LDRIVE << 6) | (PGAIN << 2) | AGAIN; } + }; + control _control; + + struct config2 { + /* Additional LDR current during proximity and gesture LED pulses. Current + value, set by LDRIVE, is increased by the percentage of LED_BOOST. + */ + uint8_t LED_BOOST : 2; + + // clear photodiode saturation int enable + uint8_t CPSIEN : 1; + + // proximity saturation interrupt enable + uint8_t PSIEN : 1; + + uint8_t get() { + return (PSIEN << 7) | (CPSIEN << 6) | (LED_BOOST << 4) | 1; + } + }; + config2 _config2; + + struct status { + /* ALS Valid. Indicates that an ALS cycle has completed since AEN was + asserted or since a read from any of the ALS/Color data registers. + */ + uint8_t AVALID : 1; + + /* Proximity Valid. Indicates that a proximity cycle has completed since PEN + was asserted or since PDATA was last read. A read of PDATA automatically + clears PVALID. + */ + uint8_t PVALID : 1; + + /* Gesture Interrupt. GINT is asserted when GFVLV becomes greater than + GFIFOTH or if GVALID has become asserted when GMODE transitioned to zero. + The bit is reset when FIFO is completely emptied (read). + */ + uint8_t GINT : 1; + + // ALS Interrupt. This bit triggers an interrupt if AIEN in ENABLE is set. + uint8_t AINT : 1; + + // Proximity Interrupt. This bit triggers an interrupt if PIEN in ENABLE is + // set. + uint8_t PINT : 1; + + /* Indicates that an analog saturation event occurred during a previous + proximity or gesture cycle. Once set, this bit remains set until cleared by + clear proximity interrupt special function command (0xE5 PICLEAR) or by + disabling Prox (PEN=0). This bit triggers an interrupt if PSIEN is set. + */ + uint8_t PGSAT : 1; + + /* Clear Photodiode Saturation. When asserted, the analog sensor was at the + upper end of its dynamic range. The bit can be de-asserted by sending a + Clear channel interrupt command (0xE6 CICLEAR) or by disabling the ADC + (AEN=0). This bit triggers an interrupt if CPSIEN is set. + */ + uint8_t CPSAT : 1; + + void set(uint8_t data) { + AVALID = data & 0x01; + PVALID = (data >> 1) & 0x01; + GINT = (data >> 2) & 0x01; + AINT = (data >> 4) & 0x01; + PINT = (data >> 5) & 0x01; + PGSAT = (data >> 6) & 0x01; + CPSAT = (data >> 7) & 0x01; + } + }; + status _status; + + struct config3 { + // proximity mask + uint8_t PMASK_R : 1; + uint8_t PMASK_L : 1; + uint8_t PMASK_D : 1; + uint8_t PMASK_U : 1; + + /* Sleep After Interrupt. When enabled, the device will automatically enter + low power mode when the INT pin is asserted and the state machine has + progressed to the SAI decision block. Normal operation is resumed when INT + pin is cleared over I2C. + */ + uint8_t SAI : 1; + + /* Proximity Gain Compensation Enable. This bit provides gain compensation + when proximity photodiode signal is reduced as a result of sensor masking. + If only one diode of the diode pair is contributing, then only half of the + signal is available at the ADC; this results in a maximum ADC value of 127. + Enabling PCMP enables an additional gain of 2X, resulting in a maximum ADC + value of 255. + */ + uint8_t PCMP : 1; + + uint8_t get() { + return (PCMP << 5) | (SAI << 4) | (PMASK_U << 3) | (PMASK_D << 2) | + (PMASK_L << 1) | PMASK_R; + } + }; + config3 _config3; + + struct gconf1 { + /* Gesture Exit Persistence. When a number of consecutive “gesture end” + occurrences become equal or greater to the GEPERS value, the Gesture state + machine is exited. + */ + uint8_t GEXPERS : 2; + + /* Gesture Exit Mask. Controls which of the gesture detector photodiodes + (UDLR) will be included to determine a “gesture end” and subsequent exit + of the gesture state machine. Unmasked UDLR data will be compared with the + value in GTHR_OUT. Field value bits correspond to UDLR detectors. + */ + uint8_t GEXMSK : 4; + + /* Gesture FIFO Threshold. This value is compared with the FIFO Level (i.e. + the number of UDLR datasets) to generate an interrupt (if enabled). + */ + uint8_t GFIFOTH : 2; + + uint8_t get() { return (GFIFOTH << 6) | (GEXMSK << 2) | GEXPERS; } + }; + gconf1 _gconf1; + + struct gconf2 { + /* Gesture Wait Time. The GWTIME controls the amount of time in a low power + mode between gesture detection cycles. + */ + uint8_t GWTIME : 3; + + // Gesture LED Drive Strength. Sets LED Drive Strength in gesture mode. + uint8_t GLDRIVE : 2; + + // Gesture Gain Control. Sets the gain of the proximity receiver in gesture + // mode. + uint8_t GGAIN : 2; + + uint8_t get() { return (GGAIN << 5) | (GLDRIVE << 3) | GWTIME; } + }; + gconf2 _gconf2; + + struct gpulse { + /* Number of Gesture Pulses. Specifies the number of pulses to be generated + on LDR. Number of pulses is set by GPULSE value plus 1. + */ + uint8_t GPULSE : 6; + + // Gesture Pulse Length. Sets the LED_ON pulse width during a Gesture LDR + // Pulse. + uint8_t GPLEN : 2; + + uint8_t get() { return (GPLEN << 6) | GPULSE; } + }; + gpulse _gpulse; + + struct gconf3 { + /* Gesture Dimension Select. Selects which gesture photodiode pairs are + enabled to gather results during gesture. + */ + uint8_t GDIMS : 2; + + uint8_t get() { return GDIMS; } + }; + gconf3 _gconf3; + + struct gconf4 { + /* Gesture Mode. Reading this bit reports if the gesture state machine is + actively running, 1 = Gesture, 0= ALS, Proximity, Color. Writing a 1 to this + bit causes immediate entry in to the gesture state machine (as if GPENTH had + been exceeded). Writing a 0 to this bit causes exit of gesture when current + analog conversion has finished (as if GEXTH had been exceeded). + */ + uint8_t GMODE : 1; + + /* Gesture interrupt enable. Gesture Interrupt Enable. When asserted, all + gesture related interrupts are unmasked. + */ + uint8_t GIEN : 2; + + uint8_t get() { return (GIEN << 1) | GMODE; } + void set(uint8_t data) { + GIEN = (data >> 1) & 0x01; + GMODE = data & 0x01; + } + }; + gconf4 _gconf4; + + struct gstatus { + /* Gesture FIFO Data. GVALID bit is sent when GFLVL becomes greater than + GFIFOTH (i.e. FIFO has enough data to set GINT). GFIFOD is reset when GMODE + = 0 and the GFLVL=0 (i.e. All FIFO data has been read). + */ + uint8_t GVALID : 1; + + /* Gesture FIFO Overflow. A setting of 1 indicates that the FIFO has filled + to capacity and that new gesture detector data has been lost. + */ + uint8_t GFOV : 1; + + void set(uint8_t data) { + GFOV = (data >> 1) & 0x01; + GVALID = data & 0x01; + } + }; + gstatus _gstatus; +}; + +#endif diff --git a/firmware/libraries/Adafruit_APDS9960_Library/README.md b/firmware/libraries/Adafruit_APDS9960_Library/README.md new file mode 100755 index 0000000..b115d7c --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/README.md @@ -0,0 +1,18 @@ +# Adafruit APDS9960 Library [![Build Status](https://travis-ci.com/adafruit/Adafruit_APDS9960.svg?branch=master)](https://travis-ci.com/adafruit/Adafruit_APDS9960) + + + +This is the Adafruit APDS9960 Proximity, Light, RGB, and Gesture sensor Library + +Tested and works great with the Adafruit APDS9960 Board +* http://www.adafruit.com/products/3595 + +This chip uses I2C to communicate, 2 pins are required to interface + +Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! + +Written by Dean Miller, Limor Fried for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution + +To install, use the Arduino Library Manager and search for "Adafruit APDS9960 Library" and install the library. diff --git a/firmware/libraries/Adafruit_APDS9960_Library/assets/board.jpg b/firmware/libraries/Adafruit_APDS9960_Library/assets/board.jpg new file mode 100755 index 0000000000000000000000000000000000000000..dafb0d377739e4744f15c6885c7185992d5e29a9 GIT binary patch literal 291777 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ξD~LM;&*V$adC~|R#+tc*+ZQ6 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