diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..0d447d5 Binary files /dev/null and b/.DS_Store differ diff --git a/404.txt b/404.txt new file mode 100644 index 0000000..bfefffe --- /dev/null +++ b/404.txt @@ -0,0 +1,58 @@ +http://localhost:1313/pybytes/dashboard/connect/ +http://localhost:1313/firmwareapi/pycom/network/lora/lora.md +http://localhost:1313/tutorials/lte/nb-iot/firmware +http://localhost:1313/pybytes/introduction/dashboard +http://localhost:1313/firmwareapi/pycom/machine/pin/pin.md +http://localhost:1313/gettingstarted/introduction/connection/ +http://localhost:1313/gettingstarted/introduction/installation/ +http://localhost:1313/pybytes/introduction/getstarted +http://localhost:1313/pybytes/introduction/integrations/ +http://localhost:1313/products/datasheets/boards/pytrack.md +http://localhost:1313/firmwareapi/micropython/ustruct/uzlib/ +http://localhost:1313/firmwareapi/pycom/network/wlan/wlan.md +http://localhost:1313/pybytes/introduction/connect/ +http://localhost:1313/advance/downgrade/cli.md +http://localhost:1313/development/wipy2 +http://localhost:1313/products/datasheets/development/wipy3 +http://localhost:1313/getting-started/hardwaresetup/readme/wipy +http://localhost:1313/quick +http://localhost:1313/firmwareapi/notes/pycom/machine/timer.md +http://localhost:1313/products/datasheets/oem/g01 +http://localhost:1313/tutorials/pytrack/pysense +http://localhost:1313/products/datasheets/development/lopy4 +http://localhost:1313/firmwareapi/micropython/builtin/builtin +http://localhost:1313/advance/downgrade/cli +http://localhost:1313/gettingstarted/introduction/registration/ +http://localhost:1313/gitbook/assets/lopy%20%282%29.png +http://localhost:1313/pybytes/connect/flash/quick +http://localhost:1313/products/datasheets/development/fipy +http://localhost:1313/boards/deepsleep/ +http://localhost:1313/firmwareapi/notes/pycom/machine/pin +http://localhost:1313/products/datasheets/oem/w01 +http://localhost:1313/datasheets/development/wipy2/wipy3 +http://localhost:1313/datasheets/oem/l01_reference/universal_reference +http://localhost:1313/products/datasheets/boards/expansion3.md +http://localhost:1313/notes.md +http://localhost:1313/gettingstarted/introduction/programming/ +http://localhost:1313/tutorials/lte/cat-m1/firmware +http://localhost:1313/getting-started/hardwaresetup/readme/lopy +http://localhost:1313/products/datasheets/oem/l01 +http://localhost:1313/products/datasheets/oem/l04 +http://localhost:1313/products/datasheets/oem/universal_reference +http://localhost:1313/pybytes/connect/quick/flash +http://localhost:1313/introduction +http://localhost:1313/products/datasheets/development/sipy +http://localhost:1313/firmwareapi/pycom/machine/sd/sd.md +http://localhost:1313/products/datasheets/boards/pysense.md +http://localhost:1313/products/datasheets/development/gpy +http://localhost:1313/getting-started/hardwaresetup/readme/lopy4 +http://localhost:1313/products/datasheets/development/lopy +http://localhost:1313/firmwareapi/pycom/network/lora.md +http://localhost:1313/products/datasheets/boards/pyscan.md +http://localhost:1313/products/datasheets/oem/l01_reference +http://localhost:1313/firmwareapi/micropython/usocket/usocket.md +http://localhost:1313/pycom/aes + +FINISHED --2019-06-17 14:18:41-- +Total wall clock time: 2.2s +Downloaded: 250 files, 7.8M in 0.08s (96.7 MB/s) diff --git a/README.md b/README.md index bc749fe..281810b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,43 @@ -# Introduction +# local visualization -Welcome to the Pycom documentation site. We recommend reading through all the sections to familiarise yourself with the various tools and features available to you to help you develop on your Pycom module. +.md files are in the content folder, the theme forlder contains the theme. -To get started, read through the Getting Started guide then feel free to jump straight into the tutorials and examples in Tutorials & Examples to begin building your projects. +install Hugo and run it on the current directory. +``` +brew install hugo +hugo serve +``` -* [Products](products.md) -* [Getting Started](gettingstarted/introduction.md) -* [Tutorials](tutorials/introduction.md) -* [Product Info](datasheets/introduction.md) -* [API Documentation](firmwareapi/introduction.md) -* [Pybytes](pybytes/introduction.md) +The file config.toml contains the global .toml +# First generation of publish branch + +Some commands that have been used for building: + +- ``` +# it clone gh-pages in ./tmp/ and appy all .md files +./reclone.sh +# generate toc, title, redirects +python3 migration.py +# apply this changes to remove remaining not needed slashes protections +rpl -R '\)' ')' * +rpl -R '(' '(' * +# use carrefully but there should be not .html in content +# find "./content/" -name "*.html" -exec rm {} \; +# then finally fix link self to images +rpl -R "gitbook/assets/" "gitbook/assets/" * +rpl -R "../gitbook/assets" "/gitbook/assets" content +rpl -R "..//gitbook/assets" "/gitbook/assets" content +rpl -R "’" "'" content +rpl -R "✔" "✔" content +rpl -R "(../" "(/" +# get the images in static +cp tmp/pydocs/gitbook/assets/* static/gitbook/assets/ +``` + +# detect broken links + +``` +wget -o 404.txt -r --spider http://localhost:1313 +cat ~/output.txt | grep -B 7 404 | grep "\-\-20" +``` diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index ebdc5f3..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,217 +0,0 @@ -# Table of contents - -* [Introduction](README.md) -* [Pycom Products](products.md) - -## Getting Started - -* [Introduction](gettingstarted/introduction.md) -* [Hardware Setup](gettingstarted/connection/README.md) - * [LoPy](gettingstarted/connection/lopy.md) - * [LoPy 4](gettingstarted/connection/lopy4.md) - * [SiPy](gettingstarted/connection/sipy.md) - * [GPy](gettingstarted/connection/gpy.md) - * [FiPy](gettingstarted/connection/fipy.md) - * [WiPy](gettingstarted/connection/wipy.md) -* [Software](gettingstarted/installation/README.md) - * [Drivers](gettingstarted/installation/drivers.md) - * [Updating Firmware](gettingstarted/installation/firmwaretool.md) - * [Pymakr](gettingstarted/installation/pymakr.md) -* [Programming the modules](gettingstarted/programming/README.md) - * [Introduction to MicroPython](gettingstarted/programming/micropython.md) - * [MicroPython Examples](gettingstarted/programming/examples.md) - * [Your first Pymakr project](gettingstarted/programming/first-project.md) - * [REPL](gettingstarted/programming/repl/README.md) - * [Serial USB \(UART\)](gettingstarted/programming/repl/serial.md) - * [Telnet REPL](gettingstarted/programming/repl/telnet.md) - * [FTP](gettingstarted/programming/ftp.md) - * [Safe boot](gettingstarted/programming/safeboot.md) -* [Device Registration](gettingstarted/registration/README.md) - * [Sigfox](gettingstarted/registration/sigfox.md) - * [Cellular](gettingstarted/registration/cellular.md) - * [LoRaWAN](gettingstarted/registration/lora/README.md) - * [The Things Network](gettingstarted/registration/lora/ttn.md) - * [Objenious](gettingstarted/registration/lora/objenious.md) - -## Pymakr Plugin - -* [Installation](pymakr/installation/README.md) - * [Atom](pymakr/installation/atom.md) - * [Visual Studio Code](pymakr/installation/vscode.md) -* [Tools/Features](pymakr/toolsfeatures.md) -* [Settings](pymakr/settings.md) - -## Pytrack, Pysense, Pyscan - -* [Introduction](pytrackpysense/introduction.md) -* [Installing Software](pytrackpysense/installation/README.md) - * [Updating Firmware](pytrackpysense/installation/firmware.md) - * [Installing Drivers - Windows 7](pytrackpysense/installation/drivers.md) - * [Installing Libraries](pytrackpysense/installation/libraries.md) -* [API Reference](pytrackpysense/apireference/README.md) - * [Pytrack](pytrackpysense/apireference/pytrack.md) - * [Pysense](pytrackpysense/apireference/pysense.md) - * [Pyscan](pytrackpysense/apireference/pyscan.md) - * [Sleep](pytrackpysense/apireference/sleep.md) - -## Tutorials & Examples - -* [Introduction](tutorials/introduction.md) -* [All Pycom Device Examples](tutorials/all/README.md) - * [REPL](tutorials/all/repl.md) - * [WLAN](tutorials/all/wlan.md) - * [Bluetooth](tutorials/all/ble.md) - * [HTTPS](tutorials/all/https.md) - * [MQTT](tutorials/all/mqtt.md) - * [AWS](tutorials/all/aws.md) - * [ADC](tutorials/all/adc.md) - * [I2C](tutorials/all/i2c.md) - * [Onewire Driver](tutorials/all/owd.md) - * [Threading](tutorials/all/threading.md) - * [RGB LED](tutorials/all/rgbled.md) - * [Timers](tutorials/all/timers.md) - * [PIR Sensor](tutorials/all/pir.md) - * [Modbus](tutorials/all/modbus.md) - * [OTA update](tutorials/all/ota.md) - * [RMT](tutorials/all/rmt.md) - * [Socket](tutorials/all/socket.md) - * [Touch](tutorials/all/touch.md) - -* [LoRa Examples](tutorials/lora/README.md) - * [LoRa-MAC \(Raw LoRa\)](tutorials/lora/lora-mac.md) - * [LoRaWAN with OTAA](tutorials/lora/lorawan-otaa.md) - * [LoRaWAN with ABP](tutorials/lora/lorawan-abp.md) - * [LoRa-MAC Nano-Gateway](tutorials/lora/lora-mac-nano-gateway.md) - * [LoPy to LoPy](tutorials/lora/module-module.md) - * [LoRaWAN Nano-Gateway](tutorials/lora/lorawan-nano-gateway.md) - * [RN2483 to LoPy](tutorials/lora/rn2483-to-lopy.md) - * [LoRa Mesh](tutorials/lora/lora-mesh.md) - * [PyMesh Border Router](tutorials/lora/pymesh-br.md) - -* [Sigfox Examples](tutorials/sigfox.md) -* [LTE Examples](tutorials/lte/README.md) - * [CAT-M1](tutorials/lte/cat-m1.md) - * [NB-IoT](tutorials/lte/nb-iot.md) - * [Module IMEI](tutorials/lte/imei.md) - * [Modem Firmware Update](tutorials/lte/firmware.md) -* [Pytrack Examples](tutorials/pytrack.md) -* [Pysense Examples](tutorials/pysense.md) -* [Pyscan Examples](tutorials/pyscan.md) - -## Firmware & API Reference - -* [Introduction](firmwareapi/introduction.md) -* [Pycom Modules](firmwareapi/pycom/README.md) - * [machine](firmwareapi/pycom/machine/README.md) - * [ADC](firmwareapi/pycom/machine/adc.md) - * [DAC](firmwareapi/pycom/machine/dac.md) - * [I2C](firmwareapi/pycom/machine/i2c.md) - * [Pin](firmwareapi/pycom/machine/pin.md) - * [PWM](firmwareapi/pycom/machine/pwm.md) - * [RTC](firmwareapi/pycom/machine/rtc.md) - * [SPI](firmwareapi/pycom/machine/spi.md) - * [UART](firmwareapi/pycom/machine/uart.md) - * [WDT](firmwareapi/pycom/machine/wdt.md) - * [Timer](firmwareapi/pycom/machine/timer.md) - * [SD](firmwareapi/pycom/machine/sd.md) - * [CAN](firmwareapi/pycom/machine/can.md) - * [RMT](firmwareapi/pycom/machine/rmt.md) - * [network](firmwareapi/pycom/network/README.md) - * [WLAN](firmwareapi/pycom/network/wlan.md) - * [Server](firmwareapi/pycom/network/server.md) - * [Bluetooth](firmwareapi/pycom/network/bluetooth/README.md) - * [GATT](firmwareapi/pycom/network/bluetooth/gatt.md) - * [GATTCConnection](firmwareapi/pycom/network/bluetooth/gattcconnection.md) - * [GATTCService](firmwareapi/pycom/network/bluetooth/gattccservice.md) - * [GATTCCharacteristic](firmwareapi/pycom/network/bluetooth/gattccharacteristic.md) - * [GATTSService](firmwareapi/pycom/network/bluetooth/gattsservice.md) - * [GATTSCharacteristic](firmwareapi/pycom/network/bluetooth/gattscharacteristic.md) - * [LoRa](firmwareapi/pycom/network/lora/README.md) - * [Pymesh](firmwareapi/pycom/network/lora/pymesh.md) - * [Sigfox](firmwareapi/pycom/network/sigfox.md) - * [LTE](firmwareapi/pycom/network/lte.md) - * [AES](firmwareapi/pycom/aes.md) - * [pycom](firmwareapi/pycom/pycom.md) -* [MicroPython Modules](firmwareapi/micropython/README.md) - * [micropython](firmwareapi/micropython/micropython.md) - * [uctypes](firmwareapi/micropython/uctypes.md) - * [sys](firmwareapi/micropython/sys.md) - * [uos](firmwareapi/micropython/uos.md) - * [array](firmwareapi/micropython/array.md) - * [cmath](firmwareapi/micropython/cmath.md) - * [math](firmwareapi/micropython/math.md) - * [gc](firmwareapi/micropython/gc.md) - * [ubinascii](firmwareapi/micropython/ubinascii.md) - * [ujson](firmwareapi/micropython/ujson.md) - * [ure](firmwareapi/micropython/ure.md) - * [usocket](firmwareapi/micropython/usocket.md) - * [select](firmwareapi/micropython/select.md) - * [utime](firmwareapi/micropython/utime.md) - * [uhashlib](firmwareapi/micropython/uhashlib.md) - * [ussl](firmwareapi/micropython/ussl.md) - * [ucrypto](firmwareapi/micropython/ucrypto.md) - * [ustruct](firmwareapi/micropython/ustruct/README.md) - * [uzlib](firmwareapi/micropython/ustruct/uzlib.md) - * [\_thread](firmwareapi/micropython/_thread.md) - * [Builtin](firmwareapi/micropython/builtin.md) -* [Notes](firmwareapi/notes.md) - -## Product Info, Datasheets - -* [Introduction](datasheets/introduction.md) -* [Development Modules](datasheets/development/README.md) - * [WiPy 2.0](datasheets/development/wipy2.md) - * [WiPy 3.0](datasheets/development/wipy3.md) - * [LoPy](datasheets/development/lopy.md) - * [LoPy 4](datasheets/development/lopy4.md) - * [SiPy](datasheets/development/sipy.md) - * [GPy](datasheets/development/gpy.md) - * [FiPy](datasheets/development/fipy.md) -* [OEM Modules](datasheets/oem/README.md) - * [W01](datasheets/oem/w01.md) - * [L01](datasheets/oem/l01.md) - * [L04](datasheets/oem/l04.md) - * [G01](datasheets/oem/g01.md) - * [L01 OEM Baseboard Reference](datasheets/oem/l01_reference.md) - * [Universal OEM Baseboard Reference](datasheets/oem/universal_reference.md) -* [Expansion Boards and Shields](datasheets/boards/README.md) - * [Expansion Board 3.0](datasheets/boards/expansion3.md) - * [Pytrack](datasheets/boards/pytrack.md) - * [Pysense](datasheets/boards/pysense.md) - * [Pyscan](datasheets/boards/pyscan.md) - * [Expansion Board 2.0](datasheets/boards/expansion2.md) - * [Deep Sleep Shield](datasheets/boards/deepsleep/README.md) - * [Deep Sleep API](datasheets/boards/deepsleep/api.md) -* [Notes](datasheets/notes.md) - -## Pybytes - -* [Introduction](pybytes/introduction.md) -* [Getting Started with Pybytes](pybytes/getstarted.md) -* [Add a device to Pybytes](pybytes/connect/README.md) - * [Connect to Pybytes: Quick Add](pybytes/connect/quick.md) - * [Connect to Pybytes: Flash Pybytes library manually](pybytes/connect/flash.md) - * [Add Sigfox device](pybytes/connect/sigfox/README.md) - * [DevKit contract](pybytes/connect/sigfox/devkit.md) - * [Custom contract](pybytes/connect/sigfox/custom.md) -* [Visualise data from your device](pybytes/dashboard.md) -* [Integrations](pybytes/integrations/README.md) - * [Amazon IoT](pybytes/integrations/amazon-iot.md) - -## Documentation Notes - -* [Introduction](docnotes/introduction.md) -* [Syntax](docnotes/syntax.md) -* [REPL vs Scripts](docnotes/replscript.md) -* [Mesh Networks](docnotes/mesh-networks.md) - -## Advanced Topics - -* [Firmware Downgrade](advance/downgrade.md) -* [CLI Updater](advance/cli.md) -* [SecureBoot and Encryption](advance/encryption.md) -* [License](advance/license.md) - -## Have a question? - -* [Ask on the Forum](https://forum.pycom.io) diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..5e59d2b --- /dev/null +++ b/config.toml @@ -0,0 +1,1293 @@ +baseURL = "http://localhost:1313/" +languageCode = "en-us" +title = "documentation" +uglyurls = false +sectionPagesMenu = "main" +PygmentsCodeFences = true +# see https://help.farbox.com/pygments.html for available pygments +PygmentsStyle = "friendly" +theme = "doc-theme" + +[menu] + +[[menu.main]] + name = "Pycom Products" + url = "/products/" + identifier = "products" + weight = 30 + +# *** Getting Started +[[menu.main]] + name = "Getting Started" + url = "/gettingstarted/" + identifier = "gettingstarted" + weight = 40 + +[[menu.main]] + name = "Hardware Setup" + url = "/gettingstarted/connection/" + identifier = "gettingstarted@connection" + parent = "gettingstarted" + weight = 10 + +[[menu.main]] + name = "LoPy" + url = "/gettingstarted/connection/lopy/" + identifier = "gettingstarted@connection@lopy" + parent = "gettingstarted@connection" + weight = 10 + +[[menu.main]] + name = "LoPy 4" + url = "/gettingstarted/connection/lopy4/" + identifier = "gettingstarted@connection@lopy4" + parent = "gettingstarted@connection" + weight = 20 + +[[menu.main]] + name = "SiPy" + url = "/gettingstarted/connection/sipy/" + identifier = "gettingstarted@connection@sipy" + parent = "gettingstarted@connection" + weight = 30 + +[[menu.main]] + name = "GPy" + url = "/gettingstarted/connection/gpy/" + identifier = "gettingstarted@connection@gpy" + parent = "gettingstarted@connection" + weight = 40 + +[[menu.main]] + name = "FiPy" + url = "/gettingstarted/connection/fipy/" + identifier = "gettingstarted@connection@fipy" + parent = "gettingstarted@connection" + weight = 50 + +[[menu.main]] + name = "WiPy" + url = "/gettingstarted/connection/wipy/" + identifier = "gettingstarted@connection@wipy" + parent = "gettingstarted@connection" + weight = 60 + +[[menu.main]] + name = "Software" + url = "/gettingstarted/installation/" + identifier = "gettingstarted@installation" + parent = "gettingstarted" + weight = 20 + +[[menu.main]] + name = "Drivers" + url = "/gettingstarted/installation/drivers/" + identifier = "gettingstarted@installation@drivers" + parent = "gettingstarted@installation" + weight = 10 + +[[menu.main]] + name = "Updating Firmware" + url = "/gettingstarted/installation/firmwaretool/" + identifier = "gettingstarted@installation@firmwaretool" + parent = "gettingstarted@installation" + weight = 20 + +[[menu.main]] + name = "Pymakr" + url = "/gettingstarted/installation/pymakr/" + identifier = "gettingstarted@installation@pymakr" + parent = "gettingstarted@installation" + weight = 30 + +[[menu.main]] + name = "Programming the modules" + url = "/gettingstarted/programming/" + identifier = "gettingstarted@programming" + parent = "gettingstarted" + weight = 30 + +[[menu.main]] + name = "Introduction to MicroPython" + url = "/gettingstarted/programming/micropython/" + identifier = "gettingstarted@programming@micropython" + parent = "gettingstarted@programming" + weight = 10 + +[[menu.main]] + name = "MicroPython Examples" + url = "/gettingstarted/programming/examples/" + identifier = "gettingstarted@programming@examples" + parent = "gettingstarted@programming" + weight = 20 + +[[menu.main]] + name = "Your first Pymakr project" + url = "/gettingstarted/programming/first-project/" + identifier = "gettingstarted@programming@first-project" + parent = "gettingstarted@programming" + weight = 30 + +[[menu.main]] + name = "REPL" + url = "/gettingstarted/programming/repl/" + identifier = "gettingstarted@programming@repl" + parent = "gettingstarted@programming" + weight = 40 + +[[menu.main]] + name = "Serial USB (UART)" + url = "/gettingstarted/programming/repl/serial/" + identifier = "gettingstarted@programming@repl@serial" + parent = "gettingstarted@programming@repl" + weight = 10 + +[[menu.main]] + name = "Telnet REPL" + url = "/gettingstarted/programming/repl/telnet/" + identifier = "gettingstarted@programming@repl@telnet" + parent = "gettingstarted@programming@repl" + weight = 20 + +[[menu.main]] + name = "FTP" + url = "/gettingstarted/programming/ftp/" + identifier = "gettingstarted@programming@ftp" + parent = "gettingstarted@programming" + weight = 50 + +[[menu.main]] + name = "Safe boot" + url = "/gettingstarted/programming/safeboot/" + identifier = "gettingstarted@programming@safeboot" + parent = "gettingstarted@programming" + weight = 60 + +[[menu.main]] + name = "Device Registration" + url = "/gettingstarted/registration/" + identifier = "gettingstarted@registration" + parent = "gettingstarted" + weight = 40 + +[[menu.main]] + name = "Sigfox" + url = "/gettingstarted/registration/sigfox/" + identifier = "gettingstarted@registration@sigfox" + parent = "gettingstarted@registration" + weight = 10 + +[[menu.main]] + name = "Cellular" + url = "/gettingstarted/registration/cellular/" + identifier = "gettingstarted@registration@cellular" + parent = "gettingstarted@registration" + weight = 20 + +[[menu.main]] + name = "LoRaWAN" + url = "/gettingstarted/registration/lora/" + identifier = "gettingstarted@registration@lora" + parent = "gettingstarted@registration" + weight = 30 + +[[menu.main]] + name = "The Things Network" + url = "/gettingstarted/registration/lora/ttn/" + identifier = "gettingstarted@registration@lora@ttn" + parent = "gettingstarted@registration@lora" + weight = 10 + +[[menu.main]] + name = "Objenious" + url = "/gettingstarted/registration/lora/objenious/" + identifier = "gettingstarted@registration@lora@objenious" + parent = "gettingstarted@registration@lora" + weight = 20 + +# *** Pymakr Plugin +[[menu.main]] + name = "Pymakr" + url = "/pymakr/installation/" + identifier = "pymakr" + weight = 45 + +[[menu.main]] + name = "Installation" + url = "/pymakr/installation/" + identifier = "pymakr@installation" + parent = "pymakr" + weight = 10 + +[[menu.main]] + name = "Atom" + url = "/pymakr/installation/atom/" + identifier = "pymakr@installation@atom" + parent = "pymakr@installation" + weight = 10 + +[[menu.main]] + name = "Visual Studio Code" + url = "/pymakr/installation/vscode/" + identifier = "pymakr@installation@vscode" + parent = "pymakr@installation" + weight = 20 + +[[menu.main]] + name = "Tools/Features" + url = "/pymakr/toolsfeatures/" + identifier = "pymakr@toolsfeatures" + parent = "pymakr" + weight = 20 + +[[menu.main]] + name = "Settings" + url = "/pymakr/settings/" + identifier = "pymakr@settings" + parent = "pymakr" + weight = 30 + +# *** Pytrack, Pysense, Pyscan +[[menu.main]] + name = "Pytrack, Pysense, Pyscan" + url = "/pytrackpysense/" + identifier = "pytrackpysense" + weight = 50 + +[[menu.main]] + name = "Installing Software" + url = "/pytrackpysense/installation/" + identifier = "pytrackpysense@installation" + parent = "pytrackpysense" + weight = 10 + +[[menu.main]] + name = "Updating Firmware" + url = "/pytrackpysense/installation/firmware/" + identifier = "pytrackpysense@installation@firmware" + parent = "pytrackpysense@installation" + weight = 10 + +[[menu.main]] + name = "Installing Drivers - Windows 7" + url = "/pytrackpysense/installation/drivers/" + identifier = "pytrackpysense@installation@drivers" + parent = "pytrackpysense@installation" + weight = 20 + +[[menu.main]] + name = "Installing Libraries" + url = "/pytrackpysense/installation/libraries/" + identifier = "pytrackpysense@installation@libraries" + parent = "pytrackpysense@installation" + weight = 30 + +[[menu.main]] + name = "API Reference" + url = "/pytrackpysense/apireference/" + identifier = "pytrackpysense@apireference" + parent = "pytrackpysense" + weight = 20 + +[[menu.main]] + name = "Pytrack" + url = "/pytrackpysense/apireference/pytrack/" + identifier = "pytrackpysense@apireference@pytrack" + parent = "pytrackpysense@apireference" + weight = 10 + +[[menu.main]] + name = "Pysense" + url = "/pytrackpysense/apireference/pysense/" + identifier = "pytrackpysense@apireference@pysense" + parent = "pytrackpysense@apireference" + weight = 20 + +[[menu.main]] + name = "Pyscan" + url = "/pytrackpysense/apireference/pyscan/" + identifier = "pytrackpysense@apireference@pyscan" + parent = "pytrackpysense@apireference" + weight = 30 + +[[menu.main]] + name = "Sleep" + url = "/pytrackpysense/apireference/sleep/" + identifier = "pytrackpysense@apireference@sleep" + parent = "pytrackpysense@apireference" + weight = 40 + +# *** Tutorials & Examples +[[menu.main]] + name = "Tutorials & Examples" + url = "/tutorials/" + identifier = "tutorials" + weight = 60 + +[[menu.main]] + name = "All Pycom Device Examples" + url = "/tutorials/all/" + identifier = "tutorials@all" + parent = "tutorials" + weight = 10 + +[[menu.main]] + name = "REPL" + url = "/tutorials/all/repl/" + identifier = "tutorials@all@repl" + parent = "tutorials@all" + weight = 10 + +[[menu.main]] + name = "WLAN" + url = "/tutorials/all/wlan/" + identifier = "tutorials@all@wlan" + parent = "tutorials@all" + weight = 20 + +[[menu.main]] + name = "Bluetooth" + url = "/tutorials/all/ble/" + identifier = "tutorials@all@ble" + parent = "tutorials@all" + weight = 30 + +[[menu.main]] + name = "HTTPS" + url = "/tutorials/all/https/" + identifier = "tutorials@all@https" + parent = "tutorials@all" + weight = 40 + +[[menu.main]] + name = "MQTT" + url = "/tutorials/all/mqtt/" + identifier = "tutorials@all@mqtt" + parent = "tutorials@all" + weight = 50 + +[[menu.main]] + name = "AWS" + url = "/tutorials/all/aws/" + identifier = "tutorials@all@aws" + parent = "tutorials@all" + weight = 60 + +[[menu.main]] + name = "ADC" + url = "/tutorials/all/adc/" + identifier = "tutorials@all@adc" + parent = "tutorials@all" + weight = 70 + +[[menu.main]] + name = "I2C" + url = "/tutorials/all/i2c/" + identifier = "tutorials@all@i2c" + parent = "tutorials@all" + weight = 80 + +[[menu.main]] + name = "Onewire Driver" + url = "/tutorials/all/owd/" + identifier = "tutorials@all@owd" + parent = "tutorials@all" + weight = 90 + +[[menu.main]] + name = "Threading" + url = "/tutorials/all/threading/" + identifier = "tutorials@all@threading" + parent = "tutorials@all" + weight = 100 + +[[menu.main]] + name = "RGB LED" + url = "/tutorials/all/rgbled/" + identifier = "tutorials@all@rgbled" + parent = "tutorials@all" + weight = 110 + +[[menu.main]] + name = "Timers" + url = "/tutorials/all/timers/" + identifier = "tutorials@all@timers" + parent = "tutorials@all" + weight = 120 + +[[menu.main]] + name = "PIR Sensor" + url = "/tutorials/all/pir/" + identifier = "tutorials@all@pir" + parent = "tutorials@all" + weight = 130 + +[[menu.main]] + name = "Modbus" + url = "/tutorials/all/modbus/" + identifier = "tutorials@all@modbus" + parent = "tutorials@all" + weight = 140 + +[[menu.main]] + name = "OTA update" + url = "/tutorials/all/ota/" + identifier = "tutorials@all@ota" + parent = "tutorials@all" + weight = 150 + +[[menu.main]] + name = "RMT" + url = "/tutorials/all/rmt/" + identifier = "tutorials@all@rmt" + parent = "tutorials@all" + weight = 160 + +[[menu.main]] + name = "Socket" + url = "/tutorials/all/socket/" + identifier = "tutorials@all@socket" + parent = "tutorials@all" + weight = 170 + +[[menu.main]] + name = "Touch" + url = "/tutorials/all/touch/" + identifier = "tutorials@all@touch" + parent = "tutorials@all" + weight = 180 + +[[menu.main]] + name = "LoRa Examples" + url = "/tutorials/lora/" + identifier = "tutorials@lora" + parent = "tutorials" + weight = 20 + +[[menu.main]] + name = "LoRa-MAC (Raw LoRa)" + url = "/tutorials/lora/lora-mac/" + identifier = "tutorials@lora@lora-mac" + parent = "tutorials@lora" + weight = 10 + +[[menu.main]] + name = "LoRaWAN with OTAA" + url = "/tutorials/lora/lorawan-otaa/" + identifier = "tutorials@lora@lorawan-otaa" + parent = "tutorials@lora" + weight = 20 + +[[menu.main]] + name = "LoRaWAN with ABP" + url = "/tutorials/lora/lorawan-abp/" + identifier = "tutorials@lora@lorawan-abp" + parent = "tutorials@lora" + weight = 30 + +[[menu.main]] + name = "LoRa-MAC Nano-Gateway" + url = "/tutorials/lora/lora-mac-nano-gateway/" + identifier = "tutorials@lora@lora-mac-nano-gateway" + parent = "tutorials@lora" + weight = 40 + +[[menu.main]] + name = "LoPy to LoPy" + url = "/tutorials/lora/module-module/" + identifier = "tutorials@lora@module-module" + parent = "tutorials@lora" + weight = 50 + +[[menu.main]] + name = "LoRaWAN Nano-Gateway" + url = "/tutorials/lora/lorawan-nano-gateway/" + identifier = "tutorials@lora@lorawan-nano-gateway" + parent = "tutorials@lora" + weight = 60 + +[[menu.main]] + name = "RN2483 to LoPy" + url = "/tutorials/lora/rn2483-to-lopy/" + identifier = "tutorials@lora@rn2483-to-lopy" + parent = "tutorials@lora" + weight = 70 + +[[menu.main]] + name = "LoRa Mesh" + url = "/tutorials/lora/lora-mesh/" + identifier = "tutorials@lora@lora-mesh" + parent = "tutorials@lora" + weight = 80 + +[[menu.main]] + name = "PyMesh Border Router" + url = "/tutorials/lora/pymesh-br/" + identifier = "tutorials@lora@pymesh-br" + parent = "tutorials@lora" + weight = 90 + +[[menu.main]] + name = "Sigfox Examples" + url = "/tutorials/sigfox/" + identifier = "tutorials@sigfox" + parent = "tutorials" + weight = 30 + +[[menu.main]] + name = "LTE Examples" + url = "/tutorials/lte/" + identifier = "tutorials@lte" + parent = "tutorials" + weight = 40 + +[[menu.main]] + name = "CAT-M1" + url = "/tutorials/lte/cat-m1/" + identifier = "tutorials@lte@cat-m1" + parent = "tutorials@lte" + weight = 10 + +[[menu.main]] + name = "NB-IoT" + url = "/tutorials/lte/nb-iot/" + identifier = "tutorials@lte@nb-iot" + parent = "tutorials@lte" + weight = 20 + +[[menu.main]] + name = "Module IMEI" + url = "/tutorials/lte/imei/" + identifier = "tutorials@lte@imei" + parent = "tutorials@lte" + weight = 30 + +[[menu.main]] + name = "Modem Firmware Update" + url = "/tutorials/lte/firmware/" + identifier = "tutorials@lte@firmware" + parent = "tutorials@lte" + weight = 40 + +[[menu.main]] + name = "Pytrack Examples" + url = "/tutorials/pytrack/" + identifier = "tutorials@pytrack" + parent = "tutorials" + weight = 50 + +[[menu.main]] + name = "Pysense Examples" + url = "/tutorials/pysense/" + identifier = "tutorials@pysense" + parent = "tutorials" + weight = 60 + +[[menu.main]] + name = "Pyscan Examples" + url = "/tutorials/pyscan/" + identifier = "tutorials@pyscan" + parent = "tutorials" + weight = 70 + +# *** Firmware & API Reference +[[menu.main]] + name = "Firmware & API Reference" + url = "/firmwareapi/" + identifier = "firmwareapi" + weight = 70 + +[[menu.main]] + name = "Pycom Modules" + url = "/firmwareapi/pycom/" + identifier = "firmwareapi@pycom" + parent = "firmwareapi" + weight = 10 + +[[menu.main]] + name = "machine" + url = "/firmwareapi/pycom/machine/" + identifier = "firmwareapi@pycom@machine" + parent = "firmwareapi@pycom" + weight = 10 + +[[menu.main]] + name = "ADC" + url = "/firmwareapi/pycom/machine/adc/" + identifier = "firmwareapi@pycom@machine@adc" + parent = "firmwareapi@pycom@machine" + weight = 10 + +[[menu.main]] + name = "DAC" + url = "/firmwareapi/pycom/machine/dac/" + identifier = "firmwareapi@pycom@machine@dac" + parent = "firmwareapi@pycom@machine" + weight = 20 + +[[menu.main]] + name = "I2C" + url = "/firmwareapi/pycom/machine/i2c/" + identifier = "firmwareapi@pycom@machine@i2c" + parent = "firmwareapi@pycom@machine" + weight = 30 + +[[menu.main]] + name = "Pin" + url = "/firmwareapi/pycom/machine/pin/" + identifier = "firmwareapi@pycom@machine@pin" + parent = "firmwareapi@pycom@machine" + weight = 40 + +[[menu.main]] + name = "PWM" + url = "/firmwareapi/pycom/machine/pwm/" + identifier = "firmwareapi@pycom@machine@pwm" + parent = "firmwareapi@pycom@machine" + weight = 50 + +[[menu.main]] + name = "RTC" + url = "/firmwareapi/pycom/machine/rtc/" + identifier = "firmwareapi@pycom@machine@rtc" + parent = "firmwareapi@pycom@machine" + weight = 60 + +[[menu.main]] + name = "SPI" + url = "/firmwareapi/pycom/machine/spi/" + identifier = "firmwareapi@pycom@machine@spi" + parent = "firmwareapi@pycom@machine" + weight = 70 + +[[menu.main]] + name = "UART" + url = "/firmwareapi/pycom/machine/uart/" + identifier = "firmwareapi@pycom@machine@uart" + parent = "firmwareapi@pycom@machine" + weight = 80 + +[[menu.main]] + name = "WDT" + url = "/firmwareapi/pycom/machine/wdt/" + identifier = "firmwareapi@pycom@machine@wdt" + parent = "firmwareapi@pycom@machine" + weight = 90 + +[[menu.main]] + name = "Timer" + url = "/firmwareapi/pycom/machine/timer/" + identifier = "firmwareapi@pycom@machine@timer" + parent = "firmwareapi@pycom@machine" + weight = 100 + +[[menu.main]] + name = "SD" + url = "/firmwareapi/pycom/machine/sd/" + identifier = "firmwareapi@pycom@machine@sd" + parent = "firmwareapi@pycom@machine" + weight = 110 + +[[menu.main]] + name = "CAN" + url = "/firmwareapi/pycom/machine/can/" + identifier = "firmwareapi@pycom@machine@can" + parent = "firmwareapi@pycom@machine" + weight = 120 + +[[menu.main]] + name = "RMT" + url = "/firmwareapi/pycom/machine/rmt/" + identifier = "firmwareapi@pycom@machine@rmt" + parent = "firmwareapi@pycom@machine" + weight = 130 + +[[menu.main]] + name = "network" + url = "/firmwareapi/pycom/network/" + identifier = "firmwareapi@pycom@network" + parent = "firmwareapi@pycom" + weight = 20 + +[[menu.main]] + name = "WLAN" + url = "/firmwareapi/pycom/network/wlan/" + identifier = "firmwareapi@pycom@network@wlan" + parent = "firmwareapi@pycom@network" + weight = 10 + +[[menu.main]] + name = "Server" + url = "/firmwareapi/pycom/network/server/" + identifier = "firmwareapi@pycom@network@server" + parent = "firmwareapi@pycom@network" + weight = 20 + +[[menu.main]] + name = "Bluetooth" + url = "/firmwareapi/pycom/network/bluetooth/" + identifier = "firmwareapi@pycom@network@bluetooth" + parent = "firmwareapi@pycom@network" + weight = 30 + +[[menu.main]] + name = "GATT" + url = "/firmwareapi/pycom/network/bluetooth/gatt/" + identifier = "firmwareapi@pycom@network@bluetooth@gatt" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 10 + +[[menu.main]] + name = "GATTCConnection" + url = "/firmwareapi/pycom/network/bluetooth/gattcconnection/" + identifier = "firmwareapi@pycom@network@bluetooth@gattcconnection" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 20 + +[[menu.main]] + name = "GATTCService" + url = "/firmwareapi/pycom/network/bluetooth/gattccservice/" + identifier = "firmwareapi@pycom@network@bluetooth@gattccservice" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 30 + +[[menu.main]] + name = "GATTCCharacteristic" + url = "/firmwareapi/pycom/network/bluetooth/gattccharacteristic/" + identifier = "firmwareapi@pycom@network@bluetooth@gattccharacteristic" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 40 + +[[menu.main]] + name = "GATTSService" + url = "/firmwareapi/pycom/network/bluetooth/gattsservice/" + identifier = "firmwareapi@pycom@network@bluetooth@gattsservice" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 50 + +[[menu.main]] + name = "GATTSCharacteristic" + url = "/firmwareapi/pycom/network/bluetooth/gattscharacteristic/" + identifier = "firmwareapi@pycom@network@bluetooth@gattscharacteristic" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 60 + +# [Errno 2] No such file or directory: './content/firmwareapi/pycom/network/lora/README.md' +[[menu.main]] + name = "LoRa" + url = "/firmwareapi/pycom/network/lora/" + identifier = "firmwareapi@pycom@network@lora" + parent = "firmwareapi@pycom@network" + weight = 40 + +[[menu.main]] + name = "Pymesh" + url = "/firmwareapi/pycom/network/lora/pymesh/" + identifier = "firmwareapi@pycom@network@lora@pymesh" + parent = "firmwareapi@pycom@network@lora" + weight = 10 + +[[menu.main]] + name = "Sigfox" + url = "/firmwareapi/pycom/network/sigfox/" + identifier = "firmwareapi@pycom@network@sigfox" + parent = "firmwareapi@pycom@network" + weight = 50 + +[[menu.main]] + name = "LTE" + url = "/firmwareapi/pycom/network/lte/" + identifier = "firmwareapi@pycom@network@lte" + parent = "firmwareapi@pycom@network" + weight = 60 + +[[menu.main]] + name = "AES" + url = "/firmwareapi/pycom/aes/" + identifier = "firmwareapi@pycom@aes" + parent = "firmwareapi@pycom" + weight = 30 + +[[menu.main]] + name = "pycom" + url = "/firmwareapi/pycom/pycom/" + identifier = "firmwareapi@pycom@pycom" + parent = "firmwareapi@pycom" + weight = 40 + +[[menu.main]] + name = "MicroPython Modules" + url = "/firmwareapi/micropython/" + identifier = "firmwareapi@micropython" + parent = "firmwareapi" + weight = 20 + +[[menu.main]] + name = "micropython" + url = "/firmwareapi/micropython/micropython/" + identifier = "firmwareapi@micropython@micropython" + parent = "firmwareapi@micropython" + weight = 10 + +[[menu.main]] + name = "uctypes" + url = "/firmwareapi/micropython/uctypes/" + identifier = "firmwareapi@micropython@uctypes" + parent = "firmwareapi@micropython" + weight = 20 + +[[menu.main]] + name = "sys" + url = "/firmwareapi/micropython/sys/" + identifier = "firmwareapi@micropython@sys" + parent = "firmwareapi@micropython" + weight = 30 + +[[menu.main]] + name = "uos" + url = "/firmwareapi/micropython/uos/" + identifier = "firmwareapi@micropython@uos" + parent = "firmwareapi@micropython" + weight = 40 + +[[menu.main]] + name = "array" + url = "/firmwareapi/micropython/array/" + identifier = "firmwareapi@micropython@array" + parent = "firmwareapi@micropython" + weight = 50 + +[[menu.main]] + name = "cmath" + url = "/firmwareapi/micropython/cmath/" + identifier = "firmwareapi@micropython@cmath" + parent = "firmwareapi@micropython" + weight = 60 + +[[menu.main]] + name = "math" + url = "/firmwareapi/micropython/math/" + identifier = "firmwareapi@micropython@math" + parent = "firmwareapi@micropython" + weight = 70 + +[[menu.main]] + name = "gc" + url = "/firmwareapi/micropython/gc/" + identifier = "firmwareapi@micropython@gc" + parent = "firmwareapi@micropython" + weight = 80 + +[[menu.main]] + name = "ubinascii" + url = "/firmwareapi/micropython/ubinascii/" + identifier = "firmwareapi@micropython@ubinascii" + parent = "firmwareapi@micropython" + weight = 90 + +[[menu.main]] + name = "ujson" + url = "/firmwareapi/micropython/ujson/" + identifier = "firmwareapi@micropython@ujson" + parent = "firmwareapi@micropython" + weight = 100 + +[[menu.main]] + name = "ure" + url = "/firmwareapi/micropython/ure/" + identifier = "firmwareapi@micropython@ure" + parent = "firmwareapi@micropython" + weight = 110 + +[[menu.main]] + name = "usocket" + url = "/firmwareapi/micropython/usocket/" + identifier = "firmwareapi@micropython@usocket" + parent = "firmwareapi@micropython" + weight = 120 + +[[menu.main]] + name = "select" + url = "/firmwareapi/micropython/select/" + identifier = "firmwareapi@micropython@select" + parent = "firmwareapi@micropython" + weight = 130 + +[[menu.main]] + name = "utime" + url = "/firmwareapi/micropython/utime/" + identifier = "firmwareapi@micropython@utime" + parent = "firmwareapi@micropython" + weight = 140 + +[[menu.main]] + name = "uhashlib" + url = "/firmwareapi/micropython/uhashlib/" + identifier = "firmwareapi@micropython@uhashlib" + parent = "firmwareapi@micropython" + weight = 150 + +[[menu.main]] + name = "ussl" + url = "/firmwareapi/micropython/ussl/" + identifier = "firmwareapi@micropython@ussl" + parent = "firmwareapi@micropython" + weight = 160 + +[[menu.main]] + name = "ucrypto" + url = "/firmwareapi/micropython/ucrypto/" + identifier = "firmwareapi@micropython@ucrypto" + parent = "firmwareapi@micropython" + weight = 170 + +# [Errno 2] No such file or directory: './content/firmwareapi/micropython/ustruct/README.md' +[[menu.main]] + name = "ustruct" + url = "/firmwareapi/micropython/ustruct/" + identifier = "firmwareapi@micropython@ustruct" + parent = "firmwareapi@micropython" + weight = 180 + +[[menu.main]] + name = "uzlib" + url = "/firmwareapi/micropython/ustruct/uzlib/" + identifier = "firmwareapi@micropython@ustruct@uzlib" + parent = "firmwareapi@micropython@ustruct" + weight = 10 + +[[menu.main]] + name = "_thread" + url = "/firmwareapi/micropython/_thread/" + identifier = "firmwareapi@micropython@_thread" + parent = "firmwareapi@micropython" + weight = 190 + +[[menu.main]] + name = "Builtin" + url = "/firmwareapi/micropython/builtin/" + identifier = "firmwareapi@micropython@builtin" + parent = "firmwareapi@micropython" + weight = 200 + +[[menu.main]] + name = "Notes" + url = "/firmwareapi/notes/" + identifier = "firmwareapi@notes" + parent = "firmwareapi" + weight = 30 + +# *** Product Info, Datasheets +[[menu.main]] + name = "Product Info, Datasheets" + url = "/datasheets/" + identifier = "datasheets" + weight = 80 + +[[menu.main]] + name = "Development Modules" + url = "/datasheets/development/" + identifier = "datasheets@development" + parent = "datasheets" + weight = 10 + +[[menu.main]] + name = "WiPy 2.0" + url = "development/wipy2" + identifier = "datasheets@development@wipy2" + parent = "datasheets@development" + weight = 10 + +[[menu.main]] + name = "WiPy 3.0" + url = "/datasheets/development/wipy3/" + identifier = "datasheets@development@wipy3" + parent = "datasheets@development" + weight = 20 + +[[menu.main]] + name = "LoPy" + url = "/datasheets/development/lopy/" + identifier = "datasheets@development@lopy" + parent = "datasheets@development" + weight = 30 + +[[menu.main]] + name = "LoPy 4" + url = "/datasheets/development/lopy4/" + identifier = "datasheets@development@lopy4" + parent = "datasheets@development" + weight = 40 + +[[menu.main]] + name = "SiPy" + url = "/datasheets/development/sipy/" + identifier = "datasheets@development@sipy" + parent = "datasheets@development" + weight = 50 + +[[menu.main]] + name = "GPy" + url = "/datasheets/development/gpy/" + identifier = "datasheets@development@gpy" + parent = "datasheets@development" + weight = 60 + +[[menu.main]] + name = "FiPy" + url = "/datasheets/development/fipy/" + identifier = "datasheets@development@fipy" + parent = "datasheets@development" + weight = 70 + +[[menu.main]] + name = "OEM Modules" + url = "/datasheets/oem/" + identifier = "datasheets@oem" + parent = "datasheets" + weight = 20 + +[[menu.main]] + name = "W01" + url = "/datasheets/oem/w01/" + identifier = "datasheets@oem@w01" + parent = "datasheets@oem" + weight = 10 + +[[menu.main]] + name = "L01" + url = "/datasheets/oem/l01/" + identifier = "datasheets@oem@l01" + parent = "datasheets@oem" + weight = 20 + +[[menu.main]] + name = "L04" + url = "/datasheets/oem/l04/" + identifier = "datasheets@oem@l04" + parent = "datasheets@oem" + weight = 30 + +[[menu.main]] + name = "G01" + url = "/datasheets/oem/g01/" + identifier = "datasheets@oem@g01" + parent = "datasheets@oem" + weight = 40 + +[[menu.main]] + name = "L01 OEM Baseboard Reference" + url = "/datasheets/oem/l01_reference/" + identifier = "datasheets@oem@l01_reference" + parent = "datasheets@oem" + weight = 50 + +[[menu.main]] + name = "Universal OEM Baseboard Reference" + url = "/datasheets/oem/universal_reference/" + identifier = "datasheets@oem@universal_reference" + parent = "datasheets@oem" + weight = 60 + +[[menu.main]] + name = "Expansion Boards and Shields" + url = "/datasheets/boards/" + identifier = "datasheets@boards" + parent = "datasheets" + weight = 30 + +[[menu.main]] + name = "Expansion Board 3.0" + url = "/datasheets/boards/expansion3/" + identifier = "datasheets@boards@expansion3" + parent = "datasheets@boards" + weight = 10 + +[[menu.main]] + name = "Pytrack" + url = "/datasheets/boards/pytrack/" + identifier = "datasheets@boards@pytrack" + parent = "datasheets@boards" + weight = 20 + +[[menu.main]] + name = "Pysense" + url = "/datasheets/boards/pysense/" + identifier = "datasheets@boards@pysense" + parent = "datasheets@boards" + weight = 30 + +[[menu.main]] + name = "Pyscan" + url = "/datasheets/boards/pyscan/" + identifier = "datasheets@boards@pyscan" + parent = "datasheets@boards" + weight = 40 + +[[menu.main]] + name = "Expansion Board 2.0" + url = "/datasheets/boards/expansion2/" + identifier = "datasheets@boards@expansion2" + parent = "datasheets@boards" + weight = 50 + +[[menu.main]] + name = "Deep Sleep Shield" + url = "/datasheets/boards/deepsleep/" + identifier = "datasheets@boards@deepsleep" + parent = "datasheets@boards" + weight = 60 + +[[menu.main]] + name = "Deep Sleep API" + url = "/datasheets/boards/deepsleep/api/" + identifier = "datasheets@boards@deepsleep@api" + parent = "datasheets@boards@deepsleep" + weight = 10 + +[[menu.main]] + name = "Notes" + url = "/datasheets/notes/" + identifier = "datasheets@notes" + parent = "datasheets" + weight = 40 + +# *** Pybytes +[[menu.main]] + name = "Pybytes" + url = "/pybytes/" + identifier = "pybytes" + weight = 90 + +[[menu.main]] + name = "Getting Started with Pybytes" + url = "/pybytes/getstarted/" + identifier = "pybytes@getstarted" + parent = "pybytes" + weight = 10 + +[[menu.main]] + name = "Add a device to Pybytes" + url = "/pybytes/connect/" + identifier = "pybytes@connect" + parent = "pybytes" + weight = 20 + +[[menu.main]] + name = "Connect to Pybytes: Quick Add" + url = "/pybytes/connect/quick/" + identifier = "pybytes@connect@quick" + parent = "pybytes@connect" + weight = 10 + +[[menu.main]] + name = "Connect to Pybytes: Flash Pybytes library manually" + url = "/pybytes/connect/flash/" + identifier = "pybytes@connect@flash" + parent = "pybytes@connect" + weight = 20 + +[[menu.main]] + name = "Add Sigfox device" + url = "/pybytes/connect/sigfox/" + identifier = "pybytes@connect@sigfox" + parent = "pybytes@connect" + weight = 30 + +[[menu.main]] + name = "DevKit contract" + url = "/pybytes/connect/sigfox/devkit/" + identifier = "pybytes@connect@sigfox@devkit" + parent = "pybytes@connect@sigfox" + weight = 10 + +[[menu.main]] + name = "Custom contract" + url = "/pybytes/connect/sigfox/custom/" + identifier = "pybytes@connect@sigfox@custom" + parent = "pybytes@connect@sigfox" + weight = 20 + +[[menu.main]] + name = "Visualise data from your device" + url = "/pybytes/dashboard/" + identifier = "pybytes@dashboard" + parent = "pybytes" + weight = 30 + +[[menu.main]] + name = "Integrations" + url = "/pybytes/integrations/" + identifier = "pybytes@integrations" + parent = "pybytes" + weight = 40 + +[[menu.main]] + name = "Amazon IoT" + url = "/pybytes/integrations/amazon-iot/" + identifier = "pybytes@integrations@amazon-iot" + parent = "pybytes@integrations" + weight = 10 + +# *** Documentation Notes +[[menu.main]] + name = "Documentation Notes" + url = "/docnotes/" + identifier = "docnotes" + weight = 100 + +[[menu.main]] + name = "Syntax" + url = "/docnotes/syntax/" + identifier = "docnotes@syntax" + parent = "docnotes" + weight = 10 + +[[menu.main]] + name = "REPL vs Scripts" + url = "/docnotes/replscript/" + identifier = "docnotes@replscript" + parent = "docnotes" + weight = 20 + +[[menu.main]] + name = "Mesh Networks" + url = "/docnotes/mesh-networks/" + identifier = "docnotes@mesh-networks" + parent = "docnotes" + weight = 30 + +# *** Advanced Topics +[[menu.main]] + name = "Advanced topics" + url = "/advance/downgrade/" + identifier = "advance" + weight = 150 + +[[menu.main]] + name = "Firmware Downgrade" + url = "/advance/downgrade/" + identifier = "advance@downgrade" + parent = "advance" + weight = 10 + +[[menu.main]] + name = "CLI Updater" + url = "/advance/cli/" + identifier = "advance@cli" + parent = "advance" + weight = 20 + +[[menu.main]] + name = "SecureBoot and Encryption" + url = "/advance/encryption/" + identifier = "advance@encryption" + parent = "advance" + weight = 30 + +[[menu.main]] + name = "License" + url = "/advance/license/" + identifier = "advance@license" + parent = "advance" + weight = 40 diff --git a/content/.DS_Store b/content/.DS_Store new file mode 100644 index 0000000..38caf83 Binary files /dev/null and b/content/.DS_Store differ diff --git a/content/README.md b/content/README.md new file mode 100644 index 0000000..ad918df --- /dev/null +++ b/content/README.md @@ -0,0 +1,15 @@ +--- +title: "Introduction" +aliases: +--- +Welcome to the Pycom documentation site. We recommend reading through all the sections to familiarise yourself with the various tools and features available to you to help you develop on your Pycom module. + +To get started, read through the Getting Started guide then feel free to jump straight into the tutorials and examples in Tutorials & Examples to begin building your projects. + +* [Products](products) +* [Getting Started](gettingstarted/introduction) +* [Tutorials](tutorials/introduction) +* [Product Info](datasheets/introduction) +* [API Documentation](firmwareapi/introduction) +* [Pybytes](pybytes/introduction) + diff --git a/content/SUMMARY.md b/content/SUMMARY.md new file mode 100644 index 0000000..ef5781b --- /dev/null +++ b/content/SUMMARY.md @@ -0,0 +1,221 @@ +--- +title: "" +aliases: + - SUMMARY.html + - SUMMARY.md +--- +* [Introduction](README) +* [Pycom Products](products) + +## Getting Started + +* [Introduction](gettingstarted/introduction) +* [Hardware Setup](gettingstarted/connection/README) + * [LoPy](gettingstarted/connection/lopy) + * [LoPy 4](gettingstarted/connection/lopy4) + * [SiPy](gettingstarted/connection/sipy) + * [GPy](gettingstarted/connection/gpy) + * [FiPy](gettingstarted/connection/fipy) + * [WiPy](gettingstarted/connection/wipy) +* [Software](gettingstarted/installation/README) + * [Drivers](gettingstarted/installation/drivers) + * [Updating Firmware](gettingstarted/installation/firmwaretool) + * [Pymakr](gettingstarted/installation/pymakr) +* [Programming the modules](gettingstarted/programming/README) + * [Introduction to MicroPython](gettingstarted/programming/micropython) + * [MicroPython Examples](gettingstarted/programming/examples) + * [Your first Pymakr project](gettingstarted/programming/first-project) + * [REPL](gettingstarted/programming/repl/README) + * [Serial USB (UART)](gettingstarted/programming/repl/serial) + * [Telnet REPL](gettingstarted/programming/repl/telnet) + * [FTP](gettingstarted/programming/ftp) + * [Safe boot](gettingstarted/programming/safeboot) +* [Device Registration](gettingstarted/registration/README) + * [Sigfox](gettingstarted/registration/sigfox) + * [Cellular](gettingstarted/registration/cellular) + * [LoRaWAN](gettingstarted/registration/lora/README) + * [The Things Network](gettingstarted/registration/lora/ttn) + * [Objenious](gettingstarted/registration/lora/objenious) + +## Pymakr Plugin + +* [Installation](pymakr/installation/README) + * [Atom](pymakr/installation/atom) + * [Visual Studio Code](pymakr/installation/vscode) +* [Tools/Features](pymakr/toolsfeatures) +* [Settings](pymakr/settings) + +## Pytrack, Pysense, Pyscan + +* [Introduction](pytrackpysense/introduction) +* [Installing Software](pytrackpysense/installation/README) + * [Updating Firmware](pytrackpysense/installation/firmware) + * [Installing Drivers - Windows 7](pytrackpysense/installation/drivers) + * [Installing Libraries](pytrackpysense/installation/libraries) +* [API Reference](pytrackpysense/apireference/README) + * [Pytrack](pytrackpysense/apireference/pytrack) + * [Pysense](pytrackpysense/apireference/pysense) + * [Pyscan](pytrackpysense/apireference/pyscan) + * [Sleep](pytrackpysense/apireference/sleep) + +## Tutorials & Examples + +* [Introduction](tutorials/introduction) +* [All Pycom Device Examples](tutorials/all/README) + * [REPL](tutorials/all/repl) + * [WLAN](tutorials/all/wlan) + * [Bluetooth](tutorials/all/ble) + * [HTTPS](tutorials/all/https) + * [MQTT](tutorials/all/mqtt) + * [AWS](tutorials/all/aws) + * [ADC](tutorials/all/adc) + * [I2C](tutorials/all/i2c) + * [Onewire Driver](tutorials/all/owd) + * [Threading](tutorials/all/threading) + * [RGB LED](tutorials/all/rgbled) + * [Timers](tutorials/all/timers) + * [PIR Sensor](tutorials/all/pir) + * [Modbus](tutorials/all/modbus) + * [OTA update](tutorials/all/ota) + * [RMT](tutorials/all/rmt) + * [Socket](tutorials/all/socket) + * [Touch](tutorials/all/touch) + +* [LoRa Examples](tutorials/lora/README) + * [LoRa-MAC (Raw LoRa)](tutorials/lora/lora-mac) + * [LoRaWAN with OTAA](tutorials/lora/lorawan-otaa) + * [LoRaWAN with ABP](tutorials/lora/lorawan-abp) + * [LoRa-MAC Nano-Gateway](tutorials/lora/lora-mac-nano-gateway) + * [LoPy to LoPy](tutorials/lora/module-module) + * [LoRaWAN Nano-Gateway](tutorials/lora/lorawan-nano-gateway) + * [RN2483 to LoPy](tutorials/lora/rn2483-to-lopy) + * [LoRa Mesh](tutorials/lora/lora-mesh) + * [PyMesh Border Router](tutorials/lora/pymesh-br) + +* [Sigfox Examples](tutorials/sigfox) +* [LTE Examples](tutorials/lte/README) + * [CAT-M1](tutorials/lte/cat-m1) + * [NB-IoT](tutorials/lte/nb-iot) + * [Module IMEI](tutorials/lte/imei) + * [Modem Firmware Update](tutorials/lte/firmware) +* [Pytrack Examples](tutorials/pytrack) +* [Pysense Examples](tutorials/pysense) +* [Pyscan Examples](tutorials/pyscan) + +## Firmware & API Reference + +* [Introduction](firmwareapi/introduction) +* [Pycom Modules](firmwareapi/pycom/README) + * [machine](firmwareapi/pycom/machine/README) + * [ADC](firmwareapi/pycom/machine/adc) + * [DAC](firmwareapi/pycom/machine/dac) + * [I2C](firmwareapi/pycom/machine/i2c) + * [Pin](firmwareapi/pycom/machine/pin) + * [PWM](firmwareapi/pycom/machine/pwm) + * [RTC](firmwareapi/pycom/machine/rtc) + * [SPI](firmwareapi/pycom/machine/spi) + * [UART](firmwareapi/pycom/machine/uart) + * [WDT](firmwareapi/pycom/machine/wdt) + * [Timer](firmwareapi/pycom/machine/timer) + * [SD](firmwareapi/pycom/machine/sd) + * [CAN](firmwareapi/pycom/machine/can) + * [RMT](firmwareapi/pycom/machine/rmt) + * [network](firmwareapi/pycom/network/README) + * [WLAN](firmwareapi/pycom/network/wlan) + * [Server](firmwareapi/pycom/network/server) + * [Bluetooth](firmwareapi/pycom/network/bluetooth/README) + * [GATT](firmwareapi/pycom/network/bluetooth/gatt) + * [GATTCConnection](firmwareapi/pycom/network/bluetooth/gattcconnection) + * [GATTCService](firmwareapi/pycom/network/bluetooth/gattccservice) + * [GATTCCharacteristic](firmwareapi/pycom/network/bluetooth/gattccharacteristic) + * [GATTSService](firmwareapi/pycom/network/bluetooth/gattsservice) + * [GATTSCharacteristic](firmwareapi/pycom/network/bluetooth/gattscharacteristic) + * [LoRa](firmwareapi/pycom/network/lora/README) + * [Pymesh](firmwareapi/pycom/network/lora/pymesh) + * [Sigfox](firmwareapi/pycom/network/sigfox) + * [LTE](firmwareapi/pycom/network/lte) + * [AES](firmwareapi/pycom/aes) + * [pycom](firmwareapi/pycom/pycom) +* [MicroPython Modules](firmwareapi/micropython/README) + * [micropython](firmwareapi/micropython/micropython) + * [uctypes](firmwareapi/micropython/uctypes) + * [sys](firmwareapi/micropython/sys) + * [uos](firmwareapi/micropython/uos) + * [array](firmwareapi/micropython/array) + * [cmath](firmwareapi/micropython/cmath) + * [math](firmwareapi/micropython/math) + * [gc](firmwareapi/micropython/gc) + * [ubinascii](firmwareapi/micropython/ubinascii) + * [ujson](firmwareapi/micropython/ujson) + * [ure](firmwareapi/micropython/ure) + * [usocket](firmwareapi/micropython/usocket) + * [select](firmwareapi/micropython/select) + * [utime](firmwareapi/micropython/utime) + * [uhashlib](firmwareapi/micropython/uhashlib) + * [ussl](firmwareapi/micropython/ussl) + * [ucrypto](firmwareapi/micropython/ucrypto) + * [ustruct](firmwareapi/micropython/ustruct/README) + * [uzlib](firmwareapi/micropython/ustruct/uzlib) + * [\_thread](firmwareapi/micropython/_thread) + * [Builtin](firmwareapi/micropython/builtin) +* [Notes](firmwareapi/notes) + +## Product Info, Datasheets + +* [Introduction](datasheets/introduction) +* [Development Modules](datasheets/development/README) + * [WiPy 2.0](datasheets/development/wipy2) + * [WiPy 3.0](datasheets/development/wipy3) + * [LoPy](datasheets/development/lopy) + * [LoPy 4](datasheets/development/lopy4) + * [SiPy](datasheets/development/sipy) + * [GPy](datasheets/development/gpy) + * [FiPy](datasheets/development/fipy) +* [OEM Modules](datasheets/oem/README) + * [W01](datasheets/oem/w01) + * [L01](datasheets/oem/l01) + * [L04](datasheets/oem/l04) + * [G01](datasheets/oem/g01) + * [L01 OEM Baseboard Reference](datasheets/oem/l01_reference) + * [Universal OEM Baseboard Reference](datasheets/oem/universal_reference) +* [Expansion Boards and Shields](datasheets/boards/README) + * [Expansion Board 3.0](datasheets/boards/expansion3) + * [Pytrack](datasheets/boards/pytrack) + * [Pysense](datasheets/boards/pysense) + * [Pyscan](datasheets/boards/pyscan) + * [Expansion Board 2.0](datasheets/boards/expansion2) + * [Deep Sleep Shield](datasheets/boards/deepsleep/README) + * [Deep Sleep API](datasheets/boards/deepsleep/api) +* [Notes](datasheets/notes) + +## Pybytes + +* [Introduction](pybytes/introduction) +* [Getting Started with Pybytes](pybytes/getstarted) +* [Add a device to Pybytes](pybytes/connect/README) + * [Connect to Pybytes: Quick Add](pybytes/connect/quick) + * [Connect to Pybytes: Flash Pybytes library manually](pybytes/connect/flash) + * [Add Sigfox device](pybytes/connect/sigfox/README) + * [DevKit contract](pybytes/connect/sigfox/devkit) + * [Custom contract](pybytes/connect/sigfox/custom) +* [Visualise data from your device](pybytes/dashboard) +* [Integrations](pybytes/integrations/README) + * [Amazon IoT](pybytes/integrations/amazon-iot) + +## Documentation Notes + +* [Introduction](docnotes/introduction) +* [Syntax](docnotes/syntax) +* [REPL vs Scripts](docnotes/replscript) +* [Mesh Networks](docnotes/mesh-networks) + +## Advanced Topics + +* [Firmware Downgrade](advance/downgrade) +* [CLI Updater](advance/cli) +* [SecureBoot and Encryption](advance/encryption) +* [License](advance/license) + +## Have a question? + +* [Ask on the Forum](https://forum.pycom.io) diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..ad918df --- /dev/null +++ b/content/_index.md @@ -0,0 +1,15 @@ +--- +title: "Introduction" +aliases: +--- +Welcome to the Pycom documentation site. We recommend reading through all the sections to familiarise yourself with the various tools and features available to you to help you develop on your Pycom module. + +To get started, read through the Getting Started guide then feel free to jump straight into the tutorials and examples in Tutorials & Examples to begin building your projects. + +* [Products](products) +* [Getting Started](gettingstarted/introduction) +* [Tutorials](tutorials/introduction) +* [Product Info](datasheets/introduction) +* [API Documentation](firmwareapi/introduction) +* [Pybytes](pybytes/introduction) + diff --git a/advance/cli.md b/content/advance/cli.md similarity index 93% rename from advance/cli.md rename to content/advance/cli.md index 75aaafd..91297cf 100644 --- a/advance/cli.md +++ b/content/advance/cli.md @@ -1,5 +1,10 @@ -# CLI Updater - +--- +title: "CLI Updater" +aliases: + - advance/cli.html + - advance/cli.md + - chapter/advance/cli +--- ## Command Line Update Utility #### Windows @@ -15,7 +20,7 @@ In order to get access to the CLI tool on macOS, you will need to right click on #### Linux -In the [Ubuntu 14.04 LTS](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=unix&redirect=true) \(and newer\) version of the updater tool, `pycom-fwtool-cli` is installed in `/usr/local/bin`. In the [Generic Linux](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=unix&redirect=true) package, the tool is extracted into folder `./pyupgrade` +In the [Ubuntu 14.04 LTS](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=unix&redirect=true) (and newer) version of the updater tool, `pycom-fwtool-cli` is installed in `/usr/local/bin`. In the [Generic Linux](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=unix&redirect=true) package, the tool is extracted into folder `./pyupgrade` ### Usage @@ -65,7 +70,7 @@ optional arguments: ## How to use the Parameters -{% hint style="info" %} +{{{% hint style="info" %}}} The CLI tool uses a combination of global and command specific parameters. The **order of parameters** is **important** to avoid ambiguity. `pycom-fwtool-cli [global parameters] [command] [command parameters]` @@ -73,7 +78,7 @@ The CLI tool uses a combination of global and command specific parameters. The * While `pycom-fwtool-cli -h` shows help for global parameters and a list of available commands, command specific parameters can be viewed using `pycom-fwtool-cli [command] -h` The parameter `-r, --reset` has been added as a courtesy for users of 3rd party ESP32 products. This functionality is **not supported** by the Expansion Board 2.0 and may cause this tool to crash or hang in certain circumstances. -{% endhint %} +{{< /hint >}} ### Global Parameters @@ -118,7 +123,7 @@ On Windows: COM6 [Pytrack] [USB VID:PID=04D8:F013 SER=Py343434 LOCATION=20-2] ``` -{% hint style="info" %} +{{{% hint style="info" %}}} This is the only command that does not require any additional parameters. All other commands require that **the serial port is specified either through the** `-p` **/** `--port` **option or through environment variable** `ESPPORT` You can optionally specify the speed either through `-s` / `--speed` or via environment variable `ESPBAUD`. The default speed is `921600`. The maximum speed for read operations on PIC based expansion boards & shields is `230400`. The speed will be reduced automatically if necessary. @@ -126,7 +131,7 @@ All other commands require that **the serial port is specified either through th #### Special note for Expansion Board 2.0 You will need to have a **jumper wire** connected between `G23` and `GND` to use any of the commands below. You will also need to **press the reset button** either before running each command or at least before running the first command. To avoid having to press the reset button again after each command, you can use the `-c` / `--continuation` option. The first command connecting to the device **MUST NOT** use the `-c` / `--continuation` option. This is to make sure a program called `_stub_` is uploaded onto the device. This `_stub_` cannot be uploaded more than once, so you need to tell the cli tool that the `_stub_` is already running, which is done through using the `-c` / `--continuation` option. -{% endhint %} +{{< /hint >}} #### chip\_id @@ -259,13 +264,13 @@ optional arguments: Set extra preferences ``` -{% hint style="info" %} -Note: The local `pybytes_config.json` file is overwritten when making any modifications using this command \(requires Pybytes firmware `1.17.5.b6` or higher and Firmware updater `1.14.3`\). -{% endhint %} +{{{% hint style="info" %}}} +Note: The local `pybytes_config.json` file is overwritten when making any modifications using this command (requires Pybytes firmware `1.17.5.b6` or higher and Firmware updater `1.14.3`). +{{< /hint >}} #### cb -Read/Write config block \(LPMAC, Sigfox PAC & ID, etc.\). You can find the structure of this block [here.](https://github.com/pycom/pycom-micropython-sigfox/blob/master/esp32/pycom_config.h#L24) +Read/Write config block (LPMAC, Sigfox PAC & ID, etc.). You can find the structure of this block [here.](https://github.com/pycom/pycom-micropython-sigfox/blob/master/esp32/pycom_config.h#L24) ```text usage: pycom-fwtool-cli -p PORT cb [-h] [-f FILE] [-b] [-r] @@ -325,7 +330,7 @@ To restore your OTA block: `$pycom-fwtool-cli -p PORT ota -r -f backup.ota` #### lpwan -Get/Set LPWAN parameters saved to non-volatile storage. Please see [here](../firmwareapi/pycom/network/lora.md##loranvramsave) for more details. +Get/Set LPWAN parameters saved to non-volatile storage. Please see [here](/firmwareapi/pycom/network/lora.md##loranvramsave) for more details. ```text usage: pycom-fwtool-cli -p PORT lpwan [-h] [--region REGION] diff --git a/advance/downgrade.md b/content/advance/downgrade.md similarity index 74% rename from advance/downgrade.md rename to content/advance/downgrade.md index f91ffe1..0ffddfd 100644 --- a/advance/downgrade.md +++ b/content/advance/downgrade.md @@ -1,10 +1,15 @@ -# Firmware Downgrade - +--- +title: "Firmware Downgrade" +aliases: + - advance/downgrade.html + - advance/downgrade.md + - chapter/advance/downgrade +--- The firmware upgrade tool usually updates your device to the latest available firmware version. If you require to downgrade your device to a previous firmware there are two methods to achieve this. -{% hint style="info" %} +{{{% hint style="info" %}}} If you are using an Expansion Board 1.0 or 2.0, you will need to have a jumper connected between `G23` and `GND` to use either procedure below. You will also need to press the reset button before beginning. -{% endhint %} +{{< /hint >}} You can obtain previous firmware versions here: @@ -15,9 +20,9 @@ You can obtain previous firmware versions here: * [FiPy](https://software.pycom.io/downloads/FiPy.html) * [LoPy4](https://software.pycom.io/downloads/LoPy4.html) -{% hint style="info" %} -Prior to version `1.16.0.b1` the firmware for modules with LoRa functionality was frequency specific. From `1.16.0.b1` and onward, the firmware is region agnostic and this can either be set programatically or via the config block \(see [here](cli.md#lpwan)\). -{% endhint %} +{{{% hint style="info" %}}} +Prior to version `1.16.0.b1` the firmware for modules with LoRa functionality was frequency specific. From `1.16.0.b1` and onward, the firmware is region agnostic and this can either be set programatically or via the config block (see [here](cli.md#lpwan)). +{{< /hint >}} ## GUI @@ -25,13 +30,13 @@ As of version `1.12.0.b0` of the firmware update tool, you can now provide a `.t When you start the update tool you will see the following screen: -![](../.gitbook/assets/downgrade_gui%20%281%29.png) +![](/gitbook/assets/downgrade_gui%20%281%29.png) When you tick the `Flash from local file` option, an address bar will appear. Click the `...` button and locate the `.tar(.gz)` file with the firmware you wish to flash to your device. From this point the updater will behave just like a regular update but using the local file instead of downloading the latest. ## Command line -You can also use the [CLI](cli.md) version of the update tool to downgrade your device. Will need to get a `.tar` or `.tar.gz` archive of the firmware you wish to upload to the board. Then run the following commands: +You can also use the [CLI](cli) version of the update tool to downgrade your device. Will need to get a `.tar` or `.tar.gz` archive of the firmware you wish to upload to the board. Then run the following commands: ```bash $ pycom-fwtool-cli -v -p PORT flash -t /path/to/firmware/archive.tar.gz diff --git a/advance/encryption.md b/content/advance/encryption.md similarity index 85% rename from advance/encryption.md rename to content/advance/encryption.md index da3800a..c1737e6 100644 --- a/advance/encryption.md +++ b/content/advance/encryption.md @@ -1,13 +1,18 @@ -# SecureBoot and Encryption - +--- +title: "SecureBoot and Encryption" +aliases: + - advance/encryption.html + - advance/encryption.md + - chapter/advance/encryption +--- ## Summary In order to encrypt your firmware, you will need to build it from source. Our firmware source code can be found [here](https://github.com/pycom/pycom-micropython-sigfox/), along with instructions on how to build it. Below you will find specific instructions on how generate keys, build and flash encrypted firmware. -1. Obtain keys \(for Secure Boot and Flash Encryption\) +1. Obtain keys (for Secure Boot and Flash Encryption) 2. Flash keys and parameters in `efuses` 3. Compile bootloader and application with `make SECURE=on` -4. Flash: bootloader-digest at address `0x0` and encrypted; all the others \(partitions and application\) encrypted, too. +4. Flash: bootloader-digest at address `0x0` and encrypted; all the others (partitions and application) encrypted, too. ## Prerequisites @@ -32,7 +37,7 @@ or, as an artifact of the make build process, on the same directory level as Mak make BOARD=GPY SECURE=on TARGET=boot ``` -To flash the keys \(`flash_encryption_key.bin` and `secure-bootloader-key.bin`\) into the efuses \(write and read protected\) run the following commands \(ignoring the lines that start with `#`\): +To flash the keys (`flash_encryption_key.bin` and `secure-bootloader-key.bin`) into the efuses (write and read protected) run the following commands (ignoring the lines that start with `#`): _**Note: Irreversible operations**_ @@ -49,7 +54,7 @@ python $IDF_PATH/components/esptool_py/esptool/espefuse.py --port /dev/ttyUSB0 b python $IDF_PATH/components/esptool_py/esptool/espefuse.py --port /dev/ttyUSB0 burn_efuse ABS_DONE_0 ``` -**If the keys are not written in efuse, before flashing the bootloader, then random keys will be generated by the ESP32, they can never be read nor re-written, so bootloader can never be updated. Even more, the application can be re-flashed \(by USB\) just 3 more times.** +**If the keys are not written in efuse, before flashing the bootloader, then random keys will be generated by the ESP32, they can never be read nor re-written, so bootloader can never be updated. Even more, the application can be re-flashed (by USB) just 3 more times.** ## Makefile options @@ -71,7 +76,7 @@ make BOARD=GPY SECURE=on flash ## Flashing -For flashing the `bootloader-reflash-digest.bin` has to be written at address 0x0, instead of the `bootloader.bin` \(at address `0x1000`\). +For flashing the `bootloader-reflash-digest.bin` has to be written at address 0x0, instead of the `bootloader.bin` (at address `0x1000`). Build is done using `SECURE=on` option; additionally, all the binaries are pre-encrypted. @@ -95,9 +100,9 @@ The OTA should be done using the pre-encrypted application image. Because the encryption is done based on the physical flash address, there are 2 application binaries generated: * `gpy.bin_enc_0x10000` which has to be written at default factory address: `0x10000` -* `gpy.bin_enc_0x1A0000` which has to be written at the `ota_0` partition address \(`0x1A0000`\) +* `gpy.bin_enc_0x1A0000` which has to be written at the `ota_0` partition address (`0x1A0000`) -{% hint style="info" %} -Hint: on MicroPython interface, the method `pycom.ota_slot()` responds with the address of the next OTA partition available \(either `0x10000` or `0x1A0000`\). -{% endhint %} +{{{% hint style="info" %}}} +Hint: on MicroPython interface, the method `pycom.ota_slot()` responds with the address of the next OTA partition available (either `0x10000` or `0x1A0000`). +{{< /hint >}} diff --git a/advance/license.md b/content/advance/license.md similarity index 66% rename from advance/license.md rename to content/advance/license.md index 2d64517..f1658cf 100644 --- a/advance/license.md +++ b/content/advance/license.md @@ -1,16 +1,20 @@ -# License +--- +title: "License" +aliases: + - advance/license.html + - advance/license.md +--- +The MIT License (MIT) -The MIT License \(MIT\) +Copyright (c) 2013-2015 Damien P. George, and others -Copyright \(c\) 2013-2015 Damien P. George, and others - -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: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Copyright \(c\) 2017, Pycom Limited. +Copyright (c) 2017, Pycom Limited. This software is licensed under the GNU GPL version 3 or any later version, with permitted additional terms. For more information see the Pycom Licence v1.0 document supplied with this file, or available at [https://www.pycom.io/opensource/licensing](https://www.pycom.io/opensource/licensing) diff --git a/content/datasheets/_index.md b/content/datasheets/_index.md new file mode 100644 index 0000000..2b96c53 --- /dev/null +++ b/content/datasheets/_index.md @@ -0,0 +1,48 @@ +--- +title: "" +aliases: +--- +The follow pages contain all information relating to each product, for examples: pinouts, spec sheets, relevant examples and notes. + +## Development Modules + +{{% refname "development/wipy2.md" %}} + +{{% refname "development/wipy3.md" %}} + +{{% refname "development/lopy.md" %}} + +{{% refname "development/lopy4.md" %}} + +{{% refname "development/sipy.md" %}} + +{{% refname "development/gpy.md" %}} + +{{% refname "development/fipy.md" %}} + +## OEM modules + +{{% refname "oem/w01.md" %}} + +{{% refname "oem/l01.md" %}} + +{{% refname "oem/g01.md" %}} + +{{% refname "oem/l01\_reference.md" %}} + +{{% refname "oem/universal\_reference.md" %}} + +## Expansion Boards and Shields + +{{% refname "boards/expansion3.md" %}} + +{{% refname "boards/pytrack.md" %}} + +{{% refname "boards/pysense.md" %}} + +{{% refname "boards/pyscan.md" %}} + +{{% refname "boards/expansion2.md" %}} + +{{% refname "boards/deepsleep/" %}} + diff --git a/content/datasheets/boards/README.md b/content/datasheets/boards/README.md new file mode 100644 index 0000000..4f25554 --- /dev/null +++ b/content/datasheets/boards/README.md @@ -0,0 +1,20 @@ +--- +title: "Expansion Boards and Shields" +aliases: + - product-info/boards + - chapter/datasheets/boards +--- +This section contains all of the datasheets for the Pycom Expansion Boards and Shields. This includes the Expansion Board, Pytrack, Pysense and Deep Sleep Shield. + +{{% refname "expansion3.md" %}} + +{{% refname "pytrack.md" %}} + +{{% refname "pysense.md" %}} + +{{% refname "pyscan.md" %}} + +{{% refname "expansion2.md" %}} + +{{% refname "deepsleep/" %}} + diff --git a/content/datasheets/boards/_index.md b/content/datasheets/boards/_index.md new file mode 100644 index 0000000..65f5ac8 --- /dev/null +++ b/content/datasheets/boards/_index.md @@ -0,0 +1,18 @@ +--- +title: "Expansion Boards and Shields" +aliases: +--- +This section contains all of the datasheets for the Pycom Expansion Boards and Shields. This includes the Expansion Board, Pytrack, Pysense and Deep Sleep Shield. + +{{% refname "expansion3.md" %}} + +{{% refname "pytrack.md" %}} + +{{% refname "pysense.md" %}} + +{{% refname "pyscan.md" %}} + +{{% refname "expansion2.md" %}} + +{{% refname "deepsleep/" %}} + diff --git a/content/datasheets/boards/deepsleep/README.md b/content/datasheets/boards/deepsleep/README.md new file mode 100644 index 0000000..837adde --- /dev/null +++ b/content/datasheets/boards/deepsleep/README.md @@ -0,0 +1,24 @@ +--- +title: "Deep Sleep Shield" +aliases: + - product-info/boards/deepsleep + - chapter/datasheets/boards/deepsleep +--- +The schematic of the Deep Sleep Shield is available as a PDF File. + +{% file src="..//gitbook/assets/deepsleep-schematic.pdf" caption="Deep Sleep Schematic" %} + +## Pinout + +The pinout of the Deep Sleep Shield is available as a PDF File + +{% file src="..//gitbook/assets/deepsleep-pinout.pdf" caption="Deep Sleep Pinout" %} + +![](//gitbook/assets/deepsleep-pinout%20%281%29.png) + +{{{% hint style="info" %}}} +To correctly connect a WiPy 2.0, LoPy or SiPy to the Deep Sleep Shield, align the white triangle on the Shield with the LED of the Pycom Device. Once the Pycom Device is seated onto the Deep Sleep Shield, this can then be connected to the Expansion Board +{{< /hint >}} + +![](//gitbook/assets/deepsleep-image-1.jpg) + diff --git a/datasheets/boards/deepsleep/README.md b/content/datasheets/boards/deepsleep/_index.md similarity index 52% rename from datasheets/boards/deepsleep/README.md rename to content/datasheets/boards/deepsleep/_index.md index 5e075ce..787b08a 100644 --- a/datasheets/boards/deepsleep/README.md +++ b/content/datasheets/boards/deepsleep/_index.md @@ -1,20 +1,22 @@ -# Deep Sleep Shield - +--- +title: "Deep Sleep Shield" +aliases: +--- The schematic of the Deep Sleep Shield is available as a PDF File. -{% file src="../../../.gitbook/assets/deepsleep-schematic.pdf" caption="Deep Sleep Schematic" %} +{% file src="..//gitbook/assets/deepsleep-schematic.pdf" caption="Deep Sleep Schematic" %} ## Pinout The pinout of the Deep Sleep Shield is available as a PDF File -{% file src="../../../.gitbook/assets/deepsleep-pinout.pdf" caption="Deep Sleep Pinout" %} +{% file src="..//gitbook/assets/deepsleep-pinout.pdf" caption="Deep Sleep Pinout" %} -![](../../../.gitbook/assets/deepsleep-pinout%20%281%29.png) +![](//gitbook/assets/deepsleep-pinout%20%281%29.png) -{% hint style="info" %} +{{{% hint style="info" %}}} To correctly connect a WiPy 2.0, LoPy or SiPy to the Deep Sleep Shield, align the white triangle on the Shield with the LED of the Pycom Device. Once the Pycom Device is seated onto the Deep Sleep Shield, this can then be connected to the Expansion Board -{% endhint %} +{{< /hint >}} -![](../../../.gitbook/assets/deepsleep-image-1.jpg) +![](//gitbook/assets/deepsleep-image-1.jpg) diff --git a/datasheets/boards/deepsleep/api.md b/content/datasheets/boards/deepsleep/api.md similarity index 75% rename from datasheets/boards/deepsleep/api.md rename to content/datasheets/boards/deepsleep/api.md index 9106580..0981278 100644 --- a/datasheets/boards/deepsleep/api.md +++ b/content/datasheets/boards/deepsleep/api.md @@ -1,5 +1,11 @@ -# Deep Sleep API - +--- +title: "Deep Sleep API" +aliases: + - datasheets/boards/deepsleep/api.html + - datasheets/boards/deepsleep/api.md + - product-info/boards/deepsleep/api + - chapter/datasheets/boards/deepsleep/api +--- This chapter describes the library which controls the Deep Sleep Shield. This includes the controls for external interrupts and timer setup of the deep sleep functionality. To use this library, please upload the associated [Deep Sleep Library](https://github.com/pycom/pycom-libraries/tree/master/deepsleep) to `/lib` on the target Pycom device. @@ -31,11 +37,11 @@ ds.go_to_sleep(60) # go to sleep for 60 seconds ## DeepSleep -The Deep Sleep Shield allows for waking up via a user trigger and also via an external interrupt \(i.e. Accelerometer, Button\). +The Deep Sleep Shield allows for waking up via a user trigger and also via an external interrupt (i.e. Accelerometer, Button). ### Constructors -#### class DeepSleep\(\) +#### class DeepSleep() Creates a DeepSleep object, that will control the board's sleep features. For example; @@ -45,51 +51,51 @@ ds = DeepSleep() ### Methods -#### deepsleep.enable\_auto\_poweroff\(\) +#### deepsleep.enable\_auto\_poweroff() -This method allows for a critical battery voltage to be set. For example, if the external power source \(e.g. LiPo Cell\) falls below `3.3V`, turn off the Pycom device. This is intended to protect the hardware from under voltage. +This method allows for a critical battery voltage to be set. For example, if the external power source (e.g. LiPo Cell) falls below `3.3V`, turn off the Pycom device. This is intended to protect the hardware from under voltage. -#### deepsleep.enable\_pullups\(pins\) +#### deepsleep.enable\_pullups(pins) This method allows for pull-up pins to be enabled. For example, if an external trigger occurs, wake the Pycom device from Deep Sleep. `pins` may be passed into the method as a list, i.e. `['P17', 'P18']`. -#### deepsleep.disable\_pullups\(pins\) +#### deepsleep.disable\_pullups(pins) This method allows for pull-up pins to be disabled. For example, if an external trigger occurs, wake the Pycom device from Deep Sleep. `pins` may be passed into the method as a list, i.e. `['P17', 'P18']`. -#### deepsleep.enable\_wake\_on\_raise\(pins\) +#### deepsleep.enable\_wake\_on\_raise(pins) This method allows for pull-up pins to trigger on a rising voltage. For example, if an external rising voltage triggers occurs, wake the Pycom device from Deep Sleep. `pins` may be passed into the method as a list, i.e. `['P17', 'P18']`. -#### deepsleep.disable\_wake\_on\_raise\(pins\) +#### deepsleep.disable\_wake\_on\_raise(pins) This method allows for disabling pull-up pins that trigger on a rising voltage. `pins` may be passed into the method as a list, i.e. `['P17', 'P18']`. -#### deepsleep.enable\_wake\_on\_fall\(pins\) +#### deepsleep.enable\_wake\_on\_fall(pins) This method allows for pull-up pins to trigger on a falling voltage. For example, if an external falling voltage triggers occurs, wake the Pycom device from Deep Sleep. `pins` may be passed into the method as a list, i.e. `['P17', 'P18']`. -#### deepsleep.disable\_wake\_on\_fall\(pins\) +#### deepsleep.disable\_wake\_on\_fall(pins) This method allows for disabling pull-up pins that trigger on a falling voltage. `pins` may be passed into the method as a list, i.e. `['P17', 'P18']`. -#### deepsleep.get\_wake\_status\(\) +#### deepsleep.get\_wake\_status() This method returns the status of the pins at wakeup from deep sleep. The method returns a `dict` with the states of `wake`, `P10`, `P17`, `P18`. -#### deepsleep.set\_min\_voltage\_limit\(value\) +#### deepsleep.set\_min\_voltage\_limit(value) This method relates to the `enable_auto_poweroff` method and allows the user to specify the minimum power off voltage as a value. -#### deepsleep.go\_to\_sleep\(seconds\) +#### deepsleep.go\_to\_sleep(seconds) -This method sends the board into deep sleep for a period of `seconds` or until an external interrupt has triggered \(see `set_pullups`\). +This method sends the board into deep sleep for a period of `seconds` or until an external interrupt has triggered (see `set_pullups`). -#### deepsleep.hw\_reset\(\) +#### deepsleep.hw\_reset() This method resets the PIC controller and resets it to the state previous to the pins/min-voltage being set. -{% hint style="info" %} +{{{% hint style="info" %}}} Please note that more functionality is being added weekly to these libraries. If a required feature is not available, feel free to contribute with a pull request at the [Pycom Libraries](https://github.com/pycom/pycom-libraries) GitHub repository. -{% endhint %} +{{< /hint >}} diff --git a/content/datasheets/boards/expansion2.md b/content/datasheets/boards/expansion2.md new file mode 100644 index 0000000..82daf1d --- /dev/null +++ b/content/datasheets/boards/expansion2.md @@ -0,0 +1,32 @@ +--- +title: "Expansion Board 2.0" +aliases: + - datasheets/boards/expansion2.html + - datasheets/boards/expansion2.md + - product-info/boards/expansion2 + - chapter/datasheets/boards/expansion2 +--- +![](/gitbook/assets/expansion2.png) + +## Pinout + +The pinout of the Expansion Board is available as a PDF File + +{% file src="/gitbook/assets/expansion2-pinout.pdf" caption="Expansion Board 2 Pinout" %} + +![](/gitbook/assets/expansion2-pinout-1.png) + +{{{% hint style="danger" %}}} +Be gentle when plugging/unplugging from the USB connector. Whilst the USB connector is soldered and is relatively strong, if it breaks off it can be very difficult to fix. +{{< /hint >}} + +## Battery Charger + +The Expansion Board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, the Expansion Board will charge the battery (if connected). When the `CHG` jumper is present the battery will be charged at `450mA`. If this value is too high for your application, removing the jumper lowers the charge current to `100mA`. + +## Specsheets + +The specsheet of the Expansion Board is available as a PDF File. + +{% file src="/gitbook/assets/expansion2-specsheet.pdf" caption="Expansion Board 2 Datasheet" %} + diff --git a/datasheets/boards/expansion3.md b/content/datasheets/boards/expansion3.md similarity index 51% rename from datasheets/boards/expansion3.md rename to content/datasheets/boards/expansion3.md index 8297d3b..9906e63 100644 --- a/datasheets/boards/expansion3.md +++ b/content/datasheets/boards/expansion3.md @@ -1,28 +1,34 @@ -# Expansion Board 3.0 - -![](../../.gitbook/assets/expansion3%20%281%29.png) +--- +title: "Expansion Board 3.0" +aliases: + - datasheets/boards/expansion3.html + - datasheets/boards/expansion3.md + - product-info/boards/expansion3 + - chapter/datasheets/boards/expansion3 +--- +![](/gitbook/assets/expansion3%20%281%29.png) ## Pinout The pinout of the Expansion Board is available as a PDF File -{% file src="../../.gitbook/assets/expansion3-pinout.pdf" caption="Expansion Board 3 Pinout" %} +{% file src="/gitbook/assets/expansion3-pinout.pdf" caption="Expansion Board 3 Pinout" %} -![](../../.gitbook/assets/expansion3-pinout-1.png) +![](/gitbook/assets/expansion3-pinout-1.png) -{% hint style="danger" %} +{{{% hint style="danger" %}}} Be gentle when plugging/unplugging from the USB connector. Whilst the USB connector is soldered and is relatively strong, if it breaks off it can be very difficult to fix. -{% endhint %} +{{< /hint >}} ## Battery Charger -The Expansion Board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, the Expansion Board will charge the battery \(if connected\). When the `CHG` jumper is present the battery will be charged at `450mA`. If this value is too high for your application, removing the jumper lowers the charge current to `100mA`. +The Expansion Board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, the Expansion Board will charge the battery (if connected). When the `CHG` jumper is present the battery will be charged at `450mA`. If this value is too high for your application, removing the jumper lowers the charge current to `100mA`. ## Specsheets The specsheet of the Expansion Board is available as a PDF File. -{% file src="../../.gitbook/assets/expansion3-specsheet-1.pdf" caption="Expansion Board 3 Datasheet" %} +{% file src="/gitbook/assets/expansion3-specsheet-1.pdf" caption="Expansion Board 3 Datasheet" %} ## Differences between v2.0 and v3.0 @@ -40,5 +46,5 @@ The specsheet of the Expansion Board is available as a PDF File. ## Troubleshooting -* If PIC stays in bootloader mode, the [`dfu-util` update](../../pytrackpysense/installation/firmware.md) should be performed +* If PIC stays in bootloader mode, the [`dfu-util` update](/../pytrackpysense/installation/firmware) should be performed diff --git a/datasheets/boards/pyscan.md b/content/datasheets/boards/pyscan.md similarity index 62% rename from datasheets/boards/pyscan.md rename to content/datasheets/boards/pyscan.md index f12e700..699234d 100644 --- a/datasheets/boards/pyscan.md +++ b/content/datasheets/boards/pyscan.md @@ -1,15 +1,21 @@ -# Pyscan - -![](../../.gitbook/assets/pyscan-new%20%281%29.png) +--- +title: "Pyscan" +aliases: + - datasheets/boards/pyscan.html + - datasheets/boards/pyscan.md + - product-info/boards/pyscan + - chapter/datasheets/boards/pyscan +--- +![](/gitbook/assets/pyscan-new%20%281%29.png) ## Pyscan Libraries * Pyscan libraries to use the RFID/NFC reader are located [here](https://github.com/pycom/pycom-libraries/tree/master/pyscan) * The accelerometer library is [here](https://github.com/pycom/pycom-libraries/blob/master/pytrack/lib/LIS2HH12.py) -{% hint style="info" %} +{{{% hint style="info" %}}} For the time being, we recommend to upload the `MFRC630.mpy` file via FTP due to current limitations of Pymakr that will be fixed shortly. -{% endhint %} +{{< /hint >}} Libraries for the rest of the components will be added soon. @@ -21,7 +27,7 @@ Libraries for the rest of the components will be added soon. ## Driver -The Windows 7 driver for Pyscan is located [here](../../pytrackpysense/installation/firmware.md). +The Windows 7 driver for Pyscan is located [here](/../pytrackpysense/installation/firmware). For other Operating Systems there's no driver required. @@ -29,17 +35,17 @@ For other Operating Systems there's no driver required. The pinout of the Pyscan is available as a PDF File -{% file src="../../.gitbook/assets/pyscan-pinout.pdf" caption="Pyscan Pinout" %} +{% file src="/gitbook/assets/pyscan-pinout.pdf" caption="Pyscan Pinout" %} -![](../../.gitbook/assets/pyscan-pinout-1.png) +![](/gitbook/assets/pyscan-pinout-1.png) ## Battery Charger -The board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, it will charge the battery \(if connected\). +The board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, it will charge the battery (if connected). ## Specsheets The specsheet of the Pyscan is available as a PDF File. -{% file src="../../.gitbook/assets/pyscan-specsheet.pdf" caption="Pyscan Datasheet" %} +{% file src="/gitbook/assets/pyscan-specsheet.pdf" caption="Pyscan Datasheet" %} diff --git a/content/datasheets/boards/pysense.md b/content/datasheets/boards/pysense.md new file mode 100644 index 0000000..5210ce4 --- /dev/null +++ b/content/datasheets/boards/pysense.md @@ -0,0 +1,28 @@ +--- +title: "Pysense" +aliases: + - datasheets/boards/pysense.html + - datasheets/boards/pysense.md + - product-info/boards/pysense + - chapter/datasheets/boards/pysense +--- +![](/gitbook/assets/pysense%20%281%29.png) + +## Pinout + +The pinout of the Pysense is available as a PDF File + +{% file src="/gitbook/assets/pysense-pinout.pdf" caption="Pysense Pinout" %} + +![](/gitbook/assets/pysense-pinout-1.png) + +## Battery Charger + +The board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, it will charge the battery (if connected). + +## Specsheets + +The specsheet of the Pysense is available as a PDF File. + +{% file src="/gitbook/assets/pysense-specsheet.pdf" caption="Pysense Datasheet" %} + diff --git a/content/datasheets/boards/pytrack.md b/content/datasheets/boards/pytrack.md new file mode 100644 index 0000000..da66ca7 --- /dev/null +++ b/content/datasheets/boards/pytrack.md @@ -0,0 +1,28 @@ +--- +title: "Pytrack" +aliases: + - datasheets/boards/pytrack.html + - datasheets/boards/pytrack.md + - product-info/boards/pytrack + - chapter/datasheets/boards/pytrack +--- +![](/gitbook/assets/pytrack%20%282%29.png) + +## Pinout + +The pinout of the Pytrack is available as a PDF File + +{% file src="/gitbook/assets/pytrack-pinout.pdf" caption="Pytrack Pinout" %} + +![](/gitbook/assets/pytrack-pinout-1.png) + +## Battery Charger + +The board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, it will charge the battery (if connected). + +## Specsheets + +The specsheet of the Pytrack is available as a PDF File. + +{% file src="/gitbook/assets/pytrack-specsheet-1.pdf" caption="Pytrack Datasheet" %} + diff --git a/content/datasheets/development/README.md b/content/datasheets/development/README.md new file mode 100644 index 0000000..b21c532 --- /dev/null +++ b/content/datasheets/development/README.md @@ -0,0 +1,22 @@ +--- +title: "Development Modules" +aliases: + - product-info/development + - chapter/datasheets/development +--- +This section contains all of the datasheets for the Pycom Development Devices. This includes the WiPy 2.0 and 3.0, LoPy, LoPy 4, SiPy, GPy, and FiPy. + +{{% refname "wipy2.md" %}} + +{{% refname "wipy3.md" %}} + +{{% refname "lopy.md" %}} + +{{% refname "lopy4.md" %}} + +{{% refname "sipy.md" %}} + +{{% refname "gpy.md" %}} + +{{% refname "fipy.md" %}} + diff --git a/content/datasheets/development/_index.md b/content/datasheets/development/_index.md new file mode 100644 index 0000000..170cd2f --- /dev/null +++ b/content/datasheets/development/_index.md @@ -0,0 +1,20 @@ +--- +title: "Development Modules" +aliases: +--- +This section contains all of the datasheets for the Pycom Development Devices. This includes the WiPy 2.0 and 3.0, LoPy, LoPy 4, SiPy, GPy, and FiPy. + +{{% refname "wipy2.md" %}} + +{{% refname "wipy3.md" %}} + +{{% refname "lopy.md" %}} + +{{% refname "lopy4.md" %}} + +{{% refname "sipy.md" %}} + +{{% refname "gpy.md" %}} + +{{% refname "fipy.md" %}} + diff --git a/content/datasheets/development/fipy.md b/content/datasheets/development/fipy.md new file mode 100644 index 0000000..4e77d2c --- /dev/null +++ b/content/datasheets/development/fipy.md @@ -0,0 +1,66 @@ +--- +title: "FiPy" +aliases: + - datasheets/development/fipy.html + - datasheets/development/fipy.md + - product-info/development/fipy + - chapter/datasheets/development/fipy +--- +![](/gitbook/assets/fipy-1.png) + +**Store**: [Buy Here](http://www.pycom.io/fipy) + +**Getting Started:** [Click Here](/../gettingstarted/connection/fipy) + +## Pinout + +The pinout of the FiPy is available as a PDF File + +{% file src="/gitbook/assets/fipy-pinout.pdf" caption="FiPy Pinout" %} + +![](/gitbook/assets/fipy-pinout.png) + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## Datasheet + +The datasheet of the FiPy is available as a PDF File. + +{% file src="/gitbook/assets/fipy-specsheet-1.pdf" caption="FiPy Datasheet" %} + +The drawing of the LTE-M antenna is available as a PDF File. + +{% file src="/gitbook/assets/lte-m-antenna-drawing.pdf" caption="LTE-M Antenna Drawing" %} + +## Notes + +### WiFi + +By default, upon boot the FiPy will create a WiFi access point with the SSID `fipy-wlan-XXXX`, where `XXXX` is a random 4-digit number, and the password `www.pycom.io`. + +The RF switch that selects between the on-board and external antenna is connected to `P12`, for this reason using `P12` should be avoided unless WiFi is disabled in your application. + +### Power + +The `Vin` pin on the FiPy can be supplied with a voltage ranging from `3.5v` to `5.5v`. The `3.3v` pin on the other hand is output **only**, and must not be used to feed power into the FiPy, otherwise the on-board regulator will be damaged. + +### AT Commands + +The AT commands for the Sequans Monarch modem on the FiPy are available in a PDF file. + +{% file src="/gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential-2.pdf" caption="AT Commands for Sequans" %} + +## Tutorials + +Tutorials on how to the FiPy module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the FiPy: + +* [WiFi connection](/../tutorials/all/wlan) +* [LoRaWAN node](/../tutorials/lora/lorawan-abp) +* [LoRaWAN nano gateway](/../tutorials/lora/lorawan-nano-gateway) +* [Sigfox](/../tutorials/sigfox) +* [LTE CAT-M1](/../tutorials/lte/cat-m1) +* [NB-IoT](/../tutorials/lte/nb-iot) +* [BLE](/../tutorials/all/ble) + diff --git a/content/datasheets/development/gpy.md b/content/datasheets/development/gpy.md new file mode 100644 index 0000000..3c83b2f --- /dev/null +++ b/content/datasheets/development/gpy.md @@ -0,0 +1,63 @@ +--- +title: "GPy" +aliases: + - datasheets/development/gpy.html + - datasheets/development/gpy.md + - product-info/development/gpy + - chapter/datasheets/development/gpy +--- +![](/gitbook/assets/gpy-1.png) + +**Store**: [Buy Here](http://www.pycom.io/gpy) + +**Getting Started:** [Click Here](/../gettingstarted/connection/gpy) + +## Pinout + +The pinout of the GPy is available as a PDF File + +{% file src="/gitbook/assets/gpy-pinout.pdf" caption="GPy Pinout" %} + +![](/gitbook/assets/gpy-pinout.png) + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## Datasheet + +The datasheet of the GPy is available as a PDF File. + +{% file src="/gitbook/assets/gpy-specsheet.pdf" caption="GPy Datasheet" %} + +The drawing of the LTE-M antenna is available as a PDF File. + +{% file src="/gitbook/assets/lte-m-antenna-drawing.pdf" caption="LTE-M Antenna Drawing" %} + +## Notes + +### WiFi + +By default, upon boot the GPy will create a WiFi access point with the SSID `gpy-wlan-XXXX`, where `XXXX` is a random 4-digit number, and the password `www.pycom.io`. + +The RF switch that selects between the on-board and external antenna is connected to `P12`, for this reason using `P12` should be avoided unless WiFi is disabled in your application. + +### Power + +The `Vin` pin on the GPy can be supplied with a voltage ranging from `3.5v` to `5.5v`. The `3.3v` pin on the other hand is output **only**, and must not be used to feed power into the GPy, otherwise the on-board regulator will be damaged. + +### AT Commands + +The AT commands for the Sequans Monarch modem on the GPy are available in a PDF file. + +{% file src="/gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential-1.pdf" caption="AT Commands for Sequans" %} + +## Tutorials + +Tutorials on how to the GPy module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the GPy: + +* [WiFi connection](/../tutorials/all/wlan) +* [LTE CAT-M1](/../tutorials/lte/cat-m1) +* [NB-IoT](/../tutorials/lte/nb-iot) +* [BLE](/../tutorials/all/ble) + diff --git a/datasheets/development/lopy.md b/content/datasheets/development/lopy.md similarity index 54% rename from datasheets/development/lopy.md rename to content/datasheets/development/lopy.md index 8d3cbcb..b057e11 100644 --- a/datasheets/development/lopy.md +++ b/content/datasheets/development/lopy.md @@ -1,28 +1,34 @@ -# LoPy - -![](../../.gitbook/assets/lopy-1.png) +--- +title: "LoPy" +aliases: + - datasheets/development/lopy.html + - datasheets/development/lopy.md + - product-info/development/lopy + - chapter/datasheets/development/lopy +--- +![](/gitbook/assets/lopy-1.png) **Store**: [Buy Here](http://www.pycom.io/lopy) -**Getting Started:** [Click Here](../../gettingstarted/connection/lopy.md) +**Getting Started:** [Click Here](/../gettingstarted/connection/lopy) ## Pinout The pinout of the LoPy is available as a PDF File -{% file src="../../.gitbook/assets/lopy-pinout.pdf" caption="LoPy Pinout" %} +{% file src="/gitbook/assets/lopy-pinout.pdf" caption="LoPy Pinout" %} -![](../../.gitbook/assets/lopy-pinout.png) +![](/gitbook/assets/lopy-pinout.png) -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} ## Datasheet The datasheet of the LoPy is available as a PDF File. -{% file src="../../.gitbook/assets/lopy-specsheet.pdf" caption="LoPy Datasheet" %} +{% file src="/gitbook/assets/lopy-specsheet.pdf" caption="LoPy Datasheet" %} ## Notes @@ -36,14 +42,14 @@ The `Vin` pin on the LoPy can be supplied with a voltage ranging from `3.5v` to ### Deep Sleep -Due to a couple issues with the LoPy design the module draws more current than it should while in deep sleep. The DC-DC switching regulator always stays in high performance mode which is used to provide the lowest possible output ripple when the modules is in use. In this mode, it draws a quiescent current of 10mA. When the regulator is put into ECO mode, the quiescent current goes down to 10uA. Unfortunately, the pin used to control this mode is out of the RTC domain, and therefore not usable during deep sleep. This causes the regulator to always stay in PWM mode, keeping its quiescent current at 10mA. Alongside this the flash chip doesn't enter power down mode because the CS pin is floating during deep sleep. This causes the flash chip to consume around 2mA of current. To work around this issue a ["deep sleep shield"](../boards/deepsleep/) is available that attaches to the module and allows power to be cut off from the device. The device can then be re-enabled either on a timer or via pin interrupt. With the deep sleep shield the current consumption during deep sleep is between 7uA and 10uA depending on the wake sources configured. +Due to a couple issues with the LoPy design the module draws more current than it should while in deep sleep. The DC-DC switching regulator always stays in high performance mode which is used to provide the lowest possible output ripple when the modules is in use. In this mode, it draws a quiescent current of 10mA. When the regulator is put into ECO mode, the quiescent current goes down to 10uA. Unfortunately, the pin used to control this mode is out of the RTC domain, and therefore not usable during deep sleep. This causes the regulator to always stay in PWM mode, keeping its quiescent current at 10mA. Alongside this the flash chip doesn't enter power down mode because the CS pin is floating during deep sleep. This causes the flash chip to consume around 2mA of current. To work around this issue a ["deep sleep shield"](/boards/deepsleep/) is available that attaches to the module and allows power to be cut off from the device. The device can then be re-enabled either on a timer or via pin interrupt. With the deep sleep shield the current consumption during deep sleep is between 7uA and 10uA depending on the wake sources configured. ## Tutorials -Tutorials on how to the LoPy module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the LoPy: +Tutorials on how to the LoPy module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the LoPy: -* [WiFi connection](../../tutorials/all/wlan.md) -* [LoRaWAN node](../../tutorials/lora/lorawan-abp.md) -* [LoRaWAN nano gateway](../../tutorials/lora/lorawan-nano-gateway.md) -* [BLE](../../tutorials/all/ble.md) +* [WiFi connection](/../tutorials/all/wlan) +* [LoRaWAN node](/../tutorials/lora/lorawan-abp) +* [LoRaWAN nano gateway](/../tutorials/lora/lorawan-nano-gateway) +* [BLE](/../tutorials/all/ble) diff --git a/content/datasheets/development/lopy4.md b/content/datasheets/development/lopy4.md new file mode 100644 index 0000000..8479dd9 --- /dev/null +++ b/content/datasheets/development/lopy4.md @@ -0,0 +1,54 @@ +--- +title: "LoPy 4" +aliases: + - datasheets/development/lopy4.html + - datasheets/development/lopy4.md + - product-info/development/lopy4 + - chapter/datasheets/development/lopy4 +--- +![](/gitbook/assets/lopy4-1.png) + +**Store**: [Buy Here](http://www.pycom.io/lopy4) + +**Getting Started:** [Click Here](/../gettingstarted/connection/lopy4) + +## Pinout + +The pinout of the LoPy4 is available as a PDF File + +{% file src="/gitbook/assets/lopy4-pinout.pdf" caption="LoPy4 Pinout" %} + +![](/gitbook/assets/lopy4-pinout.png) + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## Datasheet + +The datasheet of the LoPy4 is available as a PDF File. + +{% file src="/gitbook/assets/lopy4-specsheet-1.pdf" caption="LoPy4 Datasheet" %} + +## Notes + +### WiFi + +By default, upon boot the LoPy4 will create a WiFi access point with the SSID `lopy4-wlan-XXXX`, where `XXXX` is a random 4-digit number, and the password `www.pycom.io`. + +The RF switch that selects between the on-board and external antenna is connected to `P12`, for this reason using `P12` should be avoided unless WiFi is disabled in your application. + +### Power + +The `Vin` pin on the LoPy4 can be supplied with a voltage ranging from `3.5v` to `5.5v`. The `3.3v` pin on the other hand is output **only**, and must not be used to feed power into the LoPy4, otherwise the on-board regulator will be damaged. + +## Tutorials + +Tutorials on how to the LoPy4 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the LoPy4: + +* [WiFi connection](/../tutorials/all/wlan) +* [LoRaWAN node](/../tutorials/lora/lorawan-abp) +* [LoRaWAN nano gateway](/../tutorials/lora/lorawan-nano-gateway) +* [Sigfox](/../tutorials/sigfox) +* [BLE](/../tutorials/all/ble) + diff --git a/datasheets/development/sipy.md b/content/datasheets/development/sipy.md similarity index 56% rename from datasheets/development/sipy.md rename to content/datasheets/development/sipy.md index c9817a7..e2cb39b 100644 --- a/datasheets/development/sipy.md +++ b/content/datasheets/development/sipy.md @@ -1,28 +1,34 @@ -# SiPy - -![](../../.gitbook/assets/sipy-2.png) +--- +title: "SiPy" +aliases: + - datasheets/development/sipy.html + - datasheets/development/sipy.md + - product-info/development/sipy + - chapter/datasheets/development/sipy +--- +![](/gitbook/assets/sipy-2.png) **Store**: [Buy Here](http://www.pycom.io/sipy) -**Getting Started:** [Click Here](../../gettingstarted/connection/sipy.md) +**Getting Started:** [Click Here](/../gettingstarted/connection/sipy) ## Pinout The pinout of the SiPy is available as a PDF File -{% file src="../../.gitbook/assets/sipy-pinout.pdf" caption="SiPy Pinout" %} +{% file src="/gitbook/assets/sipy-pinout.pdf" caption="SiPy Pinout" %} -![](../../.gitbook/assets/sipy-pinout.png) +![](/gitbook/assets/sipy-pinout.png) -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} ## Datasheet The datasheet of the SiPy is available as a PDF File. -{% file src="../../.gitbook/assets/sipy-specsheet.pdf" caption="SiPy Datasheet" %} +{% file src="/gitbook/assets/sipy-specsheet.pdf" caption="SiPy Datasheet" %} ## Notes @@ -36,13 +42,13 @@ The `Vin` pin on the SiPy can be supplied with a voltage ranging from `3.5v` to ### Deep Sleep -Due to a couple issues with the SiPy design the module draws more current than it should while in deep sleep. The DC-DC switching regulator always stays in high performance mode which is used to provide the lowest possible output ripple when the modules is in use. In this mode, it draws a quiescent current of 10mA. When the regulator is put into ECO mode, the quiescent current goes down to 10uA. Unfortunately, the pin used to control this mode is out of the RTC domain, and therefore not usable during deep sleep. This causes the regulator to always stay in PWM mode, keeping its quiescent current at 10mA. Alongside this the flash chip doesn't enter power down mode because the CS pin is floating during deep sleep. This causes the flash chip to consume around 2mA of current. To work around this issue a ["deep sleep shield"](../boards/deepsleep/) is available that attaches to the module and allows power to be cut off from the device. The device can then be re-enabled either on a timer or via pin interrupt. With the deep sleep shield the current consumption during deep sleep is between 7uA and 10uA depending on the wake sources configured. +Due to a couple issues with the SiPy design the module draws more current than it should while in deep sleep. The DC-DC switching regulator always stays in high performance mode which is used to provide the lowest possible output ripple when the modules is in use. In this mode, it draws a quiescent current of 10mA. When the regulator is put into ECO mode, the quiescent current goes down to 10uA. Unfortunately, the pin used to control this mode is out of the RTC domain, and therefore not usable during deep sleep. This causes the regulator to always stay in PWM mode, keeping its quiescent current at 10mA. Alongside this the flash chip doesn't enter power down mode because the CS pin is floating during deep sleep. This causes the flash chip to consume around 2mA of current. To work around this issue a ["deep sleep shield"](/boards/deepsleep/) is available that attaches to the module and allows power to be cut off from the device. The device can then be re-enabled either on a timer or via pin interrupt. With the deep sleep shield the current consumption during deep sleep is between 7uA and 10uA depending on the wake sources configured. ## Tutorials -Tutorials on how to the SiPy module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the SiPy: +Tutorials on how to the SiPy module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the SiPy: -* [WiFi connection](../../tutorials/all/wlan.md) -* [Sigfox](../../tutorials/sigfox.md) -* [BLE](../../tutorials/all/ble.md) +* [WiFi connection](/../tutorials/all/wlan) +* [Sigfox](/../tutorials/sigfox) +* [BLE](/../tutorials/all/ble) diff --git a/datasheets/development/wipy2.md b/content/datasheets/development/wipy2.md similarity index 54% rename from datasheets/development/wipy2.md rename to content/datasheets/development/wipy2.md index e818e05..ca5a72d 100644 --- a/datasheets/development/wipy2.md +++ b/content/datasheets/development/wipy2.md @@ -1,28 +1,34 @@ -# WiPy 2.0 +--- +title: "WiPy 2.0" +aliases: + - datasheets/development/wipy2.html + - datasheets/development/wipy2.md + - product-info/development/wipy2 + - chapter/datasheets/development/wipy2 +--- +![](/gitbook/assets/wipy2-1.png) -![](../../.gitbook/assets/wipy2-1.png) +**Store**: Discontinued, See [WiPy3](wipy3) -**Store**: Discontinued, See [WiPy3](wipy3.md) - -**Getting Started:** [Click Here](../../gettingstarted/connection/wipy.md) +**Getting Started:** [Click Here](/../gettingstarted/connection/wipy) ## Pinout The pinout of the WiPy2 is available as a PDF File. -{% file src="../../.gitbook/assets/wipy2-pinout.pdf" caption="WiPy 2 Pinout" %} +{% file src="/gitbook/assets/wipy2-pinout.pdf" caption="WiPy 2 Pinout" %} -![](../../.gitbook/assets/wipy2-pinout.png) +![](/gitbook/assets/wipy2-pinout.png) -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} ## Datasheet The datasheet of the WiPy2 is available as a PDF File. -{% file src="../../.gitbook/assets/wipy2-specsheet.pdf" caption="WiPy 2 Datasheet" %} +{% file src="/gitbook/assets/wipy2-specsheet.pdf" caption="WiPy 2 Datasheet" %} ## Notes @@ -36,12 +42,12 @@ The `Vin` pin on the WiPy2 can be supplied with a voltage ranging from `3.5v` to ### Deep Sleep -Due to a couple issues with the WiPy2 design the module draws more current than it should while in deep sleep. The DC-DC switching regulator always stays in high performance mode which is used to provide the lowest possible output ripple when the modules is in use. In this mode, it draws a quiescent current of 10mA. When the regulator is put into ECO mode, the quiescent current goes down to 10uA. Unfortunately, the pin used to control this mode is out of the RTC domain, and therefore not usable during deep sleep. This causes the regulator to always stay in PWM mode, keeping its quiescent current at 10mA. Alongside this the flash chip doesn't enter power down mode because the CS pin is floating during deep sleep. This causes the flash chip to consume around 2mA of current. To work around this issue a ["deep sleep shield"](../boards/deepsleep/) is available that attaches to the module and allows power to be cut off from the device. The device can then be re-enabled either on a timer or via pin interrupt. With the deep sleep shield the current consumption during deep sleep is between 7uA and 10uA depending on the wake sources configured. +Due to a couple issues with the WiPy2 design the module draws more current than it should while in deep sleep. The DC-DC switching regulator always stays in high performance mode which is used to provide the lowest possible output ripple when the modules is in use. In this mode, it draws a quiescent current of 10mA. When the regulator is put into ECO mode, the quiescent current goes down to 10uA. Unfortunately, the pin used to control this mode is out of the RTC domain, and therefore not usable during deep sleep. This causes the regulator to always stay in PWM mode, keeping its quiescent current at 10mA. Alongside this the flash chip doesn't enter power down mode because the CS pin is floating during deep sleep. This causes the flash chip to consume around 2mA of current. To work around this issue a ["deep sleep shield"](/boards/deepsleep/) is available that attaches to the module and allows power to be cut off from the device. The device can then be re-enabled either on a timer or via pin interrupt. With the deep sleep shield the current consumption during deep sleep is between 7uA and 10uA depending on the wake sources configured. ## Tutorials -Tutorials on how to the WiPy2 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the WiPy2: +Tutorials on how to the WiPy2 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the WiPy2: -* [WiFi connection](../../tutorials/all/wlan.md) -* [BLE](../../tutorials/all/ble.md) +* [WiFi connection](/../tutorials/all/wlan) +* [BLE](/../tutorials/all/ble) diff --git a/datasheets/development/wipy3.md b/content/datasheets/development/wipy3.md similarity index 53% rename from datasheets/development/wipy3.md rename to content/datasheets/development/wipy3.md index aad4d97..e37f0fd 100644 --- a/datasheets/development/wipy3.md +++ b/content/datasheets/development/wipy3.md @@ -1,35 +1,41 @@ -# WiPy 3.0 - -![](../../.gitbook/assets/wipy3.png) +--- +title: "WiPy 3.0" +aliases: + - datasheets/development/wipy3.html + - datasheets/development/wipy3.md + - product-info/development/wipy3 + - chapter/datasheets/development/wipy3 +--- +![](/gitbook/assets/wipy3.png) **Store**: [Buy Here](http://www.pycom.io/wipy-3) -**Getting Started:** [Click Here](../../gettingstarted/connection/wipy.md) +**Getting Started:** [Click Here](/../gettingstarted/connection/wipy) ## Pinout The pinout of the WiPy3 is available as a PDF File. -{% file src="../../.gitbook/assets/wipy3-pinout.pdf" caption="WiPy3 Pinout" %} +{% file src="/gitbook/assets/wipy3-pinout.pdf" caption="WiPy3 Pinout" %} -![](../../.gitbook/assets/wipy3-pinout.png) +![](/gitbook/assets/wipy3-pinout.png) -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} ## Differences from WiPy 2.0 * Deep sleep current draw fixed, now only 19.7µA * Upgraded RAM from 512KB to 4MB * Upgraded External FLASH from 4MB to 8MB -* Antenna select pin moved from GPIO16 to GPIO21 \(P12\) +* Antenna select pin moved from GPIO16 to GPIO21 (P12) ## Datasheet The datasheet of the WiPy3 is available as a PDF File. -{% file src="../../.gitbook/assets/wipy3-specsheet.pdf" caption="WiPy3 Datasheet" %} +{% file src="/gitbook/assets/wipy3-specsheet.pdf" caption="WiPy3 Datasheet" %} ## Notes @@ -45,8 +51,8 @@ The `Vin` pin on the WiPy3 can be supplied with a voltage ranging from `3.5v` to ## Tutorials -Tutorials on how to the WiPy3 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the WiPy3: +Tutorials on how to the WiPy3 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the WiPy3: -* [WiFi connection](../../tutorials/all/wlan.md) -* [BLE](../../tutorials/all/ble.md) +* [WiFi connection](/../tutorials/all/wlan) +* [BLE](/../tutorials/all/ble) diff --git a/content/datasheets/introduction.md b/content/datasheets/introduction.md new file mode 100644 index 0000000..7bbaca6 --- /dev/null +++ b/content/datasheets/introduction.md @@ -0,0 +1,52 @@ +--- +title: "Introduction" +aliases: + - datasheets/introduction.html + - datasheets/introduction.md + - product-info + - chapter/datasheets +--- +The follow pages contain all information relating to each product, for examples: pinouts, spec sheets, relevant examples and notes. + +## Development Modules + +{{% refname "development/wipy2.md" %}} + +{{% refname "development/wipy3.md" %}} + +{{% refname "development/lopy.md" %}} + +{{% refname "development/lopy4.md" %}} + +{{% refname "development/sipy.md" %}} + +{{% refname "development/gpy.md" %}} + +{{% refname "development/fipy.md" %}} + +## OEM modules + +{{% refname "oem/w01.md" %}} + +{{% refname "oem/l01.md" %}} + +{{% refname "oem/g01.md" %}} + +{{% refname "oem/l01\_reference.md" %}} + +{{% refname "oem/universal\_reference.md" %}} + +## Expansion Boards and Shields + +{{% refname "boards/expansion3.md" %}} + +{{% refname "boards/pytrack.md" %}} + +{{% refname "boards/pysense.md" %}} + +{{% refname "boards/pyscan.md" %}} + +{{% refname "boards/expansion2.md" %}} + +{{% refname "boards/deepsleep/" %}} + diff --git a/datasheets/notes.md b/content/datasheets/notes.md similarity index 67% rename from datasheets/notes.md rename to content/datasheets/notes.md index 7f5f037..f2ad78b 100644 --- a/datasheets/notes.md +++ b/content/datasheets/notes.md @@ -1,5 +1,11 @@ -# Notes - +--- +title: "Notes" +aliases: + - datasheets/notes.html + - datasheets/notes.md + - product-info/notes + - chapter/datasheets/notes +--- ## Powering with an external power source The devices can be powered by a battery or other external power source. @@ -10,17 +16,17 @@ When powering via `VIN`: * The input voltage must be between `3.4V` and `5.5V`. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Please **DO NOT** power the board via the `3.3V` pin as this may damage the device. ONLY use the `VIN` pin for powering Pycom devices. -{% endhint %} +{{< /hint >}} The battery connector for the Expansion Board is a **JST PHR-2** variant. The Expansion Board exposes the male connector and an external battery should use a female adapter in order to connect and power the expansion board. The polarity of the battery should be checked before being plugged into the expansion board, the cables may require swapping. -{% hint style="danger" %} +{{{% hint style="danger" %}}} The `GPIO` pins of the modules are **NOT** `5V` tolerant, connecting them to voltages higher than `3.3V` might cause irreparable damage to the device. -{% endhint %} +{{< /hint >}} -{% hint style="danger" %} -Static electricity can damage components on the device and may destroy them. If there is a lot of static electricity in the area \(e.g. dry and cold climates\), take extra care not to shock the device. If the device came in a ESD bag \(Silver packaging\), the best way to store and carry the device is inside this bag as it will be protected against static discharges. -{% endhint %} +{{{% hint style="danger" %}}} +Static electricity can damage components on the device and may destroy them. If there is a lot of static electricity in the area (e.g. dry and cold climates), take extra care not to shock the device. If the device came in a ESD bag (Silver packaging), the best way to store and carry the device is inside this bag as it will be protected against static discharges. +{{< /hint >}} diff --git a/content/datasheets/oem/README.md b/content/datasheets/oem/README.md new file mode 100644 index 0000000..37ff3be --- /dev/null +++ b/content/datasheets/oem/README.md @@ -0,0 +1,18 @@ +--- +title: "OEM Modules" +aliases: + - product-info/oem + - chapter/datasheets/oem +--- +This section contains all of the datasheets for the Pycom OEM Devices. This includes the W01, L01, L04, and G01. + +{{% refname "w01.md" %}} + +{{% refname "l01.md" %}} + +{{% refname "g01.md" %}} + +{{% refname "l01\_reference.md" %}} + +{{% refname "universal\_reference.md" %}} + diff --git a/content/datasheets/oem/_index.md b/content/datasheets/oem/_index.md new file mode 100644 index 0000000..ece0d16 --- /dev/null +++ b/content/datasheets/oem/_index.md @@ -0,0 +1,16 @@ +--- +title: "OEM Modules" +aliases: +--- +This section contains all of the datasheets for the Pycom OEM Devices. This includes the W01, L01, L04, and G01. + +{{% refname "w01.md" %}} + +{{% refname "l01.md" %}} + +{{% refname "g01.md" %}} + +{{% refname "l01\_reference.md" %}} + +{{% refname "universal\_reference.md" %}} + diff --git a/content/datasheets/oem/g01.md b/content/datasheets/oem/g01.md new file mode 100644 index 0000000..14266b5 --- /dev/null +++ b/content/datasheets/oem/g01.md @@ -0,0 +1,49 @@ +--- +title: "G01" +aliases: + - datasheets/oem/g01.html + - datasheets/oem/g01.md + - product-info/oem/g01 + - chapter/datasheets/oem/g01 +--- +![](/gitbook/assets/g01-1.png) + +## Pinout + +The pinout of the G01 is available as a PDF File + +{% file src="/gitbook/assets/g01-pinout.pdf" caption="G01 Pinout" %} + +![](/gitbook/assets/g01-pinout.png) + +## Specsheets + +The specsheet of the G01 is available as a PDF File. + +{% file src="/gitbook/assets/g01-specsheet.pdf" caption="G01 Datasheet" %} + +## Drawings + +The drawings for the G01 is available as a PDF File. + +{% file src="/gitbook/assets/g01-drawing.pdf" caption="G01 Drawings" %} + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## AT Commands + +The AT commands for the Sequans Monarch modem on the G01 are available in a PDF file. + +{% file src="/gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential-3.pdf" caption="AT Commands for Sequans" %} + +## Tutorials + +Tutorials on how to the G01 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the G01: + +* [WiFi connection](/../tutorials/all/wlan) +* [LTE CAT-M1](/../tutorials/lte/cat-m1) +* [NB-IoT](/../tutorials/lte/nb-iot) +* [BLE](/../tutorials/all/ble) + diff --git a/content/datasheets/oem/l01.md b/content/datasheets/oem/l01.md new file mode 100644 index 0000000..5c918d9 --- /dev/null +++ b/content/datasheets/oem/l01.md @@ -0,0 +1,43 @@ +--- +title: "L01" +aliases: + - datasheets/oem/l01.html + - datasheets/oem/l01.md + - product-info/oem/l01 + - chapter/datasheets/oem/l01 +--- +![](/gitbook/assets/l01-1.png) + +## Pinout + +The pinout of the L01 is available as a PDF File + +{% file src="/gitbook/assets/l01-pinout.pdf" caption="L01 Pinout" %} + +![](/gitbook/assets/l01-pinout.png) + +## Specsheets + +The specsheet of the L01 is available as a PDF File. + +{% file src="/gitbook/assets/l01-specsheet-1.pdf" caption="L01 Datasheet" %} + +## Drawings + +The drawings for the L01 is available as a PDF File. + +{% file src="/gitbook/assets/l01-drawing.pdf" caption="L01 Drawing" %} + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## Tutorials + +Tutorials on how to the L01 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the L01: + +* [WiFi connection](/../tutorials/all/wlan) +* [LoRaWAN node](/../tutorials/lora/lorawan-abp) +* [LoRaWAN nano gateway](/../tutorials/lora/lorawan-nano-gateway) +* [BLE](/../tutorials/all/ble) + diff --git a/datasheets/oem/l01_reference.md b/content/datasheets/oem/l01_reference.md similarity index 59% rename from datasheets/oem/l01_reference.md rename to content/datasheets/oem/l01_reference.md index 37ed651..a2fef46 100644 --- a/datasheets/oem/l01_reference.md +++ b/content/datasheets/oem/l01_reference.md @@ -1,12 +1,18 @@ -# L01 OEM Baseboard Reference - -![](../../.gitbook/assets/l01-reference%20%281%29.png) +--- +title: "L01 OEM Baseboard Reference" +aliases: + - datasheets/oem/l01_reference.html + - datasheets/oem/l01_reference.md + - product-info/oem/l01_reference + - chapter/datasheets/oem/l01_reference +--- +![](/gitbook/assets/l01-reference%20%281%29.png) The L01 OEM reference board is a reference design suitable L01 as well as W01 making it possible to have a single PCB design that can accommodate both OEM modules. -{% hint style="info" %} -If you require a reference board for the L04 or G01, this design is **not** suitable as it does not feature a SIM slot or the double antenna connection. For the G01 or L04 please use the [Universal OEM Baseboard Reference](universal_reference.md) -{% endhint %} +{{{% hint style="info" %}}} +If you require a reference board for the L04 or G01, this design is **not** suitable as it does not feature a SIM slot or the double antenna connection. For the G01 or L04 please use the [Universal OEM Baseboard Reference](universal_reference) +{{< /hint >}} ## Features @@ -27,19 +33,19 @@ If you require a reference board for the L04 or G01, this design is **not** suit The layout of the L01 baseboard reference is available as a PDF File -{% file src="../../.gitbook/assets/l01-oem-layout.pdf" caption="L01 OEM Layout" %} +{% file src="/gitbook/assets/l01-oem-layout.pdf" caption="L01 OEM Layout" %} -![](../../.gitbook/assets/l01-oem-layout-1.png) +![](/gitbook/assets/l01-oem-layout-1.png) ## Schematic The schematic of the L01 baseboard reference is available as a PDF File. -{% file src="../../.gitbook/assets/l01-oem-schematic.pdf" caption="L01 OEM Schematic" %} +{% file src="/gitbook/assets/l01-oem-schematic.pdf" caption="L01 OEM Schematic" %} ## Altium Project and Gerber Files The Altium Project and Gerber files are also available as a ZIP File. -{% file src="../../.gitbook/assets/l01-oem-baseboard-ref.zip" caption="L01 OEM Altium Project and Gerber Files" %} +{% file src="/gitbook/assets/l01-oem-baseboard-ref.zip" caption="L01 OEM Altium Project and Gerber Files" %} diff --git a/content/datasheets/oem/l04.md b/content/datasheets/oem/l04.md new file mode 100644 index 0000000..da0dec3 --- /dev/null +++ b/content/datasheets/oem/l04.md @@ -0,0 +1,44 @@ +--- +title: "L04" +aliases: + - datasheets/oem/l04.html + - datasheets/oem/l04.md + - product-info/oem/l04 + - chapter/datasheets/oem/l04 +--- +![](/gitbook/assets/l04-1.png) + +## Pinout + +The pinout of the L04 is available as a PDF File + +{% file src="/gitbook/assets/l04-pinout.pdf" caption="L04 Pinout" %} + +![](/gitbook/assets/l04-pinout.png) + +## Specsheets + +The specsheet of the L04 is available as a PDF File. + +{% file src="/gitbook/assets/l04-specsheet.pdf" caption="L04 Datasheet" %} + +## Drawings + +The drawings for the L04 is available as a PDF File. + +{% file src="/gitbook/assets/l04-drawing.pdf" caption="L04 Drawings" %} + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## Tutorials + +Tutorials on how to the L04 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the L04: + +* [WiFi connection](/../tutorials/all/wlan) +* [LoRaWAN node](/../tutorials/lora/lorawan-abp) +* [LoRaWAN nano gateway](/../tutorials/lora/lorawan-nano-gateway) +* [Sigfox](/../tutorials/sigfox) +* [BLE](/../tutorials/all/ble) + diff --git a/datasheets/oem/universal_reference.md b/content/datasheets/oem/universal_reference.md similarity index 57% rename from datasheets/oem/universal_reference.md rename to content/datasheets/oem/universal_reference.md index 39b256c..b421a4b 100644 --- a/datasheets/oem/universal_reference.md +++ b/content/datasheets/oem/universal_reference.md @@ -1,16 +1,22 @@ -# Universal OEM Baseboard Reference - -![](../../.gitbook/assets/universal_reference%20%281%29.png) +--- +title: "Universal OEM Baseboard Reference" +aliases: + - datasheets/oem/universal_reference.html + - datasheets/oem/universal_reference.md + - product-info/oem/universal_reference + - chapter/datasheets/oem/universal_reference +--- +![](/gitbook/assets/universal_reference%20%281%29.png) The universal OEM reference board is a reference design suitable W01, L01, L04 and G01 OEM modules, making it possible to have a single PCB design that can accommodate all our OEM modules. -{% hint style="info" %} +{{{% hint style="info" %}}} If you require a reference board for the G01, only this design is suitable. The L01 reference board does not contain the necessary SIM slot. -{% endhint %} +{{< /hint >}} ## Features -* Suits all OEM modules \(L01, L04, W01, G01\) +* Suits all OEM modules (L01, L04, W01, G01) * On-board 2.4GHz antenna for WiFi and Bluetooth, with the ability to switch to a external antenna via a U.FL connector. @@ -27,19 +33,19 @@ If you require a reference board for the G01, only this design is suitable. The The layout of the OEM baseboard reference is available as a PDF File -{% file src="../../.gitbook/assets/oem-universal-layout.pdf" caption="OEM Layout" %} +{% file src="/gitbook/assets/oem-universal-layout.pdf" caption="OEM Layout" %} -![](../../.gitbook/assets/oem-universal-layout-1.png) +![](/gitbook/assets/oem-universal-layout-1.png) ## Schematic The schematic of the OEM baseboard reference is available as a PDF File. -{% file src="../../.gitbook/assets/oem-universal-schematic.pdf" caption="OEM Schematic" %} +{% file src="/gitbook/assets/oem-universal-schematic.pdf" caption="OEM Schematic" %} ## Altium Project and Gerber Files The Altium Project and Gerber files are also available as a ZIP File. -{% file src="../../.gitbook/assets/oem-universal-baseboard-ref.zip" caption="OEM Altium Project and Gerber Files" %} +{% file src="/gitbook/assets/oem-universal-baseboard-ref.zip" caption="OEM Altium Project and Gerber Files" %} diff --git a/content/datasheets/oem/w01.md b/content/datasheets/oem/w01.md new file mode 100644 index 0000000..a775646 --- /dev/null +++ b/content/datasheets/oem/w01.md @@ -0,0 +1,41 @@ +--- +title: "W01" +aliases: + - datasheets/oem/w01.html + - datasheets/oem/w01.md + - product-info/oem/w01 + - chapter/datasheets/oem/w01 +--- +![](/gitbook/assets/w01%20%281%29.png) + +## Pinout + +The pinout of the W01 is available as a PDF File + +{% file src="/gitbook/assets/w01-pinout.pdf" caption="W01 Pinout" %} + +![](/gitbook/assets/w01-pinout.png) + +## Specsheets + +The specsheet of the W01 is available as a PDF File. + +{% file src="/gitbook/assets/w01-specsheet-1.pdf" caption="W01 Datasheet" %} + +## Drawings + +The drawings for the W01 is available as a PDF File. + +{% file src="/gitbook/assets/w01-drawing.pdf" caption="W01 Drawings" %} + +{{{% hint style="info" %}}} +Please note that the PIN assignments for UART1 (TX1/RX1), SPI (CLK, MOSI, MISO) and I2C (SDA, SCL) are defaults and can be changed in Software. +{{< /hint >}} + +## Tutorials + +Tutorials on how to the W01 module can be found in the [examples](/../tutorials/introduction) section of this documentation. The following tutorials might be of specific interest for the W01: + +* [WiFi connection](/../tutorials/all/wlan) +* [BLE](/../tutorials/all/ble) + diff --git a/docnotes/introduction.md b/content/docnotes/_index.md similarity index 94% rename from docnotes/introduction.md rename to content/docnotes/_index.md index 69449b9..56ceaa4 100644 --- a/docnotes/introduction.md +++ b/content/docnotes/_index.md @@ -1,4 +1,6 @@ -# Introduction - +--- +title: "" +aliases: +--- The Pycom documentation aims to be straightforward and to adhere to typical Python documentation to allow for ease of understanding. However, there may be some unusual features for those not used to Python documentation or that are new to the MicroPython Language. This section of the documentation aims to provide clarity for any of the design specifics that might be confusing for those new to Python and this style of documentation. diff --git a/content/docnotes/introduction.md b/content/docnotes/introduction.md new file mode 100644 index 0000000..0f19f33 --- /dev/null +++ b/content/docnotes/introduction.md @@ -0,0 +1,9 @@ +--- +title: "Introduction" +aliases: + - docnotes/introduction.html + - docnotes/introduction.md + - chapter/docnotes +--- +The Pycom documentation aims to be straightforward and to adhere to typical Python documentation to allow for ease of understanding. However, there may be some unusual features for those not used to Python documentation or that are new to the MicroPython Language. This section of the documentation aims to provide clarity for any of the design specifics that might be confusing for those new to Python and this style of documentation. + diff --git a/content/docnotes/mesh-networks.md b/content/docnotes/mesh-networks.md new file mode 100644 index 0000000..f7c78c2 --- /dev/null +++ b/content/docnotes/mesh-networks.md @@ -0,0 +1,9 @@ +--- +title: "Mesh Networks" +aliases: + - docnotes/mesh-networks.html + - docnotes/mesh-networks.md + - chapter/docnotes/mesh-networks +--- +Mesh Networking is currently under development. Please click [here](/tutorials/lora/lora-mesh) for the documentation. Please keep in mind that this document is still only informational. + diff --git a/docnotes/replscript.md b/content/docnotes/replscript.md similarity index 90% rename from docnotes/replscript.md rename to content/docnotes/replscript.md index 2a7591d..31a9db8 100644 --- a/docnotes/replscript.md +++ b/content/docnotes/replscript.md @@ -1,5 +1,10 @@ -# REPL vs Scripts - +--- +title: "REPL vs Scripts" +aliases: + - docnotes/replscript.html + - docnotes/replscript.md + - chapter/docnotes/replscript +--- Users of this documentation should be aware that examples given in the docs are under the expectation that they are being executed using the MicroPython REPL. This means that when certain functions are called, their output may not necessarily be printed to the console if they are run from a script. When using the REPL many classes/functions automatically produce a printed output displaying the return value of the function to the console. The code snippet below demonstrates some examples of classes/functions that might display this behaviour. ## Basic Arithmetic diff --git a/docnotes/syntax.md b/content/docnotes/syntax.md similarity index 71% rename from docnotes/syntax.md rename to content/docnotes/syntax.md index 38454ce..9806f73 100644 --- a/docnotes/syntax.md +++ b/content/docnotes/syntax.md @@ -1,12 +1,17 @@ -# Syntax - +--- +title: "Syntax" +aliases: + - docnotes/syntax.html + - docnotes/syntax.md + - chapter/docnotes/syntax +--- The Pycom documentation follows standard Python Library format using the popular Sphinx Docs tool. There are some notable points regarding the syntax of classes, methods and constants. Please see the notes below and familiarise yourself with the specific details before reviewing the documentation. ## Keyword Arguments -`Keyword Arguments` refer to the arguments that are passed into a constructor \(upon referencing a class object\). When passing values into a MicroPython constructor it is not always required to specify the name of the argument and instead rely on the order of the arguments passed as to describe what they refer to. In the example below, it can be seen that the argument `mode` is passed into the `i2c.init()` method without specifying a name. +`Keyword Arguments` refer to the arguments that are passed into a constructor (upon referencing a class object). When passing values into a MicroPython constructor it is not always required to specify the name of the argument and instead rely on the order of the arguments passed as to describe what they refer to. In the example below, it can be seen that the argument `mode` is passed into the `i2c.init()` method without specifying a name. -The values of the arguments \(as seen in the examples/docs\) refer to the default values that are passed into the constructor if nothing is provided. +The values of the arguments (as seen in the examples/docs) refer to the default values that are passed into the constructor if nothing is provided. ```python i2c.init(mode, * , baudrate=100000, pins=(SDA, SCL)) @@ -26,7 +31,7 @@ It is important to note that there are certain class methods that can only accep ## Keyword -An astrik `*` in a method description \(in the docs\), denotes that the following arguments require a keyword, i.e. `pin='P16'` in the example below. +An astrik `*` in a method description (in the docs), denotes that the following arguments require a keyword, i.e. `pin='P16'` in the example below. ```python adc.channel(* , pin, attn=ADC.ATTN_0DB) @@ -67,7 +72,7 @@ pycom.rgbled(color=0xFF0000) # Incorrect pycom.rgbled(0xFF0000) # Correct ``` -Another example of a method that only accepts value input. In this case, the `RTC.init()` method require a value \(`tuple`\) input for the `datetime`. It will not accept a keyword. +Another example of a method that only accepts value input. In this case, the `RTC.init()` method require a value (`tuple`) input for the `datetime`. It will not accept a keyword. ```python rtc.init(datetime) @@ -83,13 +88,13 @@ rtc.init((2014, 5, 1, 4, 13, 0, 0, 0)) # Correct ## Constants -The `constants` section of a library within the docs refers to specific values from that library’s class. These might be used when constructing an object from that class or when utilising a method from within that class. These are generally listed by the library name followed by the specific value. See the example below: +The `constants` section of a library within the docs refers to specific values from that library's class. These might be used when constructing an object from that class or when utilising a method from within that class. These are generally listed by the library name followed by the specific value. See the example below: ```python I2C.MASTER() ``` -{% hint style="info" %} +{{{% hint style="info" %}}} Be aware that you can only reference these constants upon importing and constructing a object from a library. -{% endhint %} +{{< /hint >}} diff --git a/firmwareapi/introduction.md b/content/firmwareapi/_index.md similarity index 64% rename from firmwareapi/introduction.md rename to content/firmwareapi/_index.md index f065fcc..6ff8887 100644 --- a/firmwareapi/introduction.md +++ b/content/firmwareapi/_index.md @@ -1,15 +1,17 @@ -# Introduction - -This chapter describes modules \(function and class libraries\) that are built into MicroPython. There are a number of categories for the available modules: +--- +title: "" +aliases: +--- +This chapter describes modules (function and class libraries) that are built into MicroPython. There are a number of categories for the available modules: * Modules which implement a subset of standard Python functionality and are not intended to be extended by the user. -* Modules which implement a subset of Python functionality, with a provision for extension by the user \(via Python code\). +* Modules which implement a subset of Python functionality, with a provision for extension by the user (via Python code). * Modules which implement MicroPython extensions to the Python standard libraries. * Modules specific to a particular port and thus not portable. ## Note about the availability of modules and their contents -This documentation in general aspires to describe all modules and functions/classes which are implemented in MicroPython. However, MicroPython is highly configurable, and each port to a particular board/embedded system makes available only a subset of MicroPython libraries. For officially supported ports, there is an effort to either filter out non-applicable items, or mark individual descriptions with “Availability:” clauses describing which ports provide a given feature. With that in mind, please still be warned that some functions/classes in a module \(or even the entire module\) described in this documentation may be unavailable in a particular build of MicroPython on a particular board. The best place to find general information of the availability/non-availability of a particular feature is the “General Information” section which contains information pertaining to a specific port. +This documentation in general aspires to describe all modules and functions/classes which are implemented in MicroPython. However, MicroPython is highly configurable, and each port to a particular board/embedded system makes available only a subset of MicroPython libraries. For officially supported ports, there is an effort to either filter out non-applicable items, or mark individual descriptions with “Availability:” clauses describing which ports provide a given feature. With that in mind, please still be warned that some functions/classes in a module (or even the entire module) described in this documentation may be unavailable in a particular build of MicroPython on a particular board. The best place to find general information of the availability/non-availability of a particular feature is the “General Information” section which contains information pertaining to a specific port. Beyond the built-in libraries described in this documentation, many more modules from the Python standard library, as well as further MicroPython extensions to it, can be found in the [micropython-lib](https://github.com/micropython/micropython-lib) repository. diff --git a/content/firmwareapi/introduction.md b/content/firmwareapi/introduction.md new file mode 100644 index 0000000..984187f --- /dev/null +++ b/content/firmwareapi/introduction.md @@ -0,0 +1,20 @@ +--- +title: "Introduction" +aliases: + - firmwareapi/introduction.html + - firmwareapi/introduction.md + - chapter/firmwareapi +--- +This chapter describes modules (function and class libraries) that are built into MicroPython. There are a number of categories for the available modules: + +* Modules which implement a subset of standard Python functionality and are not intended to be extended by the user. +* Modules which implement a subset of Python functionality, with a provision for extension by the user (via Python code). +* Modules which implement MicroPython extensions to the Python standard libraries. +* Modules specific to a particular port and thus not portable. + +## Note about the availability of modules and their contents + +This documentation in general aspires to describe all modules and functions/classes which are implemented in MicroPython. However, MicroPython is highly configurable, and each port to a particular board/embedded system makes available only a subset of MicroPython libraries. For officially supported ports, there is an effort to either filter out non-applicable items, or mark individual descriptions with “Availability:” clauses describing which ports provide a given feature. With that in mind, please still be warned that some functions/classes in a module (or even the entire module) described in this documentation may be unavailable in a particular build of MicroPython on a particular board. The best place to find general information of the availability/non-availability of a particular feature is the “General Information” section which contains information pertaining to a specific port. + +Beyond the built-in libraries described in this documentation, many more modules from the Python standard library, as well as further MicroPython extensions to it, can be found in the [micropython-lib](https://github.com/micropython/micropython-lib) repository. + diff --git a/content/firmwareapi/micropython/README.md b/content/firmwareapi/micropython/README.md new file mode 100644 index 0000000..b366e1d --- /dev/null +++ b/content/firmwareapi/micropython/README.md @@ -0,0 +1,13 @@ +--- +title: "MicroPython Modules" +aliases: + - chapter/firmwareapi/micropython +--- +The following list contains the standard Python libraries, MicroPython-specific libraries and Pycom specific modules that are available on the Pycom devices. + +The standard Python libraries have been "micro-ified" to fit in with the philosophy of MicroPython. They provide the core functionality of that module and are intended to be a drop-in replacement for the standard Python library. + +{{{% hint style="info" %}}} +Some modules are available by an u-name, and also by their non-u-name. The non-u-name can be overridden by a file of that name in your package path. For example, `import json` will first search for a file `json.py` or directory `json` and load that package if it's found. If nothing is found, it will fallback to loading the built-in `ujson` module. +{{< /hint >}} + diff --git a/firmwareapi/micropython/README.md b/content/firmwareapi/micropython/_index.md similarity index 89% rename from firmwareapi/micropython/README.md rename to content/firmwareapi/micropython/_index.md index c84c996..36aa7a7 100644 --- a/firmwareapi/micropython/README.md +++ b/content/firmwareapi/micropython/_index.md @@ -1,10 +1,12 @@ -# MicroPython Modules - +--- +title: "MicroPython Modules" +aliases: +--- The following list contains the standard Python libraries, MicroPython-specific libraries and Pycom specific modules that are available on the Pycom devices. The standard Python libraries have been "micro-ified" to fit in with the philosophy of MicroPython. They provide the core functionality of that module and are intended to be a drop-in replacement for the standard Python library. -{% hint style="info" %} +{{{% hint style="info" %}}} Some modules are available by an u-name, and also by their non-u-name. The non-u-name can be overridden by a file of that name in your package path. For example, `import json` will first search for a file `json.py` or directory `json` and load that package if it's found. If nothing is found, it will fallback to loading the built-in `ujson` module. -{% endhint %} +{{< /hint >}} diff --git a/firmwareapi/micropython/_thread.md b/content/firmwareapi/micropython/_thread.md similarity index 60% rename from firmwareapi/micropython/_thread.md rename to content/firmwareapi/micropython/_thread.md index 56edbef..d7d9c80 100644 --- a/firmwareapi/micropython/_thread.md +++ b/content/firmwareapi/micropython/_thread.md @@ -1,6 +1,11 @@ -# \_thread - -This module provides low-level primitives for working with multiple threads \(also called light-weight processes or tasks\) — multiple threads of control sharing their global data space. For synchronisation, simple locks \(also called mutexes or binary semaphores\) are provided. +--- +title: "_thread" +aliases: + - firmwareapi/micropython/_thread.html + - firmwareapi/micropython/_thread.md + - chapter/firmwareapi/micropython/_thread +--- +This module provides low-level primitives for working with multiple threads (also called light-weight processes or tasks) — multiple threads of control sharing their global data space. For synchronisation, simple locks (also called mutexes or binary semaphores) are provided. When a thread specific error occurs a `RuntimeError` exception is raised. @@ -21,25 +26,25 @@ for i in range(2): ## Methods -#### \_thread.start\_new\_thread\(function, args\[, kwargs\]\) +#### \_thread.start\_new\_thread(function, args\[, kwargs\]) -Start a new thread and return its identifier. The thread executes the function with the argument list args \(which must be a tuple\). The optional `kwargs` argument specifies a dictionary of keyword arguments. When the function returns, the thread silently exits. When the function terminates with an unhandled exception, a stack trace is printed and then the thread exits \(but other threads continue to run\). +Start a new thread and return its identifier. The thread executes the function with the argument list args (which must be a tuple). The optional `kwargs` argument specifies a dictionary of keyword arguments. When the function returns, the thread silently exits. When the function terminates with an unhandled exception, a stack trace is printed and then the thread exits (but other threads continue to run). -#### \_thread.exit\(\) +#### \_thread.exit() Raise the `SystemExit` exception. When not caught, this will cause the thread to exit silently. -#### \_thread.allocate\_lock\(\) +#### \_thread.allocate\_lock() Return a new lock object. Methods of locks are described below. The lock is initially unlocked. -#### \_thread.get\_ident\(\) +#### \_thread.get\_ident() Return the `thread identifier` of the current thread. This is a nonzero integer. Its value has no direct meaning; it is intended as a magic cookie to be used e.g. to index a dictionary of thread-specific data. Thread identifiers may be recycled when a thread exits and another thread is created. -#### \_thread.stack\_size\(\[size\]\) +#### \_thread.stack\_size(\[size\]) -Return the thread stack size \(in bytes\) used when creating new threads. The optional size argument specifies the stack size to be used for subsequently created threads, and must be `0` \(use platform or configured default\) or a positive integer value of at least `4096` \(4KiB\). 4KiB is currently the minimum supported stack size value to guarantee sufficient stack space for the interpreter itself. +Return the thread stack size (in bytes) used when creating new threads. The optional size argument specifies the stack size to be used for subsequently created threads, and must be `0` (use platform or configured default) or a positive integer value of at least `4096` (4KiB). 4KiB is currently the minimum supported stack size value to guarantee sufficient stack space for the interpreter itself. ## Objects @@ -55,9 +60,9 @@ Used for synchronisation between threads Lock objects have the following methods: -#### lock.acquire\(waitflag=1, timeout=-1\) +#### lock.acquire(waitflag=1, timeout=-1) -Without any optional argument, this method acquires the lock unconditionally, if necessary waiting until it is released by another thread \(only one thread at a time can acquire a lock — that’s their reason for existence\). +Without any optional argument, this method acquires the lock unconditionally, if necessary waiting until it is released by another thread (only one thread at a time can acquire a lock — that's their reason for existence). If the integer `waitflag` argument is present, the action depends on its value: if it is zero, the lock is only acquired if it can be acquired immediately without waiting, while if it is nonzero, the lock is acquired unconditionally as above. @@ -65,11 +70,11 @@ If the floating-point timeout argument is present and positive, it specifies the The return value is `True` if the lock is acquired successfully, `False` if not. -#### lock.release\(\) +#### lock.release() Releases the lock. The lock must have been acquired earlier, but not necessarily by the same thread. -#### lock.locked\(\) +#### lock.locked() Return the status of the lock: `True` if it has been acquired by some thread, `False` if not. diff --git a/firmwareapi/micropython/array.md b/content/firmwareapi/micropython/array.md similarity index 51% rename from firmwareapi/micropython/array.md rename to content/firmwareapi/micropython/array.md index 5965fdc..e4a8fad 100644 --- a/firmwareapi/micropython/array.md +++ b/content/firmwareapi/micropython/array.md @@ -1,22 +1,27 @@ -# array - +--- +title: "array" +aliases: + - firmwareapi/micropython/array.html + - firmwareapi/micropython/array.md + - chapter/firmwareapi/micropython/array +--- See [Python array](https://docs.python.org/3/library/array.html) for more information. -Supported format codes: `b, B, h, H, i, I, l, L, q, Q, f, d` \(the latter 2 depending on the floating-point support\). +Supported format codes: `b, B, h, H, i, I, l, L, q, Q, f, d` (the latter 2 depending on the floating-point support). ## Classes -#### class array.array\(typecode\[, iterable\]\) +#### class array.array(typecode\[, iterable\]) Create array with elements of given type. Initial contents of the array are given by an iterable. If it is not provided, an empty array is created. ## Methods -#### array.append\(val\) +#### array.append(val) Append new element to the end of array, growing it. -#### array.extend\(iterable\) +#### array.extend(iterable) Append new elements as contained in an iterable to the end of array, growing it. diff --git a/content/firmwareapi/micropython/builtin.md b/content/firmwareapi/micropython/builtin.md new file mode 100644 index 0000000..a8d8653 --- /dev/null +++ b/content/firmwareapi/micropython/builtin.md @@ -0,0 +1,131 @@ +--- +title: "Builtin" +aliases: + - firmwareapi/micropython/builtin.html + - firmwareapi/micropython/builtin.md + - chapter/firmwareapi/micropython/builtin +--- +All builtin functions are described here. They are also available via [builtins](builtin) module. + +abs() + +all() + +any() + +bin() + +class bool + +class bytearray + +class bytes + +callable() + +chr() + +class method() + +compile() + +class complex + +class dict + +dir() + +divmod() + +enumerate() + +eval() + +exec() + +filter() + +class float + +class frozenset + +getattr() + +globals() + +hasattr() + +hash() + +hex() + +id() + +input() + +class int + +isinstance() + +issubclass() + +iter() + +len() + +class list + +locals() + +map() + +max() + +class memoryview + +min() + +next() + +class object + +oct() + +open() + +ord() + +pow() + +print() + +property() + +range() + +repr() + +reversed() + +round() + +class set + +setattr() + +sorted() + +staticmethod() + +class str + +sum() + +super() + +class tuple + +type() + +zip() + diff --git a/firmwareapi/micropython/cmath.md b/content/firmwareapi/micropython/cmath.md similarity index 57% rename from firmwareapi/micropython/cmath.md rename to content/firmwareapi/micropython/cmath.md index 8aa91e3..876ad88 100644 --- a/firmwareapi/micropython/cmath.md +++ b/content/firmwareapi/micropython/cmath.md @@ -1,47 +1,52 @@ -# cmath - +--- +title: "cmath" +aliases: + - firmwareapi/micropython/cmath.html + - firmwareapi/micropython/cmath.md + - chapter/firmwareapi/micropython/cmath +--- The `cmath` module provides some basic mathematical functions for working with complex numbers. Floating point support required for this module. ## Methods -#### cmath.cos\(z\) +#### cmath.cos(z) Return the cosine of `z`. -#### cmath.exp\(z\) +#### cmath.exp(z) Return the exponential of `z`. -#### cmath.log\(z\) +#### cmath.log(z) Return the natural logarithm of `z`. The branch cut is along the negative real axis. -#### cmath.log10\(z\) +#### cmath.log10(z) Return the base-10 logarithm of `z`. The branch cut is along the negative real axis. -#### cmath.phase\(z\) +#### cmath.phase(z) -Returns the phase of the number `z`, in the range \(-pi, +pi\). +Returns the phase of the number `z`, in the range (-pi, +pi). -#### cmath.polar\(z\) +#### cmath.polar(z) Returns, as a tuple, the polar form of `z`. -#### cmath.rect\(r, phi\) +#### cmath.rect(r, phi) Returns the complex number with modulus `r` and phase `phi`. -#### cmath.sin\(z\) +#### cmath.sin(z) Return the sine of `z`. -#### cmath.sqrt\(z\) +#### cmath.sqrt(z) Return the square-root of `z`. ## Constants * `cmath.e`: Base of the natural logarithm -* `cmath.pi`: The ratio of a circle’s circumference to its diameter +* `cmath.pi`: The ratio of a circle's circumference to its diameter diff --git a/firmwareapi/micropython/gc.md b/content/firmwareapi/micropython/gc.md similarity index 59% rename from firmwareapi/micropython/gc.md rename to content/firmwareapi/micropython/gc.md index 008a2ba..675ffbc 100644 --- a/firmwareapi/micropython/gc.md +++ b/content/firmwareapi/micropython/gc.md @@ -1,24 +1,29 @@ -# gc - +--- +title: "gc" +aliases: + - firmwareapi/micropython/gc.html + - firmwareapi/micropython/gc.md + - chapter/firmwareapi/micropython/gc +--- ## Methods -#### gc.enable\(\) +#### gc.enable() Enable automatic garbage collection. -#### gc.disable\(\) +#### gc.disable() Disable automatic garbage collection. Heap memory can still be allocated, and garbage collection can still be initiated manually using `gc.collect()`. -#### gc.collect\(\) +#### gc.collect() Run a garbage collection. -#### gc.mem\_alloc\(\) +#### gc.mem\_alloc() Return the number of bytes of heap RAM that are allocated. -#### gc.mem\_free\(\) +#### gc.mem\_free() Return the number of bytes of available heap RAM. diff --git a/firmwareapi/micropython/math.md b/content/firmwareapi/micropython/math.md similarity index 68% rename from firmwareapi/micropython/math.md rename to content/firmwareapi/micropython/math.md index 696594f..4347b6b 100644 --- a/firmwareapi/micropython/math.md +++ b/content/firmwareapi/micropython/math.md @@ -1,163 +1,168 @@ -# math - +--- +title: "math" +aliases: + - firmwareapi/micropython/math.html + - firmwareapi/micropython/math.md + - chapter/firmwareapi/micropython/math +--- The math module provides some basic mathematical functions for working with floating-point numbers. Floating point support required for this module. ## Methods -#### math.acos\(x\) +#### math.acos(x) Return the inverse cosine of `x`. -#### math.acosh\(x\) +#### math.acosh(x) Return the inverse hyperbolic cosine of `x`. -#### math.asin\(x\) +#### math.asin(x) Return the inverse sine of `x`. -#### math.asinh\(x\) +#### math.asinh(x) Return the inverse hyperbolic sine of `x`. -#### math.atan\(x\) +#### math.atan(x) Return the inverse tangent of `x`. -#### math.atan2\(y, x\) +#### math.atan2(y, x) Return the principal value of the inverse tangent of `y/x`. -#### math.atanh\(x\) +#### math.atanh(x) Return the inverse hyperbolic tangent of `x`. -#### math.ceil\(x\) +#### math.ceil(x) Return an integer, being x rounded towards positive infinity. -#### math.copysign\(x, y\) +#### math.copysign(x, y) Return x with the sign of `y`. -#### math.cos\(x\) +#### math.cos(x) Return the cosine of `x`. -#### math.cosh\(x\) +#### math.cosh(x) Return the hyperbolic cosine of `x`. -#### math.degrees\(x\) +#### math.degrees(x) Return radians `x` converted to degrees. -#### math.erf\(x\) +#### math.erf(x) Return the error function of `x`. -#### math.erfc\(x\) +#### math.erfc(x) Return the complementary error function of `x`. -#### math.exp\(x\) +#### math.exp(x) Return the exponential of `x`. -#### math.expm1\(x\) +#### math.expm1(x) Return `exp(x) - 1`. -#### math.fabs\(x\) +#### math.fabs(x) Return the absolute value of `x`. -#### math.floor\(x\) +#### math.floor(x) Return an integer, being `x` rounded towards negative infinity. -#### math.fmod\(x, y\) +#### math.fmod(x, y) Return the remainder of `x/y`. -#### math.frexp\(x\) +#### math.frexp(x) Decomposes a floating-point number into its mantissa and exponent. The returned value is the tuple `(m, e)` such that `x == m * 2**e` exactly. If `x == 0` then the function returns `(0.0, 0)`, otherwise the relation `0.5 <= abs(m) < 1` holds. -#### math.gamma\(x\) +#### math.gamma(x) Return the gamma function of `x`. -#### math.isfinite\(x\) +#### math.isfinite(x) Return `True` if `x` is finite. -#### math.isinf\(x\) +#### math.isinf(x) Return `True` if `x` is infinite. -#### math.isnan\(x\) +#### math.isnan(x) Return `True` if `x` is not-a-number -#### math.ldexp\(x, exp\) +#### math.ldexp(x, exp) Return `x * (2**exp)`. -#### math.lgamma\(x\) +#### math.lgamma(x) Return the natural logarithm of the gamma function of `x`. -#### math.log\(x\) +#### math.log(x) Return the natural logarithm of `x`. -#### math.log10\(x\) +#### math.log10(x) Return the base-10 logarithm of `x`. -#### math.log2\(x\) +#### math.log2(x) Return the base-2 logarithm of `x`. -#### math.modf\(x\) +#### math.modf(x) Return a tuple of two floats, being the fractional and integral parts of `x`. Both return values have the same sign as `x`. -#### math.pow\(x, y\) +#### math.pow(x, y) Returns `x` to the power of `y`. -#### math.radians\(x\) +#### math.radians(x) Return degrees `x` converted to radians. -#### math.sin\(x\) +#### math.sin(x) Return the sine of `x`. -#### math.sinh\(x\) +#### math.sinh(x) Return the hyperbolic sine of `x`. -#### math.sqrt\(x\) +#### math.sqrt(x) Return the square root of `x`. -#### math.tan\(x\) +#### math.tan(x) Return the tangent of `x`. -#### math.tanh\(x\) +#### math.tanh(x) Return the hyperbolic tangent of `x`. -#### math.trunc\(x\) +#### math.trunc(x) Return an integer, being `x` rounded towards `0`. ## Constants * `math.e`: Base of the natural logarithm -* `math.pi`: The ratio of a circle’s circumference to its diameter +* `math.pi`: The ratio of a circle's circumference to its diameter diff --git a/firmwareapi/micropython/micropython.md b/content/firmwareapi/micropython/micropython.md similarity index 74% rename from firmwareapi/micropython/micropython.md rename to content/firmwareapi/micropython/micropython.md index 9aae1ff..5a07cd2 100644 --- a/firmwareapi/micropython/micropython.md +++ b/content/firmwareapi/micropython/micropython.md @@ -1,14 +1,19 @@ -# micropython - +--- +title: "micropython" +aliases: + - firmwareapi/micropython/micropython.html + - firmwareapi/micropython/micropython.md + - chapter/firmwareapi/micropython/micropython +--- ## Methods -#### micropython.alloc\_emergency\_exception\_buf\(size\) +#### micropython.alloc\_emergency\_exception\_buf(size) -Allocate size bytes of RAM for the emergency exception buffer \(a good size is around 100 bytes\). The buffer is used to create exceptions in cases when normal RAM allocation would fail \(eg within an interrupt handler\) and therefore give useful traceback information in these situations. +Allocate size bytes of RAM for the emergency exception buffer (a good size is around 100 bytes). The buffer is used to create exceptions in cases when normal RAM allocation would fail (eg within an interrupt handler) and therefore give useful traceback information in these situations. -A good way to use this function is to place it at the start of a main script \(e.g. `boot.py` or `main.py`\) and then the emergency exception buffer will be active for all the code following it. +A good way to use this function is to place it at the start of a main script (e.g. `boot.py` or `main.py`) and then the emergency exception buffer will be active for all the code following it. -#### micropython.const\(expr\) +#### micropython.const(expr) Used to declare that the expression is a constant so that the compile can optimise it. The use of this function should be as follows: @@ -23,35 +28,35 @@ Constants declared this way are still accessible as global variables from outsid This const function is recognised directly by the MicroPython parser and is provided as part of the `micropython` module mainly so that scripts can be written which run under both CPython and MicroPython, by following the above pattern. -#### micropython.opt\_level\(\[level\]\) +#### micropython.opt\_level(\[level\]) If `level` is given then this function sets the optimisation level for subsequent compilation of scripts, and returns `None`. Otherwise it returns the current optimisation level. -#### micropython.mem\_info\(\[verbose\]\) +#### micropython.mem\_info(\[verbose\]) Print information about currently used memory. If the `verbose` argument is given then extra information is printed. The information that is printed is implementation dependent, but currently includes the amount of stack and heap used. In verbose mode it prints out the entire heap indicating which blocks are used and which are free. -#### micropython.qstr\_info\(\[verbose\]\) +#### micropython.qstr\_info(\[verbose\]) Print information about currently interned strings. If the `verbose` argument is given then extra information is printed. The information that is printed is implementation dependent, but currently includes the number of interned strings and the amount of RAM they use. In verbose mode it prints out the names of all RAM-interned strings. -#### micropython.stack\_use\(\) +#### micropython.stack\_use() Return an integer representing the current amount of stack that is being used. The absolute value of this is not particularly useful, rather it should be used to compute differences in stack usage at different points. -#### micropython.heap\_lock\(\) +#### micropython.heap\_lock() -#### micropython.heap\_unlock\(\) +#### micropython.heap\_unlock() Lock or unlock the heap. When locked no memory allocation can occur and a `MemoryError` will be raised if any heap allocation is attempted. These functions can be nested, i.e. `heap_lock()` can be called multiple times in a row and the lock-depth will increase, and then `heap_unlock()` must be called the same number of times to make the heap available again. -#### micropython.kbd\_intr\(chr\) +#### micropython.kbd\_intr(chr) Set the character that will raise a `KeyboardInterrupt` exception. By default this is set to 3 during script execution, corresponding to `Ctrl-C`. Passing `-1` to this function will disable capture of `Ctrl-C`, and passing `3` will restore it. diff --git a/firmwareapi/micropython/select.md b/content/firmwareapi/micropython/select.md similarity index 52% rename from firmwareapi/micropython/select.md rename to content/firmwareapi/micropython/select.md index eb2ba32..602a023 100644 --- a/firmwareapi/micropython/select.md +++ b/content/firmwareapi/micropython/select.md @@ -1,6 +1,11 @@ -# select - -This module provides functions to wait for events on streams \(select streams which are ready for operations\). +--- +title: "select" +aliases: + - firmwareapi/micropython/select.html + - firmwareapi/micropython/select.md + - chapter/firmwareapi/micropython/select +--- +This module provides functions to wait for events on streams (select streams which are ready for operations). ## Pyboard specifics @@ -8,11 +13,11 @@ Polling is an efficient way of waiting for read/write activity on multiple objec ## Methods -#### select.poll\(\) +#### select.poll() Create an instance of the `Poll` class. -#### select.select\(rlist, wlist, xlist\[, timeout\]\) +#### select.select(rlist, wlist, xlist\[, timeout\]) Wait for activity on a set of objects. @@ -22,7 +27,7 @@ This function is provided for compatibility and is not efficient. Usage of `Poll ### Methods -#### poll.register\(obj\[, eventmask\]\) +#### poll.register(obj\[, eventmask\]) Register `obj` for polling. `eventmask` is logical OR of: @@ -33,17 +38,17 @@ Register `obj` for polling. `eventmask` is logical OR of: `eventmask` defaults to `select.POLLIN | select.POLLOUT`. -#### poll.unregister\(obj\) +#### poll.unregister(obj) Unregister `obj` from polling. -#### poll.modify\(obj, eventmask\) +#### poll.modify(obj, eventmask) Modify the `eventmask` for `obj`. -#### poll.poll\(\[timeout\]\) +#### poll.poll(\[timeout\]) -Wait for at least one of the registered objects to become ready. Returns list of \(`obj`, `event`, ...\) tuples, `event` element specifies which events happened with a stream and is a combination of `select.POLL*` constants described above. There may be other elements in tuple, depending on a platform and version, so don’t assume that its size is 2. In case of timeout, an empty list is returned. +Wait for at least one of the registered objects to become ready. Returns list of (`obj`, `event`, ...) tuples, `event` element specifies which events happened with a stream and is a combination of `select.POLL*` constants described above. There may be other elements in tuple, depending on a platform and version, so don't assume that its size is 2. In case of timeout, an empty list is returned. Timeout is in milliseconds. diff --git a/firmwareapi/micropython/sys.md b/content/firmwareapi/micropython/sys.md similarity index 68% rename from firmwareapi/micropython/sys.md rename to content/firmwareapi/micropython/sys.md index 61dae02..7594ab0 100644 --- a/firmwareapi/micropython/sys.md +++ b/content/firmwareapi/micropython/sys.md @@ -1,40 +1,45 @@ -# sys - +--- +title: "sys" +aliases: + - firmwareapi/micropython/sys.html + - firmwareapi/micropython/sys.md + - chapter/firmwareapi/micropython/sys +--- ## Methods -#### sys.exit\(retval=0\) +#### sys.exit(retval=0) Terminate current program with a given exit code. Underlyingly, this function raise as `SystemExit` exception. If an argument is given, its value given as an argument to `SystemExit`. -#### sys.print\_exception\(exc, file=sys.stdout\) +#### sys.print\_exception(exc, file=sys.stdout) -Print exception with a traceback to a file-like object file \(or `sys.stdout` by default\). +Print exception with a traceback to a file-like object file (or `sys.stdout` by default). -{% hint style="info" %} +{{{% hint style="info" %}}} **Difference to CPython** This is simplified version of a function which appears in the traceback module in CPython. Unlike `traceback.print_exception()`, this function takes just exception value instead of exception type, exception value, and traceback object; file argument should be positional; further arguments are not supported. CPython-compatible traceback module can be found in `micropython-lib`. -{% endhint %} +{{< /hint >}} ## Constants * `sys.argv`: A mutable list of arguments the current program was started with. -* `sys.byteorder`: The byte order of the system \("little" or "big"\). +* `sys.byteorder`: The byte order of the system ("little" or "big"). * `sys.implementation`: Object with information about the current Python implementation. For MicroPython, it has following attributes: * _name_ - string "micropython" - * _version_ - tuple \(major, minor, micro\), e.g. \(1, 7, 0\) + * _version_ - tuple (major, minor, micro), e.g. (1, 7, 0) - This object is the recommended way to distinguish MicroPython from other Python implementations \(note that it still may not exist in the very minimal ports\). + This object is the recommended way to distinguish MicroPython from other Python implementations (note that it still may not exist in the very minimal ports). -{% hint style="info" %} +{{{% hint style="info" %}}} **Difference to CPython** CPython mandates more attributes for this object, but the actual useful bare minimum is implemented in MicroPython. -{% endhint %} +{{< /hint >}} -* `sys.maxsize`: Maximum value which a native integer type can hold on the current platform, or maximum value representable by MicroPython integer type, if it’s smaller than platform max value \(that is the case for MicroPython ports without long int support\). +* `sys.maxsize`: Maximum value which a native integer type can hold on the current platform, or maximum value representable by MicroPython integer type, if it's smaller than platform max value (that is the case for MicroPython ports without long int support). -This attribute is useful for detecting "bitness" of a platform \(32-bit vs 64-bit, etc.\). It’s recommended to not compare this attribute to some value directly, but instead count number of bits in it: +This attribute is useful for detecting "bitness" of a platform (32-bit vs 64-bit, etc.). It's recommended to not compare this attribute to some value directly, but instead count number of bits in it: ```python bits = 0 @@ -53,7 +58,7 @@ else: * `sys.modules`: Dictionary of loaded modules. On some ports, it may not include builtin modules. * `sys.path`: A mutable list of directories to search for imported modules. -* `sys.platform`: The platform that MicroPython is running on. For OS/RTOS ports, this is usually an identifier of the OS, e.g. `linux`. For baremetal ports, it is an identifier of a board, e.g. `pyboard` for the original MicroPython reference board. It thus can be used to distinguish one board from another. If you need to check whether your program runs on MicroPython \(vs other Python implementation\), use `sys.implementation` instead. +* `sys.platform`: The platform that MicroPython is running on. For OS/RTOS ports, this is usually an identifier of the OS, e.g. `linux`. For baremetal ports, it is an identifier of a board, e.g. `pyboard` for the original MicroPython reference board. It thus can be used to distinguish one board from another. If you need to check whether your program runs on MicroPython (vs other Python implementation), use `sys.implementation` instead. * `sys.stderr`: Standard error stream. * `sys.stdin`: Standard input stream. * `sys.stdout`: Standard output stream. diff --git a/firmwareapi/micropython/ubinascii.md b/content/firmwareapi/micropython/ubinascii.md similarity index 51% rename from firmwareapi/micropython/ubinascii.md rename to content/firmwareapi/micropython/ubinascii.md index b492379..4b6ad1a 100644 --- a/firmwareapi/micropython/ubinascii.md +++ b/content/firmwareapi/micropython/ubinascii.md @@ -1,28 +1,33 @@ -# ubinascii - -This module implements conversions between binary data and various encodings of it in ASCII form \(in both directions\). +--- +title: "ubinascii" +aliases: + - firmwareapi/micropython/ubinascii.html + - firmwareapi/micropython/ubinascii.md + - chapter/firmwareapi/micropython/ubinascii +--- +This module implements conversions between binary data and various encodings of it in ASCII form (in both directions). ## Methods -#### ubinascii.hexlify\(data\[, sep\]\) +#### ubinascii.hexlify(data\[, sep\]) Convert binary data to hexadecimal representation. Returns bytes string. -{% hint style="info" %} +{{{% hint style="info" %}}} **Difference to CPython** If additional argument, `sep` is supplied, it is used as a separator between hexadecimal values. -{% endhint %} +{{< /hint >}} -#### ubinascii.unhexlify\(data\) +#### ubinascii.unhexlify(data) -Convert hexadecimal data to binary representation. Returns bytes string. \(i.e. inverse of `hexlify`\) +Convert hexadecimal data to binary representation. Returns bytes string. (i.e. inverse of `hexlify`) -#### ubinascii.a2b\_base64\(data\) +#### ubinascii.a2b\_base64(data) Convert Base64-encoded data to binary representation. Returns bytes string. -#### ubinascii.b2a\_base64\(data\) +#### ubinascii.b2a\_base64(data) Encode binary data in Base64 format. Returns string. diff --git a/firmwareapi/micropython/ucrypto.md b/content/firmwareapi/micropython/ucrypto.md similarity index 71% rename from firmwareapi/micropython/ucrypto.md rename to content/firmwareapi/micropython/ucrypto.md index 79a1f06..5f6c238 100644 --- a/firmwareapi/micropython/ucrypto.md +++ b/content/firmwareapi/micropython/ucrypto.md @@ -1,14 +1,19 @@ -# ucrypto - -This module provides native support for cryptographic algorithms. It’s loosely based on PyCrypto. +--- +title: "ucrypto" +aliases: + - firmwareapi/micropython/ucrypto.html + - firmwareapi/micropython/ucrypto.md + - chapter/firmwareapi/micropython/ucrypto +--- +This module provides native support for cryptographic algorithms. It's loosely based on PyCrypto. ## Classes -* [class AES](../pycom/aes.md) - Advanced Encryption Standard +* [class AES](/pycom/aes) - Advanced Encryption Standard ## **Methods** -#### crypto.getrandbits\(bits\) +#### crypto.getrandbits(bits) Returns a bytes object filled with random bits obtained from the hardware random number generator. @@ -16,7 +21,7 @@ According to the **ESP32 Technical Reference Manual**, such bits "... can be use The parameter `bits` is rounded upwards to the nearest multiple of 32 bits. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Cryptography is not a trivial business. Doing things the wrong way could quickly result in decreased or no security. Please document yourself in the subject if you are depending on encryption to secure important information. -{% endhint %} +{{< /hint >}} diff --git a/firmwareapi/micropython/uctypes.md b/content/firmwareapi/micropython/uctypes.md similarity index 60% rename from firmwareapi/micropython/uctypes.md rename to content/firmwareapi/micropython/uctypes.md index 4fe016c..1421f49 100644 --- a/firmwareapi/micropython/uctypes.md +++ b/content/firmwareapi/micropython/uctypes.md @@ -1,10 +1,15 @@ -# uctypes +--- +title: "uctypes" +aliases: + - firmwareapi/micropython/uctypes.html + - firmwareapi/micropython/uctypes.md + - chapter/firmwareapi/micropython/uctypes +--- +This module implements "foreign data interface" for MicroPython. The idea behind it is similar to CPython's `ctypes` modules, but the actual API is different, streamlined and optimised for small size. The basic idea of the module is to define data structure layout with about the same power as the C language allows, and the access it using familiar dot-syntax to reference sub-fields. -This module implements "foreign data interface" for MicroPython. The idea behind it is similar to CPython’s `ctypes` modules, but the actual API is different, streamlined and optimised for small size. The basic idea of the module is to define data structure layout with about the same power as the C language allows, and the access it using familiar dot-syntax to reference sub-fields. - -{% hint style="info" %} -Module ustruct Standard Python way to access binary data structures \(doesn’t scale well to large and complex structures\). -{% endhint %} +{{{% hint style="info" %}}} +Module ustruct Standard Python way to access binary data structures (doesn't scale well to large and complex structures). +{{< /hint >}} ## Defining Structure Layout @@ -18,7 +23,7 @@ Following are encoding examples for various field types: "field_name": uctypes.UINT32 | 0 ``` -In other words, value is scalar type identifier OR-ed with field offset \(in bytes\) from the start of the structure. +In other words, value is scalar type identifier OR-ed with field offset (in bytes) from the start of the structure. * Recursive structures: @@ -29,7 +34,7 @@ In other words, value is scalar type identifier OR-ed with field offset \(in byt }) ``` -I.e. value is a 2-tuple, first element of which is offset, and second is a structure descriptor dictionary \(note: offsets in recursive descriptors are relative to a structure it defines\). +I.e. value is a 2-tuple, first element of which is offset, and second is a structure descriptor dictionary (note: offsets in recursive descriptors are relative to a structure it defines). * Arrays of Primitive Types: @@ -69,21 +74,21 @@ I.e. value is a 2-tuple, first element of which is PTR flag OR-ed with offset, s "bitf0": uctypes.BFUINT16 | 0 | 0 << uctypes.BF_POS | 8 << uctypes.BF_LEN, ``` -I.e. value is type of scalar value containing given bitfield \(typenames are similar to scalar types, but prefixes with "BF"\), OR-ed with offset for scalar value containing the bitfield, and further OR-ed with values for bit offset and bit length of the bitfield within scalar value, shifted by BF\_POS and BF\_LEN positions, respectively. Bitfield position is counted from the least significant bit, and is the number of right-most bit of a field \(in other words, it’s a number of bits a scalar needs to be shifted right to extra the bitfield\). +I.e. value is type of scalar value containing given bitfield (typenames are similar to scalar types, but prefixes with "BF"), OR-ed with offset for scalar value containing the bitfield, and further OR-ed with values for bit offset and bit length of the bitfield within scalar value, shifted by BF\_POS and BF\_LEN positions, respectively. Bitfield position is counted from the least significant bit, and is the number of right-most bit of a field (in other words, it's a number of bits a scalar needs to be shifted right to extra the bitfield). -In the example above, first `UINT16` value will be extracted at offset 0 \(this detail may be important when accessing hardware registers, where particular access size and alignment are required\), and then bitfield whose rightmost bit is least-significant bit of this `UINT16`, and length is 8 bits, will be extracted - effectively, this will access least-significant byte of `UINT16`. +In the example above, first `UINT16` value will be extracted at offset 0 (this detail may be important when accessing hardware registers, where particular access size and alignment are required), and then bitfield whose rightmost bit is least-significant bit of this `UINT16`, and length is 8 bits, will be extracted - effectively, this will access least-significant byte of `UINT16`. Note that bitfield operations are independent of target byte endianness, in particular, example above will access least-significant byte of `UINT16` in both little- and big-endian structures. But it depends on the least significant bit being numbered 0. Some targets may use different numbering in their native ABI, but `uctypes` always uses normalised numbering described above. ## Module Contents -#### class uctypes.struct\(addr, descriptor, layout\_type=NATIVE\) +#### class uctypes.struct(addr, descriptor, layout\_type=NATIVE) -Instantiate a "foreign data structure" object based on structure address in memory, descriptor \(encoded as a dictionary\), and layout type \(see below\). +Instantiate a "foreign data structure" object based on structure address in memory, descriptor (encoded as a dictionary), and layout type (see below). #### uctypes.LITTLE\_ENDIAN -Layout type for a little-endian packed structure. \(Packed means that every field occupies exactly as many bytes as defined in the descriptor, i.e. the alignment is 1\). +Layout type for a little-endian packed structure. (Packed means that every field occupies exactly as many bytes as defined in the descriptor, i.e. the alignment is 1). #### uctypes.BIG\_ENDIAN @@ -93,46 +98,46 @@ Layout type for a big-endian packed structure. Layout type for a native structure - with data endianness and alignment conforming to the ABI of the system on which MicroPython runs. -#### uctypes.sizeof\(struct\) +#### uctypes.sizeof(struct) -Return size of data structure in bytes. Argument can be either structure class or specific instantiated structure object \(or its aggregate field\). +Return size of data structure in bytes. Argument can be either structure class or specific instantiated structure object (or its aggregate field). -#### uctypes.addressof\(obj\) +#### uctypes.addressof(obj) -Return address of an object. Argument should be bytes, `bytearray` or other object supporting buffer protocol \(and address of this buffer is what actually returned\). +Return address of an object. Argument should be bytes, `bytearray` or other object supporting buffer protocol (and address of this buffer is what actually returned). -#### uctypes.bytes\_at\(addr, size\) +#### uctypes.bytes\_at(addr, size) Capture memory at the given address and size as bytes object. As bytes object is immutable, memory is actually duplicated and copied into bytes object, so if memory contents change later, created object retains original value. -#### uctypes.bytearray\_at\(addr, size\) +#### uctypes.bytearray\_at(addr, size) Capture memory at the given address and size as `bytearray` object. Unlike `bytes_at()` function above, memory is captured by reference, so it can be both written too, and you will access current value at the given memory address. ## Structure Descriptors and Instantiating Structure Objects -Given a structure descriptor dictionary and its layout type, you can instantiate a specific structure instance at a given memory address using uctypes.struct\(\) constructor. Memory address usually comes from following sources: +Given a structure descriptor dictionary and its layout type, you can instantiate a specific structure instance at a given memory address using uctypes.struct() constructor. Memory address usually comes from following sources: * Predefined address, when accessing hardware registers on a baremetal system. Lookup these addresses in datasheet for a particular MCU/SoC. -* As a return value from a call to some FFI \(Foreign Function Interface\) function. -* From uctypes.addressof\(\), when you want to pass arguments to an FFI function, or alternatively, to access some data for I/O \(for example, data read from a file or network socket\). +* As a return value from a call to some FFI (Foreign Function Interface) function. +* From uctypes.addressof(), when you want to pass arguments to an FFI function, or alternatively, to access some data for I/O (for example, data read from a file or network socket). ## Structure objects -Structure objects allow accessing individual fields using standard dot notation: `my_struct.substruct1.field1`. If a field is of scalar type, getting it will produce a primitive value \(Python integer or float\) corresponding to the value contained in a field. A scalar field can also be assigned to. +Structure objects allow accessing individual fields using standard dot notation: `my_struct.substruct1.field1`. If a field is of scalar type, getting it will produce a primitive value (Python integer or float) corresponding to the value contained in a field. A scalar field can also be assigned to. If a field is an array, its individual elements can be accessed with the standard subscript operator `[]` - both read and assigned to. -If a field is a pointer, it can be dereferenced using `[0]` syntax \(corresponding to C `*` operator, though `[0]` works in C too\). Subscripting a pointer with other integer values but 0 are supported too, with the same semantics as in C. +If a field is a pointer, it can be dereferenced using `[0]` syntax (corresponding to C `*` operator, though `[0]` works in C too). Subscripting a pointer with other integer values but 0 are supported too, with the same semantics as in C. Summing up, accessing structure fields generally follows C syntax, except for pointer dereference, when you need to use `[0]` operator instead of `*`. ## Limitations -Accessing non-scalar fields leads to allocation of intermediate objects to represent them. This means that special care should be taken to layout a structure which needs to be accessed when memory allocation is disabled \(e.g. from an interrupt\). The recommendations are: +Accessing non-scalar fields leads to allocation of intermediate objects to represent them. This means that special care should be taken to layout a structure which needs to be accessed when memory allocation is disabled (e.g. from an interrupt). The recommendations are: * Avoid nested structures. For example, instead of `mcu_registers.peripheral_a.register1`, define separate layout descriptors for each peripheral, to be accessed as `peripheral_a.register1`. * Avoid other non-scalar data, like array. For example, instead of `peripheral_a.register[0]` use `peripheral_a.register0`. -Note that these recommendations will lead to decreased readability and conciseness of layouts, so they should be used only if the need to access structure fields without allocation is anticipated \(it’s even possible to define 2 parallel layouts - one for normal usage, and a restricted one to use when memory allocation is prohibited\). +Note that these recommendations will lead to decreased readability and conciseness of layouts, so they should be used only if the need to access structure fields without allocation is anticipated (it's even possible to define 2 parallel layouts - one for normal usage, and a restricted one to use when memory allocation is prohibited). diff --git a/firmwareapi/micropython/uhashlib.md b/content/firmwareapi/micropython/uhashlib.md similarity index 66% rename from firmwareapi/micropython/uhashlib.md rename to content/firmwareapi/micropython/uhashlib.md index 2aa8904..9ffbef5 100644 --- a/firmwareapi/micropython/uhashlib.md +++ b/content/firmwareapi/micropython/uhashlib.md @@ -1,44 +1,49 @@ -# uhashlib - +--- +title: "uhashlib" +aliases: + - firmwareapi/micropython/uhashlib.html + - firmwareapi/micropython/uhashlib.md + - chapter/firmwareapi/micropython/uhashlib +--- This module implements binary data hashing algorithms. MD5 and SHA are supported. By limitations in the hardware, only one active hashing operation is supported at a time. ## Constructors -#### class uhashlib.md5\(\[data\]\) +#### class uhashlib.md5(\[data\]) Create a MD5 hasher object and optionally feed data into it. -#### class uhashlib.sha1\(\[data\]\) +#### class uhashlib.sha1(\[data\]) Create a SHA-1 hasher object and optionally feed data into it. -#### class uhashlib.sha224\(\[data\]\) +#### class uhashlib.sha224(\[data\]) Create a SHA-224 hasher object and optionally feed data into it. -#### class uhashlib.sha256\(\[data\]\) +#### class uhashlib.sha256(\[data\]) Create a SHA-256 hasher object and optionally feed data into it. -#### class uhashlib.sha384\(\[data\]\) +#### class uhashlib.sha384(\[data\]) Create a SHA-384 hasher object and optionally feed data into it. -#### class uhashlib.sha512\(\[data\]\) +#### class uhashlib.sha512(\[data\]) Create a SHA-512 hasher object and optionally feed data into it. ## Methods -#### hash.update\(data\) +#### hash.update(data) Feed more binary data into hash. -#### hash.digest\(\) +#### hash.digest() Return hash for all data passed through hash, as a bytes object. After this method is called, more data cannot be fed into hash any longer. -#### hash.hexdigest\(\) +#### hash.hexdigest() This method is NOT implemented. Use `ubinascii.hexlify(hash.digest())` to achieve a similar effect. diff --git a/content/firmwareapi/micropython/ujson.md b/content/firmwareapi/micropython/ujson.md new file mode 100644 index 0000000..084d581 --- /dev/null +++ b/content/firmwareapi/micropython/ujson.md @@ -0,0 +1,23 @@ +--- +title: "ujson" +aliases: + - firmwareapi/micropython/ujson.html + - firmwareapi/micropython/ujson.md + - chapter/firmwareapi/micropython/ujson +--- +This modules allows to convert between Python objects and the JSON data format. + +## Methods + +#### ujson.dumps(obj) + +Return `obj` represented as a JSON string. + +#### ujson.loads(str) + +Parse the JSON `str` and return an object. Raises `ValueError` if the string is not correctly formed. + +#### ujson.load(fp) + +Parse contents of `fp` (a `.read()`-supporting file-like object containing a JSON document). Raises `ValueError` if the content is not correctly formed. + diff --git a/firmwareapi/micropython/uos.md b/content/firmwareapi/micropython/uos.md similarity index 54% rename from firmwareapi/micropython/uos.md rename to content/firmwareapi/micropython/uos.md index f3c6ca8..1e272c3 100644 --- a/firmwareapi/micropython/uos.md +++ b/content/firmwareapi/micropython/uos.md @@ -1,5 +1,10 @@ -# uos - +--- +title: "uos" +aliases: + - firmwareapi/micropython/uos.html + - firmwareapi/micropython/uos.md + - chapter/firmwareapi/micropython/uos +--- The `uos` module contains functions for filesystem access and `urandom` function. ## Port Specifics @@ -7,78 +12,78 @@ The `uos` module contains functions for filesystem access and `urandom` function The filesystem has `/` as the root directory and the available physical drives are accessible from here. They are currently: * `/flash` – the internal flash filesystem -* `/sd` – the SD card \(if it exists\) +* `/sd` – the SD card (if it exists) ## Methods -#### uos.uname\(\) +#### uos.uname() Return information about the system, firmware release version, and MicroPython interpreter version. -#### uos.chdir\(path\) +#### uos.chdir(path) Change current directory. -#### uos.getcwd\(\) +#### uos.getcwd() Get the current directory. -#### uos.listdir\(\[dir\]\) +#### uos.listdir(\[dir\]) With no argument, list the current directory. Otherwise list the given directory. -#### uos.mkdir\(path\) +#### uos.mkdir(path) Create a new directory. -#### uos.remove\(path\) +#### uos.remove(path) Remove a file. -#### uos.rmdir\(path\) +#### uos.rmdir(path) Remove a directory. -#### uos.rename\(old\_path, new\_path\) +#### uos.rename(old\_path, new\_path) Rename a file. -#### uos.stat\(path\) +#### uos.stat(path) Get the status of a file or directory. The return value is a tuple with the following 10 values, in order: * `st_mode`: protection bits. -* `st_ino`: `inode` number. \(not implemented, returns 0\) -* `st_dev`: device. \(not implemented, returns 0\) -* `st_nlink`: number of hard links. \(not implemented, returns 0\) -* `st_uid`: user id of owner. \(not implemented, returns 0\) -* `st_gid`: group id of owner. \(not implemented, returns 0\) +* `st_ino`: `inode` number. (not implemented, returns 0) +* `st_dev`: device. (not implemented, returns 0) +* `st_nlink`: number of hard links. (not implemented, returns 0) +* `st_uid`: user id of owner. (not implemented, returns 0) +* `st_gid`: group id of owner. (not implemented, returns 0) * `st_size`: size of file in bytes. * `st_atime`: time of most recent access. * `st_mtime`: time of most recent content modification. * `st_ctime`: time of most recent metadata change. -#### uos.getfree\(path\) +#### uos.getfree(path) -Returns the free space \(in KiB\) in the drive specified by path. +Returns the free space (in KiB) in the drive specified by path. -#### uos.sync\(\) +#### uos.sync() Sync all filesystems. -#### uos.urandom\(n\) +#### uos.urandom(n) Return a bytes object with n random bytes. -#### uos.unlink\(path\) +#### uos.unlink(path) Alias for the `remove()` method. -#### uos.mount\(block\_device, mount\_point, \* , readonly=False\) +#### uos.mount(block\_device, mount\_point, \* , readonly=False) -Mounts a block device \(like an SD object\) in the specified mount point. Example: +Mounts a block device (like an SD object) in the specified mount point. Example: ```python os.mount(sd, '/sd') @@ -87,9 +92,9 @@ uos.unmount(path) Unmounts a previously mounted block device from the given path. -#### uos.mkfat\(block\_device\) +#### uos.mkfat(block\_device) -Instantiate a VFS \(Virtual File System\) object with underlying FAT file system. +Instantiate a VFS (Virtual File System) object with underlying FAT file system. Example: @@ -103,13 +108,13 @@ vfs.mkfs(sd) # Formating the SD card os.mount(vfs, '/sd') ``` -#### uos.fsformat\(path\) +#### uos.fsformat(path) Formats the block device mounted under the input path, must be either `/flash` or `/sd` -#### uos.dupterm\(stream\_object\) +#### uos.dupterm(stream\_object) -Duplicate the terminal \(the REPL\) on the passed stream-like object. The given object must at least implement the `read()` and `write()` methods. +Duplicate the terminal (the REPL) on the passed stream-like object. The given object must at least implement the `read()` and `write()` methods. ## Constants diff --git a/firmwareapi/micropython/ure.md b/content/firmwareapi/micropython/ure.md similarity index 60% rename from firmwareapi/micropython/ure.md rename to content/firmwareapi/micropython/ure.md index 6885891..60e4cf1 100644 --- a/firmwareapi/micropython/ure.md +++ b/content/firmwareapi/micropython/ure.md @@ -1,6 +1,11 @@ -# ure - -This module implements regular expression operations. Regular expression syntax supported is a subset of CPython re module \(and actually is a subset of POSIX extended regular expressions\). +--- +title: "ure" +aliases: + - firmwareapi/micropython/ure.html + - firmwareapi/micropython/ure.md + - chapter/firmwareapi/micropython/ure +--- +This module implements regular expression operations. Regular expression syntax supported is a subset of CPython re module (and actually is a subset of POSIX extended regular expressions). Supported operators are: @@ -21,17 +26,17 @@ Counted repetitions `({m,n})`, more advanced assertions, named groups, etc. are ## Methods -#### ure.compile\(regex\) +#### ure.compile(regex) Compile regular expression, return `regex object`. -#### ure.match\(regex, string\) +#### ure.match(regex, string) Match regex against `string`. Match always happens from starting position in a string. -#### ure.search\(regex, string\) +#### ure.search(regex, string) -Search regex in a string. Unlike match, this will search string for first position which matches regex \(which still may be 0 if regex is anchored\). +Search regex in a string. Unlike match, this will search string for first position which matches regex (which still may be 0 if regex is anchored). #### ure.DEBUG @@ -41,17 +46,17 @@ Flag value, display debug information about compiled expression. Compiled regular expression. Instances of this class are created using `ure.compile()`. -#### regex.match\(string\) +#### regex.match(string) -#### regex.search\(string\) +#### regex.search(string) -#### regex.split\(string, max\_split=-1\) +#### regex.split(string, max\_split=-1) ## Match objects Match objects as returned by `match()` and `search()` methods. -#### match.group\(\[index\]\) +#### match.group(\[index\]) Only numeric groups are supported. diff --git a/firmwareapi/micropython/usocket.md b/content/firmwareapi/micropython/usocket.md similarity index 76% rename from firmwareapi/micropython/usocket.md rename to content/firmwareapi/micropython/usocket.md index 6473486..e260f39 100644 --- a/firmwareapi/micropython/usocket.md +++ b/content/firmwareapi/micropython/usocket.md @@ -1,20 +1,25 @@ -# usocket - +--- +title: "usocket" +aliases: + - firmwareapi/micropython/usocket.html + - firmwareapi/micropython/usocket.md + - chapter/firmwareapi/micropython/usocket +--- This module provides access to the BSD socket interface. See corresponding CPython module for comparison. -## Socket Address Format\(s\) +## Socket Address Format(s) Functions below which expect a network address, accept it in the format of `(ipv4_address, port)`, where `ipv4_address` is a string with dot-notation numeric IPv4 address, e.g. `8.8.8.8`, and port is integer port number in the range 1-65535. Note the domain names are not accepted as `ipv4_address`, they should be resolved first using `socket.getaddrinfo()`. ## Methods -#### socket.socket\(socket.AF\_INET, socket.SOCK\_STREAM, socket.IPPROTO\_TCP\) +#### socket.socket(socket.AF\_INET, socket.SOCK\_STREAM, socket.IPPROTO\_TCP) Create a new socket using the given address family, socket type and protocol number. -#### socket.getaddrinfo\(host, port\) +#### socket.getaddrinfo(host, port) Translate the host/port argument into a sequence of 5-tuples that contain all the necessary arguments for creating a socket connected to that service. The list of 5-tuples has following structure: @@ -43,61 +48,61 @@ s.connect(socket.getaddrinfo('www.micropython.org', 80)[0][-1]) ### Methods -#### socket.close\(\) +#### socket.close() -Mark the socket closed. Once that happens, all future operations on the socket object will fail. The remote end will receive no more data \(after queued data is flushed\). +Mark the socket closed. Once that happens, all future operations on the socket object will fail. The remote end will receive no more data (after queued data is flushed). Sockets are automatically closed when they are garbage-collected, but it is recommended to `close()` them explicitly, or to use a with statement around them. -#### socket.bind\(address\) +#### socket.bind(address) Bind the `socket` to `address`. The socket must not already be bound. The `address` parameter must be a tuple containing the IP address and the port. -{% hint style="info" %} +{{{% hint style="info" %}}} In the case of LoRa sockets, the address parameter is simply an integer with the port number, for instance: `s.bind(1)` -{% endhint %} +{{< /hint >}} -#### socket.listen\(\[backlog\]\) +#### socket.listen(\[backlog\]) -Enable a server to accept connections. If backlog is specified, it must be at least 0 \(if it’s lower, it will be set to 0\); and specifies the number of unaccepted connections that the system will allow before refusing new connections. If not specified, a default reasonable value is chosen. +Enable a server to accept connections. If backlog is specified, it must be at least 0 (if it's lower, it will be set to 0); and specifies the number of unaccepted connections that the system will allow before refusing new connections. If not specified, a default reasonable value is chosen. -#### socket.accept\(\) +#### socket.accept() Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair `(conn, address)` where `conn` is a new socket object usable to send and receive data on the connection, and `address` is the address bound to the socket on the other end of the connection. -#### socket.connect\(address\) +#### socket.connect(address) Connect to a remote socket at `address`. -#### socket.send\(bytes\) +#### socket.send(bytes) Send data to the socket. The socket must be connected to a remote socket. -#### socket.sendall\(bytes\) +#### socket.sendall(bytes) Alias of `socket.send(bytes)`. -#### socket.recv\(bufsize\) +#### socket.recv(bufsize) Receive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by `bufsize`. -#### socket.sendto\(bytes, address\) +#### socket.sendto(bytes, address) Send data to the socket. The socket should not be connected to a remote socket, since the destination socket is specified by address. -#### socket.recvfrom\(bufsize\) +#### socket.recvfrom(bufsize) Receive data from the socket. The return value is a pair `(bytes, address)` where `bytes` is a bytes object representing the data received and `address` is the address of the socket sending the data. -#### socket.setsockopt\(level, optname, value\) +#### socket.setsockopt(level, optname, value) -Set the value of the given socket option. The needed symbolic constants are defined in the socket module \(`SO_*` etc.\). The value can be an integer or a bytes-like object representing a buffer. +Set the value of the given socket option. The needed symbolic constants are defined in the socket module (`SO_*` etc.). The value can be an integer or a bytes-like object representing a buffer. -#### socket.settimeout\(value\) +#### socket.settimeout(value) Set a timeout on blocking socket operations. The value argument can be a nonnegative floating point number expressing seconds, or `None`. If a non-zero value is given, subsequent socket operations will raise a timeout exception if the timeout period value has elapsed before the operation has completed. If zero is given, the socket is put in non-blocking mode. If None is given, the socket is put in blocking mode. -#### socket.setblocking\(flag\) +#### socket.setblocking(flag) Set blocking or non-blocking mode of the socket: if flag is false, the socket is set to non-blocking, else to blocking mode. @@ -108,45 +113,45 @@ sock.setblocking(True) is equivalent to sock.settimeout(None) sock.setblocking(False) is equivalent to sock.settimeout(0.0) ``` -#### socket.makefile\(mode='rb'\) +#### socket.makefile(mode='rb') -Return a file object associated with the socket. The exact returned type depends on the arguments given to makefile\(\). The support is limited to binary modes only \(`rb` and `wb`\). CPython’s arguments: `encoding`, `errors`, and `newline` are not supported. +Return a file object associated with the socket. The exact returned type depends on the arguments given to makefile(). The support is limited to binary modes only (`rb` and `wb`). CPython's arguments: `encoding`, `errors`, and `newline` are not supported. -The socket must be in blocking mode; it can have a timeout, but the file object’s internal buffer may end up in a inconsistent state if a timeout occurs. +The socket must be in blocking mode; it can have a timeout, but the file object's internal buffer may end up in a inconsistent state if a timeout occurs. -{% hint style="info" %} +{{{% hint style="info" %}}} **Difference to CPython** Closing the file object returned by `makefile()` **WILL** close the original socket as well. -{% endhint %} +{{< /hint >}} -#### socket.read\(size\) +#### socket.read(size) Read up to size bytes from the socket. Return a bytes object. If `size` is not given, it behaves just like [`socket.readall()`](usocket.md#socket-readall), see below. -#### socket.readall\(\) +#### socket.readall() Read all data available from the socket until EOF. This function will not return until the socket is closed. -#### socket.readinto\(buf\[, nbytes\]\) +#### socket.readinto(buf\[, nbytes\]) Read bytes into the `buf`. If `nbytes` is specified then read at most that many bytes. Otherwise, read at most `len(buf)` bytes. Return value: number of bytes read and stored into `buf`. -#### socket.readline\(\) +#### socket.readline() Read a line, ending in a newline character. Return value: the line read. -#### socket.write\(buf\) +#### socket.write(buf) Write the buffer of bytes to the socket. Return value: number of bytes written. -#### socket.do_handshake\(\) +#### socket.do_handshake() Perform the SSL handshake on the previously "wrapped" socket with ssl.wrap_socket(). COuld be used when the socket is non-blocking and the SSL handshake is not performed during connect(). diff --git a/firmwareapi/micropython/ussl.md b/content/firmwareapi/micropython/ussl.md similarity index 73% rename from firmwareapi/micropython/ussl.md rename to content/firmwareapi/micropython/ussl.md index 63ed3a6..9f6e7c0 100644 --- a/firmwareapi/micropython/ussl.md +++ b/content/firmwareapi/micropython/ussl.md @@ -1,10 +1,15 @@ -# ussl - -This module provides access to Transport Layer Security \(often known as "Secure Sockets Layer"\) encryption and peer authentication facilities for network sockets, both client-side and server-side. +--- +title: "ussl" +aliases: + - firmwareapi/micropython/ussl.html + - firmwareapi/micropython/ussl.md + - chapter/firmwareapi/micropython/ussl +--- +This module provides access to Transport Layer Security (often known as "Secure Sockets Layer") encryption and peer authentication facilities for network sockets, both client-side and server-side. ## Methods -#### ssl.wrap\_socket\(sock, keyfile=None, certfile=None, server\_side=False, cert\_reqs=CERT\_NONE, ca\_certs=None\) +#### ssl.wrap\_socket(sock, keyfile=None, certfile=None, server\_side=False, cert\_reqs=CERT\_NONE, ca\_certs=None) Takes an instance `sock` of `socket.socket`, and returns an instance of ssl.SSLSocket, a subtype of `socket.socket`, which wraps the underlying socket in an SSL context. Example: diff --git a/firmwareapi/micropython/ustruct.md b/content/firmwareapi/micropython/ustruct.md similarity index 67% rename from firmwareapi/micropython/ustruct.md rename to content/firmwareapi/micropython/ustruct.md index 4f73e4f..8f8b276 100644 --- a/firmwareapi/micropython/ustruct.md +++ b/content/firmwareapi/micropython/ustruct.md @@ -1,30 +1,35 @@ -# ustruct - +--- +title: "ustruct" +aliases: + - firmwareapi/micropython/ustruct.html + - firmwareapi/micropython/ustruct.md + - chapter/firmwareapi/micropython/ustruct +--- See Python [struct](https://docs.python.org/3/library/struct.html) for more information. Supported size/byte order prefixes: `@, <, >, !`. -Supported format codes: `b, B, h, H, i, I, l, L, q, Q, s, P, f, d` \(the latter 2 depending on the floating-point support\). +Supported format codes: `b, B, h, H, i, I, l, L, q, Q, s, P, f, d` (the latter 2 depending on the floating-point support). ## Methods -#### ustruct.calcsize\(fmt\) +#### ustruct.calcsize(fmt) Return the number of bytes needed to store the given `fmt`. -#### ustruct.pack\(fmt, v1, v2, ...\) +#### ustruct.pack(fmt, v1, v2, ...) Pack the values `v1, v2, ...` according to the format string `fmt`. The return value is a bytes object encoding the values. -#### ustruct.pack\_into\(fmt, buffer, offset, v1, v2, ...\) +#### ustruct.pack\_into(fmt, buffer, offset, v1, v2, ...) Pack the values `v1, v2, ...` according to the format string `fmt` into a buffer starting at `offset`. `offset` may be negative to count from the end of buffer. -#### ustruct.unpack\(fmt, data\) +#### ustruct.unpack(fmt, data) Unpack from the `data` according to the format string `fmt`. The return value is a tuple of the unpacked values. -#### ustruct.unpack\_from\(fmt, data, offset=0\) +#### ustruct.unpack\_from(fmt, data, offset=0) Unpack from the `data` starting at `offset` according to the format string `fmt`. `offset` may be negative to count from the end of buffer. The return value is a tuple of the unpacked values. diff --git a/content/firmwareapi/micropython/utime.md b/content/firmwareapi/micropython/utime.md new file mode 100644 index 0000000..831d1b5 --- /dev/null +++ b/content/firmwareapi/micropython/utime.md @@ -0,0 +1,92 @@ +--- +title: "utime" +aliases: + - firmwareapi/micropython/utime.html + - firmwareapi/micropython/utime.md + - chapter/firmwareapi/micropython/utime +--- +The `utime` module provides functions for getting the current time and date, measuring time intervals, and for delays. + +**Time Epoch**: Pycom's ESP32 port uses standard for POSIX systems epoch of `1970-01-01 00:00:00 UTC`. + +## Maintaining actual calendar date/time + +This requires a Real Time Clock (RTC). On systems with underlying OS (including some RTOS), an RTC may be implicit. Setting and maintaining actual calendar time is responsibility of OS/RTOS and is done outside of MicroPython, it just uses OS API to query date/time. On baremetal ports however system time depends on `machine.RTC()` object. The current calendar time may be set using `machine.RTC().datetime(tuple)` function, and maintained by following means: + +* By a backup battery (which may be an additional, optional component for a particular board). +* Using networked time protocol (requires setup by a port/user). +* Set manually by a user on each power-up (many boards then maintain RTC time across hard resets, though some may require setting it again in such case). + +If actual calendar time is not maintained with a system/MicroPython RTC, functions below which require reference to current absolute time may behave not as expected. + +## Methods + +#### utime.gmtime(\[secs\]) + +Convert a time expressed in seconds since the Epoch (see above) into an 8-tuple which contains: `(year, month, mday, hour, minute, second, weekday, yearday)` If `secs` is not provided or `None`, then the current time from the RTC is used. + +* `year` includes the century (for example 2014). +* `month` is 1-12 +* `mday` is 1-31 +* `hour` is 0-23 +* `minute` is 0-59 +* `second` is 0-59 +* `weekday` is 0-6 for Mon-Sun +* `yearday` is 1-366 + +#### utime.localtime(\[secs\]) + +Like `gmtime()` but converts to local time. If `secs` is not provided or `None`, the current time from the RTC is used. + +#### utime.mktime() + +This is inverse function of `localtime`. It's argument is a full 8-tuple which expresses a time as per `localtime`. It returns an integer which is the number of seconds since `Jan 1, 2000`. + +#### utime.sleep(seconds) + +Sleep for the given number of `seconds`. `seconds` can be a floating-point number to sleep for a fractional number of seconds. Note that other MicroPython ports may not accept floating-point argument, for compatibility with them use `sleep_ms()` and `sleep_us()` functions. + +#### utime.sleep\_ms(ms) + +Delay for given number of milliseconds, should be positive or 0. + +#### utime.sleep\_us(us) + +Delay for given number of microseconds, should be positive or 0 + +#### utime.ticks\_ms() + +Returns uptime, in milliseconds. + +#### utime.ticks\_us() + +Just like `ticks_ms` above, but in microseconds. + +#### utime.ticks\_cpu() + +Same as `ticks_us`, but faster. + +#### utime.ticks\_diff(end, start) + +Measure period between consecutive calls to `ticks_ms()`, `ticks_us()`, or `ticks_cpu()`. The value returned by these functions may wrap around at any time, so directly subtracting them is not supported. `ticks_diff()` should be used instead. "start" value should actually precede "end" value in time, or result is undefined. This function should not be used to measure arbitrarily long periods of time (because `ticks_*()` functions wrap around and usually would have short period). The expected usage pattern is implementing event polling with timeout: + +```python +# Wait for GPIO pin to be asserted, but at most 500us +start = time.ticks_us() +while pin.value() == 0: + if time.ticks_diff(time.ticks_us(), start) > 500: + raise TimeoutError +``` + +#### utime.time() + +Returns the number of seconds, as an integer, since the Epoch, assuming that underlying RTC is set. If an RTC is not set, this function returns number of seconds since power up or reset). If you want to develop portable MicroPython application, you should not rely on this function to provide higher than second precision. If you need higher precision, use `ticks_ms()` and `ticks_us()` functions, if you need calendar time, `localtime()` without an argument is a better choice. + +#### utime.timezone(\[secs\]) + +Set or get the timezone offset, in seconds. If `secs` is not provided, it returns the current value. + +{{{% hint style="info" %}}} +In MicroPython, `time.timezone` works the opposite way to Python. In [Python](https://docs.python.org/3/library/time.html#time.timezone), to get the local time, you write `local_time = utc - timezone`, while in MicroPython it is `local_time = utc + timezone`. +{{< /hint >}} + diff --git a/content/firmwareapi/micropython/uzlib.md b/content/firmwareapi/micropython/uzlib.md new file mode 100644 index 0000000..c1556d3 --- /dev/null +++ b/content/firmwareapi/micropython/uzlib.md @@ -0,0 +1,27 @@ +--- +title: "" +aliases: + - firmwareapi/micropython/uzlib.html + - firmwareapi/micropython/uzlib.md + - chapter/firmwareapi/micropython/uzlib +--- +_This module implements a subset of the corresponding_ `CPython` _module, as described below. For more information, refer to the original CPython documentation:_ `zlib`. + +This module allows to decompress binary data compressed with [DEFLATE algorithm](https://en.wikipedia.org/wiki/DEFLATE) (commonly used in zlib library and gzip archiver). Compression is not yet implemented. + +## **Methods** + +**uzlib.decompress(data, wbits=0, bufsize=0)** + +Return decompressed data as bytes. wbits is DEFLATE dictionary window size used during compression (8-15, the dictionary size is power of 2 of that value). Additionally, if value is positive, data is assumed to be zlib stream (with zlib header). Otherwise, if it's negative, it's assumed to be raw DEFLATE stream. bufsize parameter is for compatibility with CPython and is ignored. + +**class uzlib.DecompIO(stream, wbits=0)** + +Create a `stream` wrapper which allows transparent decompression of compressed data in another stream. This allows to process compressed streams with data larger than available heap size. In addition to values described in `decompress()`, wbits may take values 24..31 (16 + 8..15), meaning that input stream has gzip header. + +{{{% hint style="info" %}}} +**Difference to CPython** + +This class is MicroPython extension. It's included on provisional basis and may be changed considerably or removed in later versions. +{{< /hint >}} + diff --git a/firmwareapi/notes.md b/content/firmwareapi/notes.md similarity index 56% rename from firmwareapi/notes.md rename to content/firmwareapi/notes.md index 23470ae..536eda5 100644 --- a/firmwareapi/notes.md +++ b/content/firmwareapi/notes.md @@ -1,16 +1,21 @@ -# Notes - +--- +title: "Notes" +aliases: + - firmwareapi/notes.html + - firmwareapi/notes.md + - chapter/firmwareapi/notes +--- ## Interrupt Handling -In Pycom’s ESP32 MicroPython port there are no restrictions on what can be done within an interrupt handler. For example, other ports do not allow allocating memory inside the handler or the use of sockets. +In Pycom's ESP32 MicroPython port there are no restrictions on what can be done within an interrupt handler. For example, other ports do not allow allocating memory inside the handler or the use of sockets. These limitations were raised by handling the interrupt events differently. When an interrupt happens, a message is posted into a queue, notifying a separate thread that the appropriate callback handler should be called. Such handler would receive an argument. By default it is the object associated with the event. The user can do whatever is required inside of the callback, such as creating new variables, or even sending network packets. Bear in mind that interrupts are processed sequentially and thus it is ideal to keep the handlers as short as possible in order to attend all of them in the minimum time. -Currently, there are 2 classes that support interrupts; the [`Alarm`](pycom/machine/timer.md#class-timer-alarm-handler-none-s-ms-us-arg-none-periodic-false) and [`Pin`](pycom/machine/pin.md) classes. Both classes provide the `.callback()` method that enables the interrupt and registers the given handler. For more details about interrupt usage along with examples, please visit their respective sections. +Currently, there are 2 classes that support interrupts; the [`Alarm`](pycom/machine/timer.md#class-timer-alarm-handler-none-s-ms-us-arg-none-periodic-false) and [`Pin`](pycom/machine/pin) classes. Both classes provide the `.callback()` method that enables the interrupt and registers the given handler. For more details about interrupt usage along with examples, please visit their respective sections. -{% hint style="info" %} +{{{% hint style="info" %}}} Currently the interrupt system can queue up to **16 interrupts**. -{% endhint %} +{{< /hint >}} diff --git a/content/firmwareapi/pycom/README.md b/content/firmwareapi/pycom/README.md new file mode 100644 index 0000000..d72af79 --- /dev/null +++ b/content/firmwareapi/pycom/README.md @@ -0,0 +1,7 @@ +--- +title: "Pycom Modules" +aliases: + - chapter/firmwareapi/pycom +--- +These modules are specific to the Pycom devices and may have slightly different implementations to other variations of MicroPython (i.e. for Non-Pycom devices). Modules include those which support access to underlying hardware, e.g. I2C, SPI, WLAN, Bluetooth, etc. + diff --git a/content/firmwareapi/pycom/_index.md b/content/firmwareapi/pycom/_index.md new file mode 100644 index 0000000..b5837bb --- /dev/null +++ b/content/firmwareapi/pycom/_index.md @@ -0,0 +1,6 @@ +--- +title: "Pycom Modules" +aliases: +--- +These modules are specific to the Pycom devices and may have slightly different implementations to other variations of MicroPython (i.e. for Non-Pycom devices). Modules include those which support access to underlying hardware, e.g. I2C, SPI, WLAN, Bluetooth, etc. + diff --git a/firmwareapi/pycom/aes.md b/content/firmwareapi/pycom/aes.md similarity index 65% rename from firmwareapi/pycom/aes.md rename to content/firmwareapi/pycom/aes.md index 633b023..9932369 100644 --- a/firmwareapi/pycom/aes.md +++ b/content/firmwareapi/pycom/aes.md @@ -1,10 +1,15 @@ -# AES +--- +title: "AES" +aliases: + - firmwareapi/pycom/aes.html + - firmwareapi/pycom/aes.md + - chapter/firmwareapi/pycom/aes +--- +AES (Advanced Encryption Standard) is a symmetric block cipher standardised by NIST. It has a fixed data block size of 16 bytes. Its keys can be 128, 192, or 256 bits long. -AES \(Advanced Encryption Standard\) is a symmetric block cipher standardised by NIST. It has a fixed data block size of 16 bytes. Its keys can be 128, 192, or 256 bits long. - -{% hint style="info" %} +{{{% hint style="info" %}}} AES is implemented using the ESP32 hardware module. -{% endhint %} +{{< /hint >}} ## Quick Usage Example @@ -26,37 +31,37 @@ print(original) ## Constructors -#### class ucrypto.AES\(key, mode, IV, \* , counter, segment\_size\) +#### class ucrypto.AES(key, mode, IV, \* , counter, segment\_size) Create an AES object that will let you encrypt and decrypt messages. The arguments are: -* `key` \(byte string\) is the secret key to use. It must be 16 \(AES-128\), 24 \(AES-192\), or 32 \(AES-256\) bytes long. +* `key` (byte string) is the secret key to use. It must be 16 (AES-128), 24 (AES-192), or 32 (AES-256) bytes long. * `mode` is the chaining mode to use for encryption and decryption. Default is `AES.MODE_ECB`. -* `IV` \(byte string\) initialisation vector. Should be 16 bytes long. It is ignored in modes `AES.MODE_ECB` and `AES.MODE_CRT`. -* `counter` \(byte string\) used only for `AES.MODE_CTR`. Should be 16 bytes long. Should not be reused. +* `IV` (byte string) initialisation vector. Should be 16 bytes long. It is ignored in modes `AES.MODE_ECB` and `AES.MODE_CRT`. +* `counter` (byte string) used only for `AES.MODE_CTR`. Should be 16 bytes long. Should not be reused. * `segment_size` is the number of bits `plaintext` and `ciphertext` are segmented in. Is only used in `AES.MODE_CFB`. Supported values are `AES.SEGMENT_8` and `AES.SEGMENT_128` ## Methods -#### ucrypto.encrypt\(\) +#### ucrypto.encrypt() Encrypt data with the key and the parameters set at initialisation. -#### ucrypto.decrypt\(\) +#### ucrypto.decrypt() Decrypt data with the key and the parameters set at initialisation. ## Constants -* `AES.MODE_ECB`: Electronic Code Book. Simplest encryption mode. It does not hide data patterns well \(see this article for more info\) -* `AES.MODE_CBC`: Cipher-Block Chaining. An Initialisation Vector \(IV\) is required. +* `AES.MODE_ECB`: Electronic Code Book. Simplest encryption mode. It does not hide data patterns well (see this article for more info) +* `AES.MODE_CBC`: Cipher-Block Chaining. An Initialisation Vector (IV) is required. * `AES.MODE_CFB`: Cipher feedback. `plaintext` and `ciphertext` are processed in segments of `segment_size` bits. Works a stream cipher. * `AES.MODE_CTR`: Counter mode. Each message block is associated to a counter which must be unique across all messages that get encrypted with the same key. * `AES.SEGMENT_8`, `AES.SEGMENT_128`: Length of the segment for `AES.MODE_CFB` -{% hint style="danger" %} +{{{% hint style="danger" %}}} To avoid security issues, IV should always be a random number and should never be reused to encrypt two different messages. The same applies to the counter in CTR mode. You can use `crypto.getrandbits()` for this purpose. -{% endhint %} +{{< /hint >}} diff --git a/content/firmwareapi/pycom/machine/README.md b/content/firmwareapi/pycom/machine/README.md new file mode 100644 index 0000000..3e73dbb --- /dev/null +++ b/content/firmwareapi/pycom/machine/README.md @@ -0,0 +1,120 @@ +--- +title: "machine" +aliases: + - chapter/firmwareapi/pycom/machine +--- +The `machine` module contains specific functions related to the board. + +### Quick Usage Example + +```python +import machine + +help(machine) # display all members from the machine module +machine.freq() # get the CPU frequency +machine.unique_id() # return the 6-byte unique id of the board (the LoPy's WiFi MAC address) +``` + +## Reset Functions + +#### machine.reset() + +Resets the device in a manner similar to pushing the external RESET button. + +#### machine.reset\_cause() + +Get the reset cause. See constants for the possible return values. + +## Interrupt Functions + +#### machine.disable\_irq() + +Disable interrupt requests. Returns and integer representing the previous IRQ state. This return value can be passed to `enable_irq` to restore the IRQ to its original state. + +#### machine.enable\_irq(\[state\]) + +Enable interrupt requests. The most common use of this function is to pass the value returned by `disable_irq` to exit a critical section. Another options is to enable all interrupts which can be achieved by calling the function with no parameters. + +## Power Functions + +#### machine.freq() + +Returns CPU frequency in hertz. + +#### machine.idle() + +Gates the clock to the CPU, useful to reduce power consumption at any time during short or long periods. Peripherals continue working and execution resumes as soon as any interrupt is triggered (on many ports this includes system timer interrupt occurring at regular intervals on the order of millisecond). + +#### machine.sleep(\[time\_ms\], resume\_wifi\_ble) + +Sets the device in to light sleep mode , where in this mode digital peripherals, most of the RAM, and CPUs are clock-gated, and supply voltage is reduced. Upon exit from light sleep, peripherals and CPUs resume operation, their internal state is preserved. + +* `time_ms` is the time in milliseconds that the device should wakeup after, if no time is given the device will sleep until the next reset cycle unless another wakeup source is configured. +* `resume_wifi_ble` is a boolean value that enables or disable restoring after wakeup any WiFi or BLE connection that was interrupted by light sleep. +* `True` Enable WiFi/BLE connections restoration +* `False` Disable Wifi/BLE connections restoration, default option is Disabled + +_Note: in light sleep mode LoRa/Lte modems are stopped and have to be re-initialized after wakeup._ + +#### machine.deepsleep(\[time\_ms\]) + +Stops the CPU and all peripherals, including the networking interfaces (except for LTE). Execution is resumed from the main script, just as with a reset. If a value in milliseconds is given then the device will wake up after that period of time, otherwise it will remain in deep sleep until the reset button is pressed. + +The products with LTE connectivity (FiPy, GPy, G01), require the LTE radio to be disabled separately via the LTE class before entering deepsleep. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network (data or SMS received for instance). + +#### machine.pin\_sleep\_wakeup(pins, mode, enable\_pull) + +Configure pins to wake up from deep/light sleep mode. The pins which have this capability are: `P2, P3, P4, P6, P8 to P10 and P13 to P23`. + +The arguments are: + +* `pins` a list or tuple containing the `GPIO` to setup for deepsleep wakeup. +* `mode` selects the way the configure `GPIO`s can wake up the module. The possible values are: `machine.WAKEUP_ALL_LOW` and `machine.WAKEUP_ANY_HIGH`. +* `enable_pull` if set to `True` keeps the pull up or pull down resistors enabled during deep sleep. If this variable is set to `True`, then `ULP` or capacitive touch wakeup cannot be used in combination with `GPIO` wakeup. + +#### machine.wake\_reason() + +Get the wake reason. See constants for the possible return values. Returns a tuple of the form: `(wake_reason, gpio_list)`. When the wakeup reason is either GPIO or touch pad, then the second element of the tuple is a list with GPIOs that generated the wakeup. + +#### machine.remaining\_sleep\_time() + +Returns the remaining timer duration (in milliseconds) if the ESP32 is woken up from deep sleep by something other than the timer. For example, if you set the timer for 30 seconds (30000 ms) and it wakes up after 10 seconds then this function will return `20000`. + +## Miscellaneous Functions + +#### machine.main(filename) + +Set the `filename` of the main script to run after `boot.py` is finished. If this function is not called then the default file `main.py` will be executed. + +It only makes sense to call this function from within `boot.py`. + +#### machine.rng() + +Return a 24-bit software generated random number. + +#### machine.unique\_id() + +Returns a byte string with a unique identifier of a board/SoC. It will vary from a board/SoC instance to another, if underlying hardware allows. Length varies by hardware (so use substring of a full value if you expect a short ID). In some MicroPython ports, ID corresponds to the network MAC address. + +{{{% hint style="info" %}}} +Use `ubinascii.hexlify()` to convert the byte string to hexadecimal form for ease of manipulation and use elsewhere. +{{< /hint >}} + +#### machine.info() + +Returns the high water mark of the stack associated with various system tasks, in words (1 word = 4 bytes on the ESP32). If the value is zero then the task has likely overflowed its stack. If the value is close to zero then the task has come close to overflowing its stack. + +## Constants + +### Reset Causes + +`machine.PWRON_RESET`, `machine.HARD_RESET`, `machine.WDT_RESET,` `machine.DEEPSLEEP_RESET`, `machine.SOFT_RESET`, `machine.BROWN_OUT_RESET` + +### Wake Reasons + +`machine.PWRON_WAKE`, `machine.PIN_WAKE`, `machine.RTC_WAKE`, `machine.ULP_WAKE` + +### Pin Wakeup Modes + +`machine.WAKEUP_ALL_LOW`, `machine.WAKEUP_ANY_HIGH` + diff --git a/firmwareapi/pycom/machine/README.md b/content/firmwareapi/pycom/machine/_index.md similarity index 67% rename from firmwareapi/pycom/machine/README.md rename to content/firmwareapi/pycom/machine/_index.md index 195abff..12cafe7 100644 --- a/firmwareapi/pycom/machine/README.md +++ b/content/firmwareapi/pycom/machine/_index.md @@ -1,5 +1,7 @@ -# machine - +--- +title: "machine" +aliases: +--- The `machine` module contains specific functions related to the board. ### Quick Usage Example @@ -14,35 +16,35 @@ machine.unique_id() # return the 6-byte unique id of the board (the LoPy's WiFi ## Reset Functions -#### machine.reset\(\) +#### machine.reset() Resets the device in a manner similar to pushing the external RESET button. -#### machine.reset\_cause\(\) +#### machine.reset\_cause() Get the reset cause. See constants for the possible return values. ## Interrupt Functions -#### machine.disable\_irq\(\) +#### machine.disable\_irq() Disable interrupt requests. Returns and integer representing the previous IRQ state. This return value can be passed to `enable_irq` to restore the IRQ to its original state. -#### machine.enable\_irq\(\[state\]\) +#### machine.enable\_irq(\[state\]) Enable interrupt requests. The most common use of this function is to pass the value returned by `disable_irq` to exit a critical section. Another options is to enable all interrupts which can be achieved by calling the function with no parameters. ## Power Functions -#### machine.freq\(\) +#### machine.freq() Returns CPU frequency in hertz. -#### machine.idle\(\) +#### machine.idle() -Gates the clock to the CPU, useful to reduce power consumption at any time during short or long periods. Peripherals continue working and execution resumes as soon as any interrupt is triggered \(on many ports this includes system timer interrupt occurring at regular intervals on the order of millisecond\). +Gates the clock to the CPU, useful to reduce power consumption at any time during short or long periods. Peripherals continue working and execution resumes as soon as any interrupt is triggered (on many ports this includes system timer interrupt occurring at regular intervals on the order of millisecond). -#### machine.sleep\(\[time\_ms\], resume\_wifi\_ble\) +#### machine.sleep(\[time\_ms\], resume\_wifi\_ble) Sets the device in to light sleep mode , where in this mode digital peripherals, most of the RAM, and CPUs are clock-gated, and supply voltage is reduced. Upon exit from light sleep, peripherals and CPUs resume operation, their internal state is preserved. @@ -53,13 +55,13 @@ Sets the device in to light sleep mode , where in this mode digital peripherals, _Note: in light sleep mode LoRa/Lte modems are stopped and have to be re-initialized after wakeup._ -#### machine.deepsleep\(\[time\_ms\]\) +#### machine.deepsleep(\[time\_ms\]) -Stops the CPU and all peripherals, including the networking interfaces \(except for LTE\). Execution is resumed from the main script, just as with a reset. If a value in milliseconds is given then the device will wake up after that period of time, otherwise it will remain in deep sleep until the reset button is pressed. +Stops the CPU and all peripherals, including the networking interfaces (except for LTE). Execution is resumed from the main script, just as with a reset. If a value in milliseconds is given then the device will wake up after that period of time, otherwise it will remain in deep sleep until the reset button is pressed. -The products with LTE connectivity \(FiPy, GPy, G01\), require the LTE radio to be disabled separately via the LTE class before entering deepsleep. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network \(data or SMS received for instance\). +The products with LTE connectivity (FiPy, GPy, G01), require the LTE radio to be disabled separately via the LTE class before entering deepsleep. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network (data or SMS received for instance). -#### machine.pin\_sleep\_wakeup\(pins, mode, enable\_pull\) +#### machine.pin\_sleep\_wakeup(pins, mode, enable\_pull) Configure pins to wake up from deep/light sleep mode. The pins which have this capability are: `P2, P3, P4, P6, P8 to P10 and P13 to P23`. @@ -69,37 +71,37 @@ The arguments are: * `mode` selects the way the configure `GPIO`s can wake up the module. The possible values are: `machine.WAKEUP_ALL_LOW` and `machine.WAKEUP_ANY_HIGH`. * `enable_pull` if set to `True` keeps the pull up or pull down resistors enabled during deep sleep. If this variable is set to `True`, then `ULP` or capacitive touch wakeup cannot be used in combination with `GPIO` wakeup. -#### machine.wake\_reason\(\) +#### machine.wake\_reason() Get the wake reason. See constants for the possible return values. Returns a tuple of the form: `(wake_reason, gpio_list)`. When the wakeup reason is either GPIO or touch pad, then the second element of the tuple is a list with GPIOs that generated the wakeup. -#### machine.remaining\_sleep\_time\(\) +#### machine.remaining\_sleep\_time() -Returns the remaining timer duration \(in milliseconds\) if the ESP32 is woken up from deep sleep by something other than the timer. For example, if you set the timer for 30 seconds \(30000 ms\) and it wakes up after 10 seconds then this function will return `20000`. +Returns the remaining timer duration (in milliseconds) if the ESP32 is woken up from deep sleep by something other than the timer. For example, if you set the timer for 30 seconds (30000 ms) and it wakes up after 10 seconds then this function will return `20000`. ## Miscellaneous Functions -#### machine.main\(filename\) +#### machine.main(filename) Set the `filename` of the main script to run after `boot.py` is finished. If this function is not called then the default file `main.py` will be executed. It only makes sense to call this function from within `boot.py`. -#### machine.rng\(\) +#### machine.rng() Return a 24-bit software generated random number. -#### machine.unique\_id\(\) +#### machine.unique\_id() -Returns a byte string with a unique identifier of a board/SoC. It will vary from a board/SoC instance to another, if underlying hardware allows. Length varies by hardware \(so use substring of a full value if you expect a short ID\). In some MicroPython ports, ID corresponds to the network MAC address. +Returns a byte string with a unique identifier of a board/SoC. It will vary from a board/SoC instance to another, if underlying hardware allows. Length varies by hardware (so use substring of a full value if you expect a short ID). In some MicroPython ports, ID corresponds to the network MAC address. -{% hint style="info" %} +{{{% hint style="info" %}}} Use `ubinascii.hexlify()` to convert the byte string to hexadecimal form for ease of manipulation and use elsewhere. -{% endhint %} +{{< /hint >}} -#### machine.info\(\) +#### machine.info() -Returns the high water mark of the stack associated with various system tasks, in words \(1 word = 4 bytes on the ESP32\). If the value is zero then the task has likely overflowed its stack. If the value is close to zero then the task has come close to overflowing its stack. +Returns the high water mark of the stack associated with various system tasks, in words (1 word = 4 bytes on the ESP32). If the value is zero then the task has likely overflowed its stack. If the value is close to zero then the task has come close to overflowing its stack. ## Constants diff --git a/firmwareapi/pycom/machine/adc.md b/content/firmwareapi/pycom/machine/adc.md similarity index 67% rename from firmwareapi/pycom/machine/adc.md rename to content/firmwareapi/pycom/machine/adc.md index d2a116d..b3d5c29 100644 --- a/firmwareapi/pycom/machine/adc.md +++ b/content/firmwareapi/pycom/machine/adc.md @@ -1,5 +1,10 @@ --- -search: +title: "ADC" +aliases: + - firmwareapi/pycom/machine/adc.html + - firmwareapi/pycom/machine/adc.md + - chapter/firmwareapi/pycom/machine/adc +--- keywords: - ADC - Analog @@ -22,23 +27,23 @@ val = apin() # read an analog value ### Constructors -#### class machine.ADC\(id=0\) +#### class machine.ADC(id=0) Create an ADC object; associate a channel with a pin. For more info check the hardware section. ### Methods -#### adc.init\( \* , bits=12\) +#### adc.init( \* , bits=12) Enable the ADC block. This method is automatically called on object creation. * `Bits` can take values between 9 and 12 and selects the number of bits of resolution of the ADC block. -#### adc.deinit\(\) +#### adc.deinit() Disable the ADC block. -#### adc.channel\(\* , pin, attn=ADC.ATTN\_0DB\) +#### adc.channel(\* , pin, attn=ADC.ATTN\_0DB) Create an analog pin. @@ -52,11 +57,11 @@ Returns an instance of `ADCChannel`. Example: apin = adc.channel(pin='P16') ``` -#### adc.vref\(vref\) +#### adc.vref(vref) -If called without any arguments, this function returns the current calibrated voltage \(in millivolts\) of the `1.1v` reference. Otherwise it will update the calibrated value \(in millivolts\) of the internal `1.1v` reference. +If called without any arguments, this function returns the current calibrated voltage (in millivolts) of the `1.1v` reference. Otherwise it will update the calibrated value (in millivolts) of the internal `1.1v` reference. -#### adc.vref\_to\_pin\(pin\) +#### adc.vref\_to\_pin(pin) Connects the internal `1.1v` to external `GPIO`. It can only be connected to `P22`, `P21` or `P6`. It is recommended to only use `P6` on the WiPy, on other modules this pin is connected to the radio. @@ -70,31 +75,31 @@ Read analog values from internal/external sources. ADC channels can be connected ### Methods -#### adcchannel\(\) +#### adcchannel() Fast method to read the channel value. -#### adcchannel.value\(\) +#### adcchannel.value() Read the channel value. -#### adcchannel.init\(\) +#### adcchannel.init() -\(Re\)init and enable the ADC channel. This method is automatically called on object creation. +(Re)init and enable the ADC channel. This method is automatically called on object creation. -#### adcchannel.deinit\(\) +#### adcchannel.deinit() Disable the ADC channel. -#### adcchannel.voltage\(\) +#### adcchannel.voltage() -Reads the channels value and converts it into a voltage \(in millivolts\) +Reads the channels value and converts it into a voltage (in millivolts) -#### adcchannel.value\_to\_voltage\(value\) +#### adcchannel.value\_to\_voltage(value) -Converts the provided value into a voltage \(in millivolts\) in the same way voltage does. +Converts the provided value into a voltage (in millivolts) in the same way voltage does. -{% hint style="danger" %} +{{{% hint style="danger" %}}} ADC pin input range is `0-1.1V`. This maximum value can be increased up to `3.3V` using the highest attenuation of `11dB`. **Do not exceed the maximum of 3.3V**, to avoid damaging the device. -{% endhint %} +{{< /hint >}} diff --git a/firmwareapi/pycom/machine/can.md b/content/firmwareapi/pycom/machine/can.md similarity index 78% rename from firmwareapi/pycom/machine/can.md rename to content/firmwareapi/pycom/machine/can.md index 80f4882..81170a8 100644 --- a/firmwareapi/pycom/machine/can.md +++ b/content/firmwareapi/pycom/machine/can.md @@ -1,5 +1,10 @@ -# CAN - +--- +title: "CAN" +aliases: + - firmwareapi/pycom/machine/can.html + - firmwareapi/pycom/machine/can.md + - chapter/firmwareapi/pycom/machine/can +--- The CAN class supports the full CAN 2.0 specification with standard and extended frames, as well as acceptance filtering. The ESP32 has a built-in CAN controller, but the transceiver needs to be added externally. A recommended device is the SN65HVD230. @@ -16,7 +21,7 @@ can.recv() ## Constructors -#### class machine.CAN\(bus=0, ...\) +#### class machine.CAN(bus=0, ...) Create an CAN object. See init for parameters of initialisation.: @@ -27,28 +32,28 @@ can = CAN(0, mode=CAN.NORMAL, baudrate=500000, pins=('P22', 'P23')) # pin ord ## Methods -#### can.init\(mode=CAN.NORMAL, baudrate=500000, \*, frame\_format=CAN.FORMAT\_STD, rx\_queue\_len=128, pins=\('P22', 'P23'\)\) +#### can.init(mode=CAN.NORMAL, baudrate=500000, \*, frame\_format=CAN.FORMAT\_STD, rx\_queue\_len=128, pins=('P22', 'P23')) Initialize the CAN controller. The arguments are: * `mode` can take either CAN.NORMAL or CAN.SILENT. Silent mode is useful for sniffing the bus. * `baudrate` sets up the bus speed. Acceptable values are between 1 and 1000000. * `frame_format` defines the frame format to be accepted by the receiver. Useful for filtering frames based on the identifier length. Can tale either `CAN.FORMAT_STD`, `CAN.FORMAT_EXT`, `CAN.FORMAT_BOTH`. If `CAN.FORMAT_STD` is selected, extended frames won't be received and vice-versa. -* `rx_queue_len` defines the number of messages than can be queued by the receiver. Due to CAN being a high traffic bus, large values are recommended \(>= 128\), otherwise messages will be dropped specially when no filtering is applied. -* `pins` selects the `Tx` and `Rx` pins \(in that order\). +* `rx_queue_len` defines the number of messages than can be queued by the receiver. Due to CAN being a high traffic bus, large values are recommended (>= 128), otherwise messages will be dropped specially when no filtering is applied. +* `pins` selects the `Tx` and `Rx` pins (in that order). -#### can.deinit\(\) +#### can.deinit() Disables the CAN bus. -#### can.send\(id, \* , data=None, rtr=False, extended=False\) +#### can.send(id, \* , data=None, rtr=False, extended=False) Send a CAN frame on the bus * `id` is the identifier of the message. -* `data` can take up to 8 bytes. It must be left empty is the message to be sent is a remote request \(rtr=True\). +* `data` can take up to 8 bytes. It must be left empty is the message to be sent is a remote request (rtr=True). * `rtr` set it to false to send a remote request. -* `extnted` specifies if the message identifier width should be 11bit \(standard\) or 29bit \(extended\). +* `extnted` specifies if the message identifier width should be 11bit (standard) or 29bit (extended). Can be used like: @@ -60,9 +65,9 @@ can.send(id=0x010, data=bytes([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08])) can.send(id=0x012, rtr=True) # sends a remote request for message id=0x12 ``` -#### can.recv\(timeout=0\) +#### can.recv(timeout=0) -Get a message from the receive queue, and optionally specify a timeout value in **s** \(can be a floating point value e.g. `0.2`\). This function returns `None` if no messages available. If a message is present, it will be returned as a named tuple with the following form: +Get a message from the receive queue, and optionally specify a timeout value in **s** (can be a floating point value e.g. `0.2`). This function returns `None` if no messages available. If a message is present, it will be returned as a named tuple with the following form: `(id, data, rtr, extended)` @@ -71,7 +76,7 @@ Get a message from the receive queue, and optionally specify a timeout value in (id=0x012, data=b'123', rtr=False, extended=False) ``` -#### can.soft\_filter\(mode, filter\_list\) +#### can.soft\_filter(mode, filter\_list) Specify a software filter accepting only the messages that pass the filter test. @@ -95,7 +100,7 @@ can.soft_filter(CAN.FILTER_MASK, [(0x100, 0x7FF), (0x200, 0x7FC)]) # more of the can.soft_filter(None) # disable soft filters, all messages are accepted ``` -#### can.callback\(trigger, handler=None, arg=None\) +#### can.callback(trigger, handler=None, arg=None) Set a callback to be triggered when any of this 3 events are present: @@ -122,9 +127,9 @@ def can_cb(can_o): can.callback(handler=can_cb, trigger=CAN.RX_FRAME) ``` -#### can.events\(\) +#### can.events() -This method returns a value with bits sets \(if any\) indicating the events that have occurred in the bus. Please note that by calling this function the internal events registry is cleared automatically, therefore calling it immediately for a second time will most likely return a value of 0. +This method returns a value with bits sets (if any) indicating the events that have occurred in the bus. Please note that by calling this function the internal events registry is cleared automatically, therefore calling it immediately for a second time will most likely return a value of 0. ## Constants diff --git a/firmwareapi/pycom/machine/dac.md b/content/firmwareapi/pycom/machine/dac.md similarity index 63% rename from firmwareapi/pycom/machine/dac.md rename to content/firmwareapi/pycom/machine/dac.md index 983869b..c23ae54 100644 --- a/firmwareapi/pycom/machine/dac.md +++ b/content/firmwareapi/pycom/machine/dac.md @@ -1,6 +1,11 @@ -# DAC - -The DAC is used to output analog values \(a specific voltage\) on pin `P22` or pin `P21`. The voltage will be between `0` and `3.3V`. +--- +title: "DAC" +aliases: + - firmwareapi/pycom/machine/dac.html + - firmwareapi/pycom/machine/dac.md + - chapter/firmwareapi/pycom/machine/dac +--- +The DAC is used to output analog values (a specific voltage) on pin `P22` or pin `P21`. The voltage will be between `0` and `3.3V`. ## Quick Usage Example @@ -16,31 +21,31 @@ dac_tone.tone(1000, 0) # set tone output to 1kHz ## Constructors -#### class class machine.DAC\(pin\) +#### class class machine.DAC(pin) Create a DAC object, that will let you associate a channel with a `pin`. `pin` can be a string argument. ## Methods -#### dac.init\(\) +#### dac.init() Enable the DAC block. This method is automatically called on object creation. -#### dac.deinit\(\) +#### dac.deinit() Disable the DAC block. -#### dac.write\(value\) +#### dac.write(value) Set the DC level for a DAC pin. `value` is a float argument, with values between 0 and 1. -#### dac.tone\(frequency, amplitude\) +#### dac.tone(frequency, amplitude) Sets up tone signal to the specified `frequency` at `amplitude` scale. `frequency` can be from `125Hz` to `20kHz` in steps of `122Hz`. `amplitude` is an integer specifying the tone amplitude to write the DAC pin. Amplitude value represents: -* `0` is 0dBV \(~ 3Vpp at 600 Ohm load\) -* `1` is -6dBV \(~1.5 Vpp\), `2` is -12dBV \(~0.8 Vpp\) -* `3` is -18dBV \(~0.4 Vpp\). +* `0` is 0dBV (~ 3Vpp at 600 Ohm load) +* `1` is -6dBV (~1.5 Vpp), `2` is -12dBV (~0.8 Vpp) +* `3` is -18dBV (~0.4 Vpp). The generated signal is a sine wave with an DC offset of VDD/2. diff --git a/firmwareapi/pycom/machine/i2c.md b/content/firmwareapi/pycom/machine/i2c.md similarity index 76% rename from firmwareapi/pycom/machine/i2c.md rename to content/firmwareapi/pycom/machine/i2c.md index e180b55..a8c1355 100644 --- a/firmwareapi/pycom/machine/i2c.md +++ b/content/firmwareapi/pycom/machine/i2c.md @@ -1,5 +1,10 @@ -# I2C - +--- +title: "I2C" +aliases: + - firmwareapi/pycom/machine/i2c.html + - firmwareapi/pycom/machine/i2c.md + - chapter/firmwareapi/pycom/machine/i2c +--- I2C is a two-wire protocol for communicating between devices. At the physical level it consists of 2 wires: SCL and SDA, the clock and data lines respectively. I2C objects are created attached to a specific bus. They can be initialised when created, or initialised later on. @@ -28,7 +33,7 @@ i2c.deinit() # turn off the peripheral Printing the `i2c` object gives you information about its configuration. -A master must specify the recipient’s address: +A master must specify the recipient's address: ```python i2c.init(I2C.MASTER) @@ -62,61 +67,61 @@ i2c.writeto_mem(0x42, 0x10, 'xy') # write 2 bytes to slave 0x42, slave memory 0x ## Constructors -#### class machine.I2C\(bus, ...\) +#### class machine.I2C(bus, ...) -Construct an I2C object on the given `bus`. `bus` can only be `0, 1, 2`. If the `bus` is not given, the default one will be selected \(`0`\). Buses `0` and `1` use the ESP32 I2C hardware peripheral while bus `2` is implemented with a bit-banged software driver. +Construct an I2C object on the given `bus`. `bus` can only be `0, 1, 2`. If the `bus` is not given, the default one will be selected (`0`). Buses `0` and `1` use the ESP32 I2C hardware peripheral while bus `2` is implemented with a bit-banged software driver. ## Methods ### General Methods -#### i2c.init\(mode, \* , baudrate=100000, pins=\(SDA, SCL\)\) +#### i2c.init(mode, \* , baudrate=100000, pins=(SDA, SCL)) Initialise the I2C bus with the given parameters: * `mode` must be I2C.MASTER * `baudrate` is the SCL clock rate -* pins is an optional tuple with the pins to assign to the I2C bus. The default I2C pins are `P9` \(SDA\) and `P10` \(SCL\) +* pins is an optional tuple with the pins to assign to the I2C bus. The default I2C pins are `P9` (SDA) and `P10` (SCL) -#### i2c.scan\(\) +#### i2c.scan() -Scan all I2C addresses between `0x08` and `0x77` inclusive and return a list of those that respond. A device responds if it pulls the SDA line low after its address \(including a read bit\) is sent on the bus. +Scan all I2C addresses between `0x08` and `0x77` inclusive and return a list of those that respond. A device responds if it pulls the SDA line low after its address (including a read bit) is sent on the bus. ### Standard Bus Operations The following methods implement the standard I2C master read and write operations that target a given slave device. -#### i2c.readfrom\(addr, nbytes\) +#### i2c.readfrom(addr, nbytes) Read `nbytes` from the slave specified by `addr`. Returns a bytes object with the data read. -#### i2c.readfrom\_into\(addr, buf\) +#### i2c.readfrom\_into(addr, buf) Read into `buf` from the slave specified by `addr`. The number of bytes read will be the length of `buf`. Return value is the number of bytes read. -#### i2c.writeto\(addr, buf, \* , stop=True\) +#### i2c.writeto(addr, buf, \* , stop=True) -Write the bytes from `buf` to the slave specified by `addr`. The argument `buf` can also be an integer which will be treated as a single byte. If `stop` is set to `False` then the stop condition won’t be sent and the I2C operation may be continued \(typically with a read transaction\). +Write the bytes from `buf` to the slave specified by `addr`. The argument `buf` can also be an integer which will be treated as a single byte. If `stop` is set to `False` then the stop condition won't be sent and the I2C operation may be continued (typically with a read transaction). Return value is the number of bytes written. ### Memory Operations -Some I2C devices act as a memory device \(or set of registers\) that can be read from and written to. In this case there are two addresses associated with an I2C transaction: the slave address and the memory address. The following methods are convenience functions to communicate with such devices. +Some I2C devices act as a memory device (or set of registers) that can be read from and written to. In this case there are two addresses associated with an I2C transaction: the slave address and the memory address. The following methods are convenience functions to communicate with such devices. -#### i2c.readfrom\_mem\(addr, memaddr, nbytes, \*, addrsize=8\) +#### i2c.readfrom\_mem(addr, memaddr, nbytes, \*, addrsize=8) Read `nbytes` from the slave specified by `addr` starting from the memory address specified by `memaddr`. The `addrsize` argument is specified in bits and it can only take 8 or 16. -#### i2c.readfrom\_mem\_into\(addr, memaddr, buf, \*, addrsize=8\) +#### i2c.readfrom\_mem\_into(addr, memaddr, buf, \*, addrsize=8) Read into `buf` from the slave specified by `addr` starting from the memory address specified by `memaddr`. The number of bytes read is the length of `buf`. The `addrsize` argument is specified in bits and it can only take 8 or 16. The return value is the number of bytes read. -#### i2c.writeto\_mem\(addr, memaddr, buf \*, addrsize=8\) +#### i2c.writeto\_mem(addr, memaddr, buf \*, addrsize=8) Write `buf` to the slave specified by `addr` starting from the memory address specified by `memaddr`. The argument `buf` can also be an integer which will be treated as a single byte. The `addrsize` argument is specified in bits and it can only take 8 or 16. diff --git a/firmwareapi/pycom/machine/pin.md b/content/firmwareapi/pycom/machine/pin.md similarity index 71% rename from firmwareapi/pycom/machine/pin.md rename to content/firmwareapi/pycom/machine/pin.md index 04bec46..04ba30f 100644 --- a/firmwareapi/pycom/machine/pin.md +++ b/content/firmwareapi/pycom/machine/pin.md @@ -1,6 +1,11 @@ -# Pin - -A pin is the basic object to control I/O pins \(also known as GPIO - general-purpose input/output\). It has methods to set the mode of the pin \(input, output, etc\) and methods to get and set the digital logic level. For analog control of a pin, see the ADC class. +--- +title: "Pin" +aliases: + - firmwareapi/pycom/machine/pin.html + - firmwareapi/pycom/machine/pin.md + - chapter/firmwareapi/pycom/machine/pin +--- +A pin is the basic object to control I/O pins (also known as GPIO - general-purpose input/output). It has methods to set the mode of the pin (input, output, etc) and methods to get and set the digital logic level. For analog control of a pin, see the ADC class. ## Quick Usage Example @@ -21,9 +26,9 @@ p_in() # get value, 0 or 1 ## Constructors -#### class machine.Pin\(id, ...\) +#### class machine.Pin(id, ...) -Create a new Pin object associated with the string `id`. If additional arguments are given, they are used to initialise the pin. [See pin.init\(\)](pin.md#pin-init-mode-pull-alt) +Create a new Pin object associated with the string `id`. If additional arguments are given, they are used to initialise the pin. [See pin.init()](pin.md#pin-init-mode-pull-alt) ```python from machine import Pin @@ -32,7 +37,7 @@ p = Pin('P10', mode=Pin.OUT, pull=None, alt=-1) ## Methods -#### pin.init\(mode, pull, \* , alt\) +#### pin.init(mode, pull, \* , alt) Initialise the pin: @@ -48,20 +53,20 @@ Initialise the pin: Returns: `None`. -#### pin.id\(\) +#### pin.id() Get the pin id. -#### pin.value\(\[value\]\) +#### pin.value(\[value\]) Get or set the digital logic level of the pin: * With no argument, return 0 or 1 depending on the logic level of the pin. * With value given, set the logic level of the pin. value can be anything that converts to a boolean. If it converts to True, the pin is set high, otherwise it is set low. -#### pin\(\[value\]\) +#### pin(\[value\]) -Pin objects are callable. The call method provides a \(fast\) shortcut to set and get the value of the pin. +Pin objects are callable. The call method provides a (fast) shortcut to set and get the value of the pin. Example: @@ -73,25 +78,25 @@ pin() # fast method to get the value See `pin.value()` for more details. -#### pin.toggle\(\) +#### pin.toggle() Toggle the value of the pin. -#### pin.mode\(\[mode\]\) +#### pin.mode(\[mode\]) Get or set the pin mode. -#### pin.pull\(\[pull\]\) +#### pin.pull(\[pull\]) Get or set the pin pull. -#### pin.hold\(\[hold\]\) +#### pin.hold(\[hold\]) -Get or set the pin hold. You can apply a hold to a pin by passing `True` \(or clear it by passing `False`\). When a pin is held, its value cannot be changed by using `Pin.value()` or `Pin.toggle()` until the hold is released. This Can be used to retain the pin state through a core reset and system reset triggered by watchdog time-out or Deep-sleep events. Only pins in the RTC power domain can retain their value through deep sleep or reset. +Get or set the pin hold. You can apply a hold to a pin by passing `True` (or clear it by passing `False`). When a pin is held, its value cannot be changed by using `Pin.value()` or `Pin.toggle()` until the hold is released. This Can be used to retain the pin state through a core reset and system reset triggered by watchdog time-out or Deep-sleep events. Only pins in the RTC power domain can retain their value through deep sleep or reset. These are: `P2, P3, P4, P6, P8, P9, P10, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22, P23` -#### pin.callback\(trigger, handler=None, arg=None\) +#### pin.callback(trigger, handler=None, arg=None) Set a callback to be triggered when the input level at the pin changes. @@ -118,9 +123,9 @@ p_in = Pin('P10', mode=Pin.IN, pull=Pin.PULL_UP) p_in.callback(Pin.IRQ_FALLING | Pin.IRQ_RISING, pin_handler) ``` -{% hint style="info" %} -For more information on how Pycom’s products handle interrupts, see [here](../../notes.md#interrupt-handling). -{% endhint %} +{{{% hint style="info" %}}} +For more information on how Pycom's products handle interrupts, see [here](/../notes.md#interrupt-handling). +{{< /hint >}} ## Attributes diff --git a/firmwareapi/pycom/machine/pwm.md b/content/firmwareapi/pycom/machine/pwm.md similarity index 70% rename from firmwareapi/pycom/machine/pwm.md rename to content/firmwareapi/pycom/machine/pwm.md index 24a8d30..5b60220 100644 --- a/firmwareapi/pycom/machine/pwm.md +++ b/content/firmwareapi/pycom/machine/pwm.md @@ -1,5 +1,10 @@ -# PWM - +--- +title: "PWM" +aliases: + - firmwareapi/pycom/machine/pwm.html + - firmwareapi/pycom/machine/pwm.md + - chapter/firmwareapi/pycom/machine/pwm +--- ## class PWM – Pulse Width Modulation ### Quick Usage Example @@ -14,13 +19,13 @@ pwm_c.duty_cycle(0.3) # change the duty cycle to 30% ### Constructors -#### class machine.PWM\(timer, frequency\) +#### class machine.PWM(timer, frequency) -Create a PWM object. This sets up the `timer` to oscillate at the specified `frequency`. `timer` is an integer from 0 to 3. `frequency` is an integer from 1 Hz to 78 KHz \(this values can change in future upgrades\). +Create a PWM object. This sets up the `timer` to oscillate at the specified `frequency`. `timer` is an integer from 0 to 3. `frequency` is an integer from 1 Hz to 78 KHz (this values can change in future upgrades). ### Methods -#### pwm.channel\(id, pin \* , duty\_cycle=0.5\) +#### pwm.channel(id, pin \* , duty\_cycle=0.5) Connect a PWM channel to a pin, setting the initial duty cycle. `id` is an integer from 0 to 7. `pin` is a string argument. `duty_cycle` is a keyword-only float argument, with values between 0 and 1. Returns an instance of `PWMChannel`. @@ -28,7 +33,7 @@ Connect a PWM channel to a pin, setting the initial duty cycle. `id` is an integ ### Methods -#### pwmchannel.duty\_cycle\(value\) +#### pwmchannel.duty\_cycle(value) Set the duty cycle for a PWM channel. `value` is a float argument, with values between 0 and 1. diff --git a/firmwareapi/pycom/machine/rmt.md b/content/firmwareapi/pycom/machine/rmt.md similarity index 81% rename from firmwareapi/pycom/machine/rmt.md rename to content/firmwareapi/pycom/machine/rmt.md index c226676..73a897e 100644 --- a/firmwareapi/pycom/machine/rmt.md +++ b/content/firmwareapi/pycom/machine/rmt.md @@ -1,5 +1,10 @@ --- -search: +title: "RMT" +aliases: + - firmwareapi/pycom/machine/rmt.html + - firmwareapi/pycom/machine/rmt.md + - chapter/firmwareapi/pycom/machine/rmt +--- keywords: - RMT - Remote @@ -9,7 +14,7 @@ search: # RMT -The RMT \(Remote Control\) module is primarily designed to send and receive infrared remote control signals that use on-off-keying of a carrier frequency, but due to its design it can be used to generate various types of signals. +The RMT (Remote Control) module is primarily designed to send and receive infrared remote control signals that use on-off-keying of a carrier frequency, but due to its design it can be used to generate various types of signals. ## Quick Usage Example: sending @@ -40,7 +45,7 @@ data = rmt.recv_pulses() ## Constructors -#### class machine.RMT\(channel,...\) +#### class machine.RMT(channel,...) Construct an RMT object on the given channel. `channel` can be 2-7. With no additional parameters, the RMT object is created but not initialised. If extra arguments are given, the RMT is initialised for transmission or reception. See `init` for parameters of initialisation. The resolution which a pulse can be sent/received depends on the selected channel: @@ -57,13 +62,13 @@ Construct an RMT object on the given channel. `channel` can be 2-7. With no addi ## Methods -#### rmt.init\(gpio, rx\_idle\_threshold, rx\_filter\_threshold, tx\_idle\_level, tx\_carrier\) +#### rmt.init(gpio, rx\_idle\_threshold, rx\_filter\_threshold, tx\_idle\_level, tx\_carrier) Initialise the RMT peripheral with the given parameters: * `gpio` is the GPIO Pin to use. -* `rx_idle_threshold` is the maximum duration of a valid pulse. The represented time unit \(resolution\) depends on the selected channel, value can be 0-65535. -* `rx_filter_threshold` is the minimum duration of a valid pulse. The represented time unit \(resolution\) depends on the selected channel, value can be 0-31. +* `rx_idle_threshold` is the maximum duration of a valid pulse. The represented time unit (resolution) depends on the selected channel, value can be 0-65535. +* `rx_filter_threshold` is the minimum duration of a valid pulse. The represented time unit (resolution) depends on the selected channel, value can be 0-31. * `tx_idle_level` is the output signal's level after the transmission is finished, can be RMT.HIGH or RMT.LOW. * `tx_carrier` is the modulation of the pulses to send. @@ -75,15 +80,15 @@ The `tx_carrier` parameter is a tuple with the following structure: * `carrier_duty_percent` is the duty percent of the carrier's signal, can be 0%-100%. * `carrier_level` is the level of the pulse to modulate, can be RMT.HIGH or RMT.LOW. -#### rmt.deinit\(\) +#### rmt.deinit() Deinitialise the RMT object. -{% hint style="info" %} +{{{% hint style="info" %}}} If an RMT object needs to be reconfigured from RX/TX to TX/RX, then either first `deinit()` must be called or the `init()` again with the desired configuration. -{% endhint %} +{{< /hint >}} -#### rmt.pulses\_get\(pulses, timeout\) +#### rmt.pulses\_get(pulses, timeout) Reads in pulses from the GPIO pin. @@ -104,19 +109,19 @@ Reads in pulses from the GPIO pin. Return value: Tuple of items with the following structure: `(level, duration)`: * `level` represents the level of the received bit/pulse, can be 0 or 1. -* `duration` represents the duration of the received pulse, the time unit \(resolution\) depends on the selected channel. +* `duration` represents the duration of the received pulse, the time unit (resolution) depends on the selected channel. -{% hint style="info" %} +{{{% hint style="info" %}}} Maximum of 128 pulses can be received in a row without receiving "idle" signal. If the incoming pulse sequence contains more than 128 pulses the rest is dropped and the receiver waits for another sequence of pulses. The `pulses_get` function can be called to receive more than 128 pulses, however the above mentioned limitation should be kept in mind when evaluating the received data. -{% endhint %} +{{< /hint >}} -#### rmt.pulses\_send\(duration, data, start\_level, wait\_tx\_done\) +#### rmt.pulses\_send(duration, data, start\_level, wait\_tx\_done) Generates pulses as defined by the parameters below -* `duration` represents the duration of the pulses to be sent, the time unit \(resolution\) depends on the selected channel. +* `duration` represents the duration of the pulses to be sent, the time unit (resolution) depends on the selected channel. * `data` Tuple that represents the sequence of pulses to be sent, must be composed of 0 or 1 elements. -* `start_level` defines the state \(HIGH/LOW\) of the first pulse given by `duration` if `data` is not given. +* `start_level` defines the state (HIGH/LOW) of the first pulse given by `duration` if `data` is not given. * `data` must be a tuple and `duration` can be a tuple or a single number, with `data` being optional. In the case that only `duration` is provided, it must be a tuple and you must also provide `start_level` which will dictate the level of the first duration, the signal level then toggles between each duration value. * If `data` is provided and `duration` is a single number, each pulse in `data` will have have an equal length as set by `duration`. * If `data` and `duration` are provided as tuples, they must be of the same number of elements, with each pulse lasting its matching duration. diff --git a/firmwareapi/pycom/machine/rtc.md b/content/firmwareapi/pycom/machine/rtc.md similarity index 78% rename from firmwareapi/pycom/machine/rtc.md rename to content/firmwareapi/pycom/machine/rtc.md index c9dae9d..251df5c 100644 --- a/firmwareapi/pycom/machine/rtc.md +++ b/content/firmwareapi/pycom/machine/rtc.md @@ -1,5 +1,10 @@ -# RTC - +--- +title: "RTC" +aliases: + - firmwareapi/pycom/machine/rtc.html + - firmwareapi/pycom/machine/rtc.md + - chapter/firmwareapi/pycom/machine/rtc +--- The RTC is used to keep track of the date and time. ## Quick Usage Example @@ -14,7 +19,7 @@ print(rtc.now()) ## Constructors -#### class machine.RTC\(id=0, ...\) +#### class machine.RTC(id=0, ...) Create an RTC object. See init for parameters of initialisation. @@ -25,7 +30,7 @@ rtc = RTC(id=0) ## Methods -#### rtc.init\(datetime=None, source=RTC.INTERNAL\_RC\) +#### rtc.init(datetime=None, source=RTC.INTERNAL\_RC) Initialise the RTC. The arguments are: @@ -39,11 +44,11 @@ For example: rtc.init((2017, 2, 28, 10, 30, 0, 0, 0)) ``` -{% hint style="info" %} +{{{% hint style="info" %}}} `tzinfo` is ignored by this method. Use `time.timezone` to achieve similar results. -{% endhint %} +{{< /hint >}} -#### rtc.now\(\) +#### rtc.now() Get get the current `datetime` tuple: @@ -52,9 +57,9 @@ Get get the current `datetime` tuple: rtc.now() ``` -#### rtc.ntp\_sync\(server, \* , update\_period=3600\) +#### rtc.ntp\_sync(server, \* , update\_period=3600) -Set up automatic fetch and update the time using NTP \(SNTP\). +Set up automatic fetch and update the time using NTP (SNTP). * `server` is the URL of the NTP server. Can be set to `None` to disable the periodic updates. * `update_period` is the number of seconds between updates. Shortest period is 15 seconds. @@ -65,7 +70,7 @@ Can be used like: rtc.ntp_sync("pool.ntp.org") # this is an example. You can select a more specific server according to your geographical location ``` -#### rtc.synced\(\) +#### rtc.synced() Returns `True` if the last `ntp_sync` has been completed, `False` otherwise: @@ -73,7 +78,7 @@ Returns `True` if the last `ntp_sync` has been completed, `False` otherwise: rtc.synced() ``` -#### rtc.memory\(\[data\]\) +#### rtc.memory(\[data\]) Reads RTC memory contents or write data in passed Buffer in to RTC memory diff --git a/firmwareapi/pycom/machine/sd.md b/content/firmwareapi/pycom/machine/sd.md similarity index 75% rename from firmwareapi/pycom/machine/sd.md rename to content/firmwareapi/pycom/machine/sd.md index a5ee55f..35682ad 100644 --- a/firmwareapi/pycom/machine/sd.md +++ b/content/firmwareapi/pycom/machine/sd.md @@ -1,14 +1,19 @@ -# SD - +--- +title: "SD" +aliases: + - firmwareapi/pycom/machine/sd.html + - firmwareapi/pycom/machine/sd.md + - chapter/firmwareapi/pycom/machine/sd +--- The SD card class allows to configure and enable the memory card module of your Pycom module and automatically mount it as `/sd` as part of the file system. There is a single pin combination that can be used for the SD card, and the current implementation only works in 1-bit mode. The pin connections are as follows: -`P8: DAT0`, `P23: SCLK` and `P4: CMD` \(no external pull-up resistors are needed\) +`P8: DAT0`, `P23: SCLK` and `P4: CMD` (no external pull-up resistors are needed) If you have one of the Pycom expansion boards, then simply insert the card into the micro SD socket and run your script. -{% hint style="info" %} +{{{% hint style="info" %}}} Make sure your SD card is formatted either as FAT16 or FAT32. -{% endhint %} +{{< /hint >}} ## Quick Example Usage: @@ -33,21 +38,21 @@ f.close() ## Constructors -#### class machine.SD\(id, ...\) +#### class machine.SD(id, ...) Create a SD card object. See [`sd.init()`](sd.md#sd-init-id-0) for parameters if initialisation. ## Methods -#### sd.init\(id=0\) +#### sd.init(id=0) Enable the SD card. -#### sd.deinit\(\) +#### sd.deinit() Disable the SD card. -{% hint style="info" %} +{{{% hint style="info" %}}} Please note that the SD card library currently supports FAT16/32 formatted SD cards up to 32 GB. Future firmware updates will increase compatibility with additional formats and sizes. -{% endhint %} +{{< /hint >}} diff --git a/firmwareapi/pycom/machine/spi.md b/content/firmwareapi/pycom/machine/spi.md similarity index 78% rename from firmwareapi/pycom/machine/spi.md rename to content/firmwareapi/pycom/machine/spi.md index d4f1382..bdec246 100644 --- a/firmwareapi/pycom/machine/spi.md +++ b/content/firmwareapi/pycom/machine/spi.md @@ -1,5 +1,10 @@ -# SPI - +--- +title: "SPI" +aliases: + - firmwareapi/pycom/machine/spi.html + - firmwareapi/pycom/machine/spi.md + - chapter/firmwareapi/pycom/machine/spi +--- SPI is a serial protocol that is driven by a master. At the physical level there are 3 lines: SCK, MOSI, MISO. See usage model of I2C; SPI is very similar. Main difference is parameters to init the SPI bus: @@ -41,13 +46,13 @@ spi.write_readinto(bytes([0x01, 0x02, 0x03, 0x04, 0x05]), rbuf) # send a receive ## Constructors -#### class machine.SPI\(id, ...\) +#### class machine.SPI(id, ...) -Construct an SPI object on the given bus. `id` can be only 0. With no additional parameters, the SPI object is created but not initialised \(it has the settings from the last initialisation of the bus, if any\). If extra arguments are given, the bus is initialised. See init for parameters of initialisation. +Construct an SPI object on the given bus. `id` can be only 0. With no additional parameters, the SPI object is created but not initialised (it has the settings from the last initialisation of the bus, if any). If extra arguments are given, the bus is initialised. See init for parameters of initialisation. ## Methods -#### spi.init\(mode, baudrate=1000000, \* , polarity=0, phase=0, bits=8, firstbit=SPI.MSB, pins=\(CLK, MOSI, MISO\)\) +#### spi.init(mode, baudrate=1000000, \* , polarity=0, phase=0, bits=8, firstbit=SPI.MSB, pins=(CLK, MOSI, MISO)) Initialise the SPI bus with the given parameters: @@ -57,25 +62,25 @@ Initialise the SPI bus with the given parameters: * `phase` can be 0 or 1 to sample data on the first or second clock edge respectively. * `bits` is the width of each transfer, accepted values are 8, 16 and 32. * `firstbit` can be SPI.MSB or SPI.LSB. -* `pins` is an optional tuple with the pins to assign to the SPI bus. If the pins argument is not given the default pins will be selected \(`P10` as CLK,`P11` as MOSI and `P14` as MISO\). If pins is passed as None then no pin assignment will be made. +* `pins` is an optional tuple with the pins to assign to the SPI bus. If the pins argument is not given the default pins will be selected (`P10` as CLK,`P11` as MOSI and `P14` as MISO). If pins is passed as None then no pin assignment will be made. -#### spi.deinit\(\) +#### spi.deinit() Turn off the SPI bus. -#### spi.write\(buf\) +#### spi.write(buf) Write the data contained in `buf`. Returns the number of bytes written. -#### spi.read\(nbytes, \* , write=0x00\) +#### spi.read(nbytes, \* , write=0x00) Read the `nbytes` while writing the data specified by `write`. Returns the bytes read. -#### spi.readinto\(buf, \* , write=0x00\) +#### spi.readinto(buf, \* , write=0x00) Read into the buffer specified by `buf` while writing the data specified by `write`. Return the number of bytes read. -#### spi.write\_readinto\(write\_buf, read\_buf\) +#### spi.write\_readinto(write\_buf, read\_buf) Write from `write_buf` and read into `read_buf`. Both buffers must have the same length. Returns the number of bytes written diff --git a/firmwareapi/pycom/machine/timer.md b/content/firmwareapi/pycom/machine/timer.md similarity index 67% rename from firmwareapi/pycom/machine/timer.md rename to content/firmwareapi/pycom/machine/timer.md index cb3a1d8..f959fc3 100644 --- a/firmwareapi/pycom/machine/timer.md +++ b/content/firmwareapi/pycom/machine/timer.md @@ -1,5 +1,10 @@ -# Timer - +--- +title: "Timer" +aliases: + - firmwareapi/pycom/machine/timer.html + - firmwareapi/pycom/machine/timer.md + - chapter/firmwareapi/pycom/machine/timer +--- ## class Timer – Measure Time and Set Alarms Timers can be used for a great variety of tasks, like measuring time spans or being notified that a specific interval has elapsed. @@ -8,30 +13,30 @@ These two concepts are grouped into two different subclasses: `Chrono`: used to measure time spans. `Alarm`: to get interrupted after a specific interval. -{% hint style="info" %} +{{{% hint style="info" %}}} You can create as many of these objects as needed. -{% endhint %} +{{< /hint >}} ### Constructors -#### class Timer.Chrono\(\) +#### class Timer.Chrono() Create a chronometer object. -#### class Timer.Alarm\(handler=None, s, \* , ms, us, arg=None, periodic=False\) +#### class Timer.Alarm(handler=None, s, \* , ms, us, arg=None, periodic=False) Create an Alarm object. * `handler`: will be called after the interval has elapsed. If set to `None`, the alarm will be disabled after creation. * `arg`: an optional argument can be passed to the callback handler function. If `None` is specified, the function will receive the object that triggered the alarm. -* `s, ms, us`: the interval can be specified in seconds \(float\), miliseconds \(integer\) or microseconds \(integer\). Only one at a time can be specified. +* `s, ms, us`: the interval can be specified in seconds (float), miliseconds (integer) or microseconds (integer). Only one at a time can be specified. * `periodic`: an alarm can be set to trigger repeatedly by setting this parameter to `True`. ### Methods -#### Timer.sleep\_us\(\) +#### Timer.sleep\_us() -Delay for a given number of microseconds, should be positive or 0 \(for speed, the condition is not enforced\). Internally it uses the same timer as the other elements of the `Timer` class. It compensates for the calling overhead, so for example, 100us should be really close to 100us. For times bigger than 10,000us it releases the GIL to let other threads run, so exactitude is not guaranteed for delays longer than that. +Delay for a given number of microseconds, should be positive or 0 (for speed, the condition is not enforced). Internally it uses the same timer as the other elements of the `Timer` class. It compensates for the calling overhead, so for example, 100us should be really close to 100us. For times bigger than 10,000us it releases the GIL to let other threads run, so exactitude is not guaranteed for delays longer than that. ## class Chrono @@ -39,27 +44,27 @@ Can be used to measure time spans. ### Methods -#### chrono.start\(\) +#### chrono.start() Start the chronometer. -#### chrono.stop\(\) +#### chrono.stop() Stop the chronometer. -#### chrono.reset\(\) +#### chrono.reset() Reset the time count to 0. -#### chrono.read\(\) +#### chrono.read() Get the elapsed time in seconds. -#### chrono.read\_ms\(\) +#### chrono.read\_ms() Get the elapsed time in milliseconds. -#### chrono.read\_us\(\) +#### chrono.read\_us() Get the elapsed time in microseconds. @@ -91,13 +96,13 @@ Used to get interrupted after a specific interval. ### Methods -#### alarm.callback\(handler, \* , arg=None\) +#### alarm.callback(handler, \* , arg=None) Specify a callback handler for the alarm. If set to `None`, the alarm will be disabled. An optional argument `arg` can be passed to the callback handler function. If `None` is specified, the function will receive the object that triggered the alarm. -#### alarm.cancel\(\) +#### alarm.cancel() Disables the alarm. @@ -121,7 +126,7 @@ class Clock: clock = Clock() ``` -{% hint style="info" %} -For more information on how Pycom’s products handle interrupts, see [notes](../../notes.md#interrupt-handling). -{% endhint %} +{{{% hint style="info" %}}} +For more information on how Pycom's products handle interrupts, see [notes](/../notes.md#interrupt-handling). +{{< /hint >}} diff --git a/firmwareapi/pycom/machine/uart.md b/content/firmwareapi/pycom/machine/uart.md similarity index 73% rename from firmwareapi/pycom/machine/uart.md rename to content/firmwareapi/pycom/machine/uart.md index 655dbbd..16b635b 100644 --- a/firmwareapi/pycom/machine/uart.md +++ b/content/firmwareapi/pycom/machine/uart.md @@ -1,6 +1,11 @@ -# UART - -UART implements the standard UART/USART duplex serial communications protocol. At the physical level it consists of 2 lines: RXD and TXD. The unit of communication is a character \(not to be confused with a string character\) which can be 5, 6, 7 or 8 bits wide. +--- +title: "UART" +aliases: + - firmwareapi/pycom/machine/uart.html + - firmwareapi/pycom/machine/uart.md + - chapter/firmwareapi/pycom/machine/uart +--- +UART implements the standard UART/USART duplex serial communications protocol. At the physical level it consists of 2 lines: RXD and TXD. The unit of communication is a character (not to be confused with a string character) which can be 5, 6, 7 or 8 bits wide. UART objects can be created and initialised using: @@ -39,7 +44,7 @@ uart.write('hello') uart.read(5) # read up to 5 bytes ``` -## Quick Usage Example using non-default pins \(TXD/RXD only\) +## Quick Usage Example using non-default pins (TXD/RXD only) ```python from machine import UART @@ -49,7 +54,7 @@ uart.write('hello') uart.read(5) # read up to 5 bytes ``` -## Quick Usage Example using non-default pins \(TXD/RXD and flow control\) +## Quick Usage Example using non-default pins (TXD/RXD and flow control) ```python from machine import UART @@ -61,17 +66,17 @@ uart.read(5) # read up to 5 bytes ## Constructors -#### class machine.UART\(bus, ...\) +#### class machine.UART(bus, ...) -Construct a UART object on the given `bus`. `bus` can be `0, 1 or 2`. If the `bus` is not given, the default one will be selected \(`0`\) or the selection will be made based on the given pins. +Construct a UART object on the given `bus`. `bus` can be `0, 1 or 2`. If the `bus` is not given, the default one will be selected (`0`) or the selection will be made based on the given pins. -{% hint style="danger" %} +{{{% hint style="danger" %}}} On the GPy/FiPy UART2 is unavailable because it is used to communicate with the cellular radio. -{% endhint %} +{{< /hint >}} ## Methods -#### uart.init\(baudrate=9600, bits=8, parity=None, stop=1, \* , timeout\_chars=2, pins=\(TXD, RXD, RTS, CTS\)\) +#### uart.init(baudrate=9600, bits=8, parity=None, stop=1, \* , timeout\_chars=2, pins=(TXD, RXD, RTS, CTS)) Initialise the UART bus with the given parameters: @@ -80,56 +85,56 @@ Initialise the UART bus with the given parameters: * `parity` is the parity, `None`, UART.EVEN or UART.ODD. * `stop` is the number of stop bits, `1 or 2`. * `timeout_chars` Rx timeout defined in number of characters. The value given here will be multiplied by the time a characters takes to be transmitted at the configured `baudrate`. -* `pins` is a 4 or 2 item list indicating the TXD, RXD, RTS and CTS pins \(in that order\). Any of the pins can be `None` if one wants the UART to operate with limited functionality. If the RTS pin is given the the RX pin must be given as well. The same applies to CTS. When no pins are given, then the default set of TXD \(P1\) and RXD \(P0\) pins is taken, and hardware flow control will be disabled. If `pins=None`, no pin assignment will be made. +* `pins` is a 4 or 2 item list indicating the TXD, RXD, RTS and CTS pins (in that order). Any of the pins can be `None` if one wants the UART to operate with limited functionality. If the RTS pin is given the the RX pin must be given as well. The same applies to CTS. When no pins are given, then the default set of TXD (P1) and RXD (P0) pins is taken, and hardware flow control will be disabled. If `pins=None`, no pin assignment will be made. -#### uart.deinit\(\) +#### uart.deinit() Turn off the UART bus. -#### uart.any\(\) +#### uart.any() Return the number of characters available for reading. -#### uart.read\(\[nbytes\]\) +#### uart.read(\[nbytes\]) Read characters. If `nbytes` is specified then read at most that many bytes. Return value: a bytes object containing the bytes read in. Returns `None` on timeout. -#### uart.readall\(\) +#### uart.readall() Read as much data as possible. Return value: a bytes object or `None` on timeout. -#### uart.readinto\(buf\[, nbytes\]\) +#### uart.readinto(buf\[, nbytes\]) Read bytes into the `buf`. If `nbytes` is specified then read at most that many bytes. Otherwise, read at most `len(buf)` bytes. Return value: number of bytes read and stored into `buf` or `None` on timeout. -#### uart.readline\(\) +#### uart.readline() Read a line, ending in a newline character. If such a line exists, return is immediate. If the timeout elapses, all available data is returned regardless of whether a newline exists. Return value: the line read or `None` on timeout if no data is available. -#### uart.write\(buf\) +#### uart.write(buf) Write the buffer of bytes to the bus. Return value: number of bytes written or None on timeout. -#### uart.sendbreak\(\) +#### uart.sendbreak() Send a break condition on the bus. This drives the bus low for a duration of 13 bits. Return value: `None`. -#### uart.wait\_tx\_done\(timeout\_ms\) +#### uart.wait\_tx\_done(timeout\_ms) Waits at most `timeout_ms` for the last Tx transaction to complete. Returns `True` if all data has been sent and the TX buffer has no data in it, otherwise returns `False`. ## Constants -* Parity types \(along with `None`\): `UART.EVEN`, `UART.ODD` +* Parity types (along with `None`): `UART.EVEN`, `UART.ODD` * IRQ trigger sources: `UART.RX_ANY` diff --git a/firmwareapi/pycom/machine/wdt.md b/content/firmwareapi/pycom/machine/wdt.md similarity index 79% rename from firmwareapi/pycom/machine/wdt.md rename to content/firmwareapi/pycom/machine/wdt.md index aecf6b7..258e5f3 100644 --- a/firmwareapi/pycom/machine/wdt.md +++ b/content/firmwareapi/pycom/machine/wdt.md @@ -1,5 +1,10 @@ -# WDT - +--- +title: "WDT" +aliases: + - firmwareapi/pycom/machine/wdt.html + - firmwareapi/pycom/machine/wdt.md + - chapter/firmwareapi/pycom/machine/wdt +--- The WDT is used to restart the system when the application crashes and ends up into a non recoverable state. After enabling, the application must "feed" the watchdog periodically to prevent it from expiring and resetting the system. ## Quick Usage Example @@ -12,17 +17,17 @@ wdt.feed() ## Constructors -#### class machine.WDT\(id=0, timeout\) +#### class machine.WDT(id=0, timeout) Create a WDT object and start it. The `id` can only be `0`. See the init method for the parameters of initialisation. ## Methods -#### wdt.init\(timeout\) +#### wdt.init(timeout) Initialises the watchdog timer. The timeout must be given in milliseconds. Once it is running the WDT cannot be stopped but the timeout can be re-configured at any point in time. -#### wdt.feed\(\) +#### wdt.feed() Feed the WDT to prevent it from resetting the system. The application should place this call in a sensible place ensuring that the WDT is only fed after verifying that everything is functioning correctly. diff --git a/content/firmwareapi/pycom/network/README.md b/content/firmwareapi/pycom/network/README.md new file mode 100644 index 0000000..af729fd --- /dev/null +++ b/content/firmwareapi/pycom/network/README.md @@ -0,0 +1,7 @@ +--- +title: "network" +aliases: + - chapter/firmwareapi/pycom/network +--- +This module provides access to network drivers and routing configuration. Network drivers for specific hardware are available within this module and are used to configure specific hardware network interfaces. + diff --git a/firmwareapi/pycom/network/README.md b/content/firmwareapi/pycom/network/_index.md similarity index 86% rename from firmwareapi/pycom/network/README.md rename to content/firmwareapi/pycom/network/_index.md index 57b7462..1796767 100644 --- a/firmwareapi/pycom/network/README.md +++ b/content/firmwareapi/pycom/network/_index.md @@ -1,4 +1,6 @@ -# network - +--- +title: "network" +aliases: +--- This module provides access to network drivers and routing configuration. Network drivers for specific hardware are available within this module and are used to configure specific hardware network interfaces. diff --git a/content/firmwareapi/pycom/network/bluetooth/README.md b/content/firmwareapi/pycom/network/bluetooth/README.md new file mode 100644 index 0000000..8bf46e0 --- /dev/null +++ b/content/firmwareapi/pycom/network/bluetooth/README.md @@ -0,0 +1,257 @@ +--- +title: "Bluetooth" +aliases: + - chapter/firmwareapi/pycom/network/bluetooth +--- +This class provides a driver for the Bluetooth radio in the module. Currently, only basic BLE functionality is available. + +## Quick Usage Example + +```python +from network import Bluetooth +import time +bt = Bluetooth() +bt.start_scan(-1) + +while True: + adv = bt.get_adv() + if adv and bt.resolve_adv_data(adv.data, Bluetooth.ADV_NAME_CMPL) == 'Heart Rate': + try: + conn = bt.connect(adv.mac) + services = conn.services() + for service in services: + time.sleep(0.050) + if type(service.uuid()) == bytes: + print('Reading chars from service = {}'.format(service.uuid())) + else: + print('Reading chars from service = %x' % service.uuid()) + chars = service.characteristics() + for char in chars: + if (char.properties() & Bluetooth.PROP_READ): + print('char {} value = {}'.format(char.uuid(), char.read())) + conn.disconnect() + break + except: + print("Error while connecting or reading from the BLE device") + break + else: + time.sleep(0.050) +``` + +## Bluetooth Low Energy (BLE) + +Bluetooth low energy (BLE) is a subset of classic Bluetooth, designed for easy connecting and communicating between devices (in particular mobile platforms). BLE uses a methodology known as Generic Access Profile (GAP) to control connections and advertising. + +GAP allows for devices to take various roles but generic flow works with devices that are either a Server (low power, resource constrained, sending small payloads of data) or a Client device (commonly a mobile device, PC or Pycom Device with large resources and processing power). Pycom devices can act as both a Client and a Server. + +## Constructors + +#### class network.Bluetooth(id=0, ...) + +Create a Bluetooth object, and optionally configure it. See init for params of configuration. + +Example: + +```python +from network import Bluetooth +bluetooth = Bluetooth() +``` + +## Methods + +#### bluetooth.init(id=0, mode=Bluetooth.BLE, antenna=None) + +* `id` Only one Bluetooth peripheral available so must always be 0 +* `mode` currently the only supported mode is `Bluetooth.BLE` +* `antenna` selects between the internal and the external antenna. Can be either + + `Bluetooth.INT_ANT`, `Bluetooth.EXT_ANT`. + + With our development boards it defaults to using the internal antenna, but in + + the case of an OEM module, the antenna pin (`P12`) is not used, so it's free to be + + used for other things. + +Initialises and enables the Bluetooth radio in BLE mode. + +#### bluetooth.deinit() + +Disables the Bluetooth radio. + +#### bluetooth.start\_scan(timeout) + +Starts performing a scan listening for BLE devices sending advertisements. This function always returns immediately, the scanning will be performed on the background. The return value is `None`. After starting the scan the function `get_adv()` can be used to retrieve the advertisements messages from the FIFO. The internal FIFO has space to cache 16 advertisements. + +The arguments are: + +* `timeout` specifies the amount of time in seconds to scan for advertisements, cannot be zero. If timeout is > 0, then the BLE radio will listen for advertisements until the specified value in seconds elapses. If timeout < 0, then there's no timeout at all, and stop\_scan() needs to be called to cancel the scanning process. + +Examples: + +```python +bluetooth.start_scan(10) # starts scanning and stop after 10 seconds +bluetooth.start_scan(-1) # starts scanning indefinitely until bluetooth.stop_scan() is called +``` + +#### bluetooth.stop\_scan() + +Stops an ongoing scanning process. Returns `None`. + +#### bluetooth.isscanning() + +Returns `True` if a Bluetooth scan is in progress. `False` otherwise. + +#### bluetooth.get\_adv() + +Gets an named tuple with the advertisement data received during the scanning. The tuple has the following structure: `(mac, addr_type, adv_type, rssi, data)` + +* `mac` is the 6-byte ling mac address of the device that sent the advertisement. +* `addr_type` is the address type. See the constants section below for more details. +* `adv_type` is the advertisement type received. See the constants section below fro more details. +* `rssi` is signed integer with the signal strength of the advertisement. +* `data` contains the complete 31 bytes of the advertisement message. In order to parse the data and get the specific types, the method `resolve_adv_data()` can be used. + +Example for getting `mac` address of an advertiser: + +```python +import ubinascii + +bluetooth = Bluetooth() +bluetooth.start_scan(20) # scan for 20 seconds + +adv = bluetooth.get_adv() # +ubinascii.hexlify(adv.mac) # convert hexadecimal to ascii +``` + +#### bluetooth.get\_advertisements() + +Same as the `get_adv()` method, but this one returns a list with all the advertisements received. + +#### bluetooth.resolve\_adv\_data(data, data\_type) + +Parses the advertisement data and returns the requested `data_type` if present. If the data type is not present, the function returns `None`. + +Arguments: + +* `data` is the bytes object with the complete advertisement data. +* `data_type` is the data type to resolve from from the advertisement data. See constants section below for details. + +Example: + +```python +import ubinascii +from network import Bluetooth +bluetooth = Bluetooth() + +bluetooth.start_scan(20) +while bluetooth.isscanning(): + adv = bluetooth.get_adv() + if adv: + # try to get the complete name + print(bluetooth.resolve_adv_data(adv.data, Bluetooth.ADV_NAME_CMPL)) + + mfg_data = bluetooth.resolve_adv_data(adv.data, Bluetooth.ADV_MANUFACTURER_DATA) + + if mfg_data: + # try to get the manufacturer data (Apple's iBeacon data is sent here) + print(ubinascii.hexlify(mfg_data)) +``` + +#### bluetooth.connect(mac\_addr, timeout=None) + +* `mac_addr` is the address of the remote device to connect +* `timeout` specifies the amount of time in milliseconds to wait for the connection process to finish. If not given then no timeout is applied The function blocks until the connection succeeds or fails (raises OSError) or the given `timeout` expires (raises `Bluetooth.timeout TimeoutError`). If the connections succeeds it returns a object of type `GATTCConnection`. + +```python +bluetooth.connect('112233eeddff') # mac address is accepted as a string +``` + +#### bluetooth.callback(trigger=None, handler=None, arg=None) + +Creates a callback that will be executed when any of the triggers occurs. The arguments are: + +* `trigger` can be either `Bluetooth.NEW_ADV_EVENT`, `Bluetooth.CLIENT_CONNECTED`, or `Bluetooth.CLIENT_DISCONNECTED` +* `handler` is the function that will be executed when the callback is triggered. +* `arg` is the argument that gets passed to the callback. If nothing is given the bluetooth object itself is used. + +An example of how this may be used can be seen in the [`bluetooth.events()`](./#bluetooth-events) method. + +#### bluetooth.events() + +Returns a value with bit flags identifying the events that have occurred since the last call. Calling this function clears the events. + +Example of usage: + +```python +from network import Bluetooth + +bluetooth = Bluetooth() +bluetooth.set_advertisement(name='LoPy', service_uuid=b'1234567890123456') + +def conn_cb (bt_o): + events = bt_o.events() # this method returns the flags and clears the internal registry + if events & Bluetooth.CLIENT_CONNECTED: + print("Client connected") + elif events & Bluetooth.CLIENT_DISCONNECTED: + print("Client disconnected") + +bluetooth.callback(trigger=Bluetooth.CLIENT_CONNECTED | Bluetooth.CLIENT_DISCONNECTED, handler=conn_cb) + +bluetooth.advertise(True) +``` + +#### bluetooth.set\_advertisement(\* , name=None, manufacturer\_data=None, service\_data=None, service\_uuid=None) + +Configure the data to be sent while advertising. If left with the default of `None` the data won't be part of the advertisement message. + +The arguments are: + +* `name` is the string name to be shown on advertisements. +* `manufacturer_data` manufacturer data to be advertised (hint: use it for iBeacons). +* `service_data` service data to be advertised. +* `service_uuid` uuid of the service to be advertised. + +Example: + +```python +bluetooth.set_advertisement(name="advert", manufacturer_data="lopy_v1") +``` + +#### bluetooth.advertise(\[Enable\]) + +Start or stop sending advertisements. The `set_advertisement()` method must have been called prior to this one. + +#### bluetooth.service(uuid, \* , isprimary=True, nbr\_chars=1, start=True) + +Create a new service on the internal GATT server. Returns a object of type `BluetoothServerService`. + +The arguments are: + +* `uuid` is the UUID of the service. Can take an integer or a 16 byte long string or bytes object. +* `isprimary` selects if the service is a primary one. Takes a `bool` value. +* `nbr_chars` specifies the number of characteristics that the service will contain. +* `start` if `True` the service is started immediately. + +```python +bluetooth.service('abc123') +``` + +#### bluetooth.disconnect\_client() + +Closes the BLE connection with the client. + +## Constants + +* Bluetooth mode: `Bluetooth.BLE` +* Advertisement type: `Bluetooth.CONN_ADV`, `Bluetooth.CONN_DIR_ADV`, `Bluetooth.DISC_ADV`, `Bluetooth.NON_CONN_ADV`, `Bluetooth.SCAN_RSP` +* Address type: `Bluetooth.PUBLIC_ADDR`, `Bluetooth.RANDOM_ADDR`, `Bluetooth.PUBLIC_RPA_ADDR`, `Bluetooth.RANDOM_RPA_ADDR` +* Advertisement data type: `Bluetooth.ADV_FLAG`, `Bluetooth.ADV_16SRV_PART`, `Bluetooth.ADV_T16SRV_CMPL`, `Bluetooth.ADV_32SRV_PART`, `Bluetooth.ADV_32SRV_CMPL`, `Bluetooth.ADV_128SRV_PART`, `Bluetooth.ADV_128SRV_CMPL`, `Bluetooth.ADV_NAME_SHORT`, `Bluetooth.ADV_NAME_CMPL`, `Bluetooth.ADV_TX_PWR`, `Bluetooth.ADV_DEV_CLASS`, `Bluetooth.ADV_SERVICE_DATA`, `Bluetooth.ADV_APPEARANCE`, `Bluetooth.ADV_ADV_INT`, `Bluetooth.ADV_32SERVICE_DATA`, `Bluetooth.ADV_128SERVICE_DATA`, `Bluetooth.ADV_MANUFACTURER_DATA` +* Characteristic properties (bit values that can be combined): `Bluetooth.PROP_BROADCAST`, `Bluetooth.PROP_READ`, `Bluetooth.PROP_WRITE_NR`, `Bluetooth.PROP_WRITE`, `Bluetooth.PROP_NOTIFY`, `Bluetooth.PROP_INDICATE`, `Bluetooth.PROP_AUTH`, `Bluetooth.PROP_EXT_PROP` +* Characteristic callback events: `Bluetooth.CHAR_READ_EVENT`, `Bluetooth.CHAR_WRITE_EVENT`, `Bluetooth.NEW_ADV_EVENT`, `Bluetooth.CLIENT_CONNECTED`, `Bluetooth.CLIENT_DISCONNECTED`, `Bluetooth.CHAR_NOTIFY_EVENT` +* Antenna type: `Bluetooth.INT_ANT`, `Bluetooth.EXT_ANT` + +## Exceptions + +* `Bluetooth.timeout` + diff --git a/firmwareapi/pycom/network/bluetooth/README.md b/content/firmwareapi/pycom/network/bluetooth/_index.md similarity index 79% rename from firmwareapi/pycom/network/bluetooth/README.md rename to content/firmwareapi/pycom/network/bluetooth/_index.md index 68ee60d..a7508cf 100644 --- a/firmwareapi/pycom/network/bluetooth/README.md +++ b/content/firmwareapi/pycom/network/bluetooth/_index.md @@ -1,5 +1,7 @@ -# Bluetooth - +--- +title: "Bluetooth" +aliases: +--- This class provides a driver for the Bluetooth radio in the module. Currently, only basic BLE functionality is available. ## Quick Usage Example @@ -35,15 +37,15 @@ while True: time.sleep(0.050) ``` -## Bluetooth Low Energy \(BLE\) +## Bluetooth Low Energy (BLE) -Bluetooth low energy \(BLE\) is a subset of classic Bluetooth, designed for easy connecting and communicating between devices \(in particular mobile platforms\). BLE uses a methodology known as Generic Access Profile \(GAP\) to control connections and advertising. +Bluetooth low energy (BLE) is a subset of classic Bluetooth, designed for easy connecting and communicating between devices (in particular mobile platforms). BLE uses a methodology known as Generic Access Profile (GAP) to control connections and advertising. -GAP allows for devices to take various roles but generic flow works with devices that are either a Server \(low power, resource constrained, sending small payloads of data\) or a Client device \(commonly a mobile device, PC or Pycom Device with large resources and processing power\). Pycom devices can act as both a Client and a Server. +GAP allows for devices to take various roles but generic flow works with devices that are either a Server (low power, resource constrained, sending small payloads of data) or a Client device (commonly a mobile device, PC or Pycom Device with large resources and processing power). Pycom devices can act as both a Client and a Server. ## Constructors -#### class network.Bluetooth\(id=0, ...\) +#### class network.Bluetooth(id=0, ...) Create a Bluetooth object, and optionally configure it. See init for params of configuration. @@ -56,7 +58,7 @@ bluetooth = Bluetooth() ## Methods -#### bluetooth.init\(id=0, mode=Bluetooth.BLE, antenna=None\) +#### bluetooth.init(id=0, mode=Bluetooth.BLE, antenna=None) * `id` Only one Bluetooth peripheral available so must always be 0 * `mode` currently the only supported mode is `Bluetooth.BLE` @@ -66,23 +68,23 @@ bluetooth = Bluetooth() With our development boards it defaults to using the internal antenna, but in - the case of an OEM module, the antenna pin \(`P12`\) is not used, so it’s free to be + the case of an OEM module, the antenna pin (`P12`) is not used, so it's free to be used for other things. Initialises and enables the Bluetooth radio in BLE mode. -#### bluetooth.deinit\(\) +#### bluetooth.deinit() Disables the Bluetooth radio. -#### bluetooth.start\_scan\(timeout\) +#### bluetooth.start\_scan(timeout) Starts performing a scan listening for BLE devices sending advertisements. This function always returns immediately, the scanning will be performed on the background. The return value is `None`. After starting the scan the function `get_adv()` can be used to retrieve the advertisements messages from the FIFO. The internal FIFO has space to cache 16 advertisements. The arguments are: -* `timeout` specifies the amount of time in seconds to scan for advertisements, cannot be zero. If timeout is > 0, then the BLE radio will listen for advertisements until the specified value in seconds elapses. If timeout < 0, then there’s no timeout at all, and stop\_scan\(\) needs to be called to cancel the scanning process. +* `timeout` specifies the amount of time in seconds to scan for advertisements, cannot be zero. If timeout is > 0, then the BLE radio will listen for advertisements until the specified value in seconds elapses. If timeout < 0, then there's no timeout at all, and stop\_scan() needs to be called to cancel the scanning process. Examples: @@ -91,15 +93,15 @@ bluetooth.start_scan(10) # starts scanning and stop after 10 seconds bluetooth.start_scan(-1) # starts scanning indefinitely until bluetooth.stop_scan() is called ``` -#### bluetooth.stop\_scan\(\) +#### bluetooth.stop\_scan() Stops an ongoing scanning process. Returns `None`. -#### bluetooth.isscanning\(\) +#### bluetooth.isscanning() Returns `True` if a Bluetooth scan is in progress. `False` otherwise. -#### bluetooth.get\_adv\(\) +#### bluetooth.get\_adv() Gets an named tuple with the advertisement data received during the scanning. The tuple has the following structure: `(mac, addr_type, adv_type, rssi, data)` @@ -121,11 +123,11 @@ adv = bluetooth.get_adv() # ubinascii.hexlify(adv.mac) # convert hexadecimal to ascii ``` -#### bluetooth.get\_advertisements\(\) +#### bluetooth.get\_advertisements() Same as the `get_adv()` method, but this one returns a list with all the advertisements received. -#### bluetooth.resolve\_adv\_data\(data, data\_type\) +#### bluetooth.resolve\_adv\_data(data, data\_type) Parses the advertisement data and returns the requested `data_type` if present. If the data type is not present, the function returns `None`. @@ -155,16 +157,16 @@ while bluetooth.isscanning(): print(ubinascii.hexlify(mfg_data)) ``` -#### bluetooth.connect\(mac\_addr, timeout=None\) +#### bluetooth.connect(mac\_addr, timeout=None) * `mac_addr` is the address of the remote device to connect -* `timeout` specifies the amount of time in milliseconds to wait for the connection process to finish. If not given then no timeout is applied The function blocks until the connection succeeds or fails \(raises OSError\) or the given `timeout` expires \(raises `Bluetooth.timeout TimeoutError`\). If the connections succeeds it returns a object of type `GATTCConnection`. +* `timeout` specifies the amount of time in milliseconds to wait for the connection process to finish. If not given then no timeout is applied The function blocks until the connection succeeds or fails (raises OSError) or the given `timeout` expires (raises `Bluetooth.timeout TimeoutError`). If the connections succeeds it returns a object of type `GATTCConnection`. ```python bluetooth.connect('112233eeddff') # mac address is accepted as a string ``` -#### bluetooth.callback\(trigger=None, handler=None, arg=None\) +#### bluetooth.callback(trigger=None, handler=None, arg=None) Creates a callback that will be executed when any of the triggers occurs. The arguments are: @@ -174,7 +176,7 @@ Creates a callback that will be executed when any of the triggers occurs. The ar An example of how this may be used can be seen in the [`bluetooth.events()`](./#bluetooth-events) method. -#### bluetooth.events\(\) +#### bluetooth.events() Returns a value with bit flags identifying the events that have occurred since the last call. Calling this function clears the events. @@ -198,14 +200,14 @@ bluetooth.callback(trigger=Bluetooth.CLIENT_CONNECTED | Bluetooth.CLIENT_DISCONN bluetooth.advertise(True) ``` -#### bluetooth.set\_advertisement\(\* , name=None, manufacturer\_data=None, service\_data=None, service\_uuid=None\) +#### bluetooth.set\_advertisement(\* , name=None, manufacturer\_data=None, service\_data=None, service\_uuid=None) -Configure the data to be sent while advertising. If left with the default of `None` the data won’t be part of the advertisement message. +Configure the data to be sent while advertising. If left with the default of `None` the data won't be part of the advertisement message. The arguments are: * `name` is the string name to be shown on advertisements. -* `manufacturer_data` manufacturer data to be advertised \(hint: use it for iBeacons\). +* `manufacturer_data` manufacturer data to be advertised (hint: use it for iBeacons). * `service_data` service data to be advertised. * `service_uuid` uuid of the service to be advertised. @@ -215,11 +217,11 @@ Example: bluetooth.set_advertisement(name="advert", manufacturer_data="lopy_v1") ``` -#### bluetooth.advertise\(\[Enable\]\) +#### bluetooth.advertise(\[Enable\]) Start or stop sending advertisements. The `set_advertisement()` method must have been called prior to this one. -#### bluetooth.service\(uuid, \* , isprimary=True, nbr\_chars=1, start=True\) +#### bluetooth.service(uuid, \* , isprimary=True, nbr\_chars=1, start=True) Create a new service on the internal GATT server. Returns a object of type `BluetoothServerService`. @@ -234,7 +236,7 @@ The arguments are: bluetooth.service('abc123') ``` -#### bluetooth.disconnect\_client\(\) +#### bluetooth.disconnect\_client() Closes the BLE connection with the client. @@ -244,7 +246,7 @@ Closes the BLE connection with the client. * Advertisement type: `Bluetooth.CONN_ADV`, `Bluetooth.CONN_DIR_ADV`, `Bluetooth.DISC_ADV`, `Bluetooth.NON_CONN_ADV`, `Bluetooth.SCAN_RSP` * Address type: `Bluetooth.PUBLIC_ADDR`, `Bluetooth.RANDOM_ADDR`, `Bluetooth.PUBLIC_RPA_ADDR`, `Bluetooth.RANDOM_RPA_ADDR` * Advertisement data type: `Bluetooth.ADV_FLAG`, `Bluetooth.ADV_16SRV_PART`, `Bluetooth.ADV_T16SRV_CMPL`, `Bluetooth.ADV_32SRV_PART`, `Bluetooth.ADV_32SRV_CMPL`, `Bluetooth.ADV_128SRV_PART`, `Bluetooth.ADV_128SRV_CMPL`, `Bluetooth.ADV_NAME_SHORT`, `Bluetooth.ADV_NAME_CMPL`, `Bluetooth.ADV_TX_PWR`, `Bluetooth.ADV_DEV_CLASS`, `Bluetooth.ADV_SERVICE_DATA`, `Bluetooth.ADV_APPEARANCE`, `Bluetooth.ADV_ADV_INT`, `Bluetooth.ADV_32SERVICE_DATA`, `Bluetooth.ADV_128SERVICE_DATA`, `Bluetooth.ADV_MANUFACTURER_DATA` -* Characteristic properties \(bit values that can be combined\): `Bluetooth.PROP_BROADCAST`, `Bluetooth.PROP_READ`, `Bluetooth.PROP_WRITE_NR`, `Bluetooth.PROP_WRITE`, `Bluetooth.PROP_NOTIFY`, `Bluetooth.PROP_INDICATE`, `Bluetooth.PROP_AUTH`, `Bluetooth.PROP_EXT_PROP` +* Characteristic properties (bit values that can be combined): `Bluetooth.PROP_BROADCAST`, `Bluetooth.PROP_READ`, `Bluetooth.PROP_WRITE_NR`, `Bluetooth.PROP_WRITE`, `Bluetooth.PROP_NOTIFY`, `Bluetooth.PROP_INDICATE`, `Bluetooth.PROP_AUTH`, `Bluetooth.PROP_EXT_PROP` * Characteristic callback events: `Bluetooth.CHAR_READ_EVENT`, `Bluetooth.CHAR_WRITE_EVENT`, `Bluetooth.NEW_ADV_EVENT`, `Bluetooth.CLIENT_CONNECTED`, `Bluetooth.CLIENT_DISCONNECTED`, `Bluetooth.CHAR_NOTIFY_EVENT` * Antenna type: `Bluetooth.INT_ANT`, `Bluetooth.EXT_ANT` diff --git a/content/firmwareapi/pycom/network/bluetooth/gatt.md b/content/firmwareapi/pycom/network/bluetooth/gatt.md new file mode 100644 index 0000000..1262363 --- /dev/null +++ b/content/firmwareapi/pycom/network/bluetooth/gatt.md @@ -0,0 +1,13 @@ +--- +title: "GATT" +aliases: + - firmwareapi/pycom/network/bluetooth/gatt.html + - firmwareapi/pycom/network/bluetooth/gatt.md + - chapter/firmwareapi/pycom/network/bluetooth/gatt +--- +GATT stands for the Generic Attribute Profile and it defines the way that two Bluetooth Low Energy devices communicate between each other using concepts called Services and Characteristics. GATT uses a data protocol known as the Attribute Protocol (ATT), which is used to store/manage Services, Characteristics and related data in a lookup table. + +GATT comes into use once a connection is established between two devices, meaning that the device will have already gone through the advertising process managed by GAP. It's important to remember that this connection is exclusive; i.e. that only one client is connected to one server at a time. This means that the client will stop advertising once a connection has been made. This remains the case, until the connection is broken or disconnected. + +The GATT Server, which holds the ATT lookup data and service and characteristic definitions, and the GATT Client (the phone/tablet), which sends requests to this server. + diff --git a/firmwareapi/pycom/network/bluetooth/gattccharacteristic.md b/content/firmwareapi/pycom/network/bluetooth/gattccharacteristic.md similarity index 77% rename from firmwareapi/pycom/network/bluetooth/gattccharacteristic.md rename to content/firmwareapi/pycom/network/bluetooth/gattccharacteristic.md index ee45f23..5a855a1 100644 --- a/firmwareapi/pycom/network/bluetooth/gattccharacteristic.md +++ b/content/firmwareapi/pycom/network/bluetooth/gattccharacteristic.md @@ -1,32 +1,36 @@ -# GATTCCharacteristic - -The smallest concept in GATT is the Characteristic, which encapsulates a single data point \(though it may contain an array of related data, such as X/Y/Z values from a 3-axis accelerometer, longitude and latitude from a GPS, etc.\). +--- +title: "GATTCCharacteristic" +aliases: + - firmwareapi/pycom/network/bluetooth/gattccharacteristic.html + - firmwareapi/pycom/network/bluetooth/gattccharacteristic.md +--- +The smallest concept in GATT is the Characteristic, which encapsulates a single data point (though it may contain an array of related data, such as X/Y/Z values from a 3-axis accelerometer, longitude and latitude from a GPS, etc.). The following class allows you to manage characteristics from a Client. ## Methods -#### characteristic.uuid\(\) +#### characteristic.uuid() Returns the UUID of the service. In the case of 16-bit or 32-bit long UUIDs, the value returned is an integer, but for 128-bit long UUIDs the value returned is a bytes object. -#### characteristic.instance\(\) +#### characteristic.instance() Returns the instance ID of the service. -#### characteristic.properties\(\) +#### characteristic.properties() Returns an integer indicating the properties of the characteristic. Properties are represented by bit values that can be OR-ed together. See the constants section for more details. -#### characteristic.read\(\) +#### characteristic.read() Read the value of the characteristic, sending a request to the GATT server. Returns a bytes object representing the characteristic value. -#### characteristic.value\(\) +#### characteristic.value() Returns the locally stored value of the characteristic without sending a read request to the GATT server. If the characteristic value hasn't been read from the GATT server yet, the value returned will be 0. -#### characteristic.write\(value\) +#### characteristic.write(value) Writes the given value on the characteristic. For now it only accepts bytes object representing the value to be written. @@ -34,7 +38,7 @@ Writes the given value on the characteristic. For now it only accepts bytes obje characteristic.write(b'x0f') ``` -#### characteristic.callback\(trigger=None, handler=None, arg=None\) +#### characteristic.callback(trigger=None, handler=None, arg=None) This method allows to register for notifications on the characteristic. @@ -42,7 +46,7 @@ This method allows to register for notifications on the characteristic. * `handler` is the function that will be executed when the callback is triggered. * `arg` is the argument that gets passed to the callback. If nothing is given, the characteristic object that owns the callback will be used. -#### characteristic.read\_descriptor\(uuid\) +#### characteristic.read\_descriptor(uuid) Returns the value of the descriptor specified by the `uuid` parameter. If no descriptor found for the characteristic returns None. diff --git a/firmwareapi/pycom/network/bluetooth/gattcconnection.md b/content/firmwareapi/pycom/network/bluetooth/gattcconnection.md similarity index 59% rename from firmwareapi/pycom/network/bluetooth/gattcconnection.md rename to content/firmwareapi/pycom/network/bluetooth/gattcconnection.md index c4523e0..8468e42 100644 --- a/firmwareapi/pycom/network/bluetooth/gattcconnection.md +++ b/content/firmwareapi/pycom/network/bluetooth/gattcconnection.md @@ -1,14 +1,18 @@ -# GATTCConnection - -The GATT Client is the device that requests data from the server, otherwise known as the master device \(commonly this might be a phone/tablet/PC\). All transactions are initiated by the master, which receives a response from the slave. +--- +title: "GATTCConnection" +aliases: + - firmwareapi/pycom/network/bluetooth/gattcconnection.html + - firmwareapi/pycom/network/bluetooth/gattcconnection.md +--- +The GATT Client is the device that requests data from the server, otherwise known as the master device (commonly this might be a phone/tablet/PC). All transactions are initiated by the master, which receives a response from the slave. ## Methods -#### connection.disconnect\(\) +#### connection.disconnect() Closes the BLE connection. Returns `None`. -#### connection.isconnected\(\) +#### connection.isconnected() Returns `True` if the connection is still open. `False` otherwise. @@ -35,9 +39,9 @@ while True: print("Connected to device with addr = {}".format(ubinascii.hexlify(adv.mac))) ``` -#### connection.services\(\) +#### connection.services() -Performs a service search on the connected BLE peripheral \(server\) a returns a list containing objects of the class GATTCService if the search succeeds. +Performs a service search on the connected BLE peripheral (server) a returns a list containing objects of the class GATTCService if the search succeeds. Example: diff --git a/firmwareapi/pycom/network/bluetooth/gattccservice.md b/content/firmwareapi/pycom/network/bluetooth/gattccservice.md similarity index 73% rename from firmwareapi/pycom/network/bluetooth/gattccservice.md rename to content/firmwareapi/pycom/network/bluetooth/gattccservice.md index dd5b0b5..2eda1d7 100644 --- a/firmwareapi/pycom/network/bluetooth/gattccservice.md +++ b/content/firmwareapi/pycom/network/bluetooth/gattccservice.md @@ -1,24 +1,28 @@ -# GATTCService - +--- +title: "GATTCService" +aliases: + - firmwareapi/pycom/network/bluetooth/gattccservice.html + - firmwareapi/pycom/network/bluetooth/gattccservice.md +--- Services are used to categorise data up into specific chunks of data known as characteristics. A service may have multiple characteristics, and each service has a unique numeric ID called a UUID. The following class allows control over Client services. ## Methods -#### service.isprimary\(\) +#### service.isprimary() Returns `True` if the service is a primary one. `False` otherwise. -#### service.uuid\(\) +#### service.uuid() Returns the UUID of the service. In the case of 16-bit or 32-bit long UUIDs, the value returned is an integer, but for 128-bit long UUIDs the value returned is a bytes object. -#### service.instance\(\) +#### service.instance() Returns the instance ID of the service. -#### service.characteristics\(\) +#### service.characteristics() Performs a get characteristics request on the connected BLE peripheral a returns a list containing objects of the class GATTCCharacteristic if the request succeeds. diff --git a/firmwareapi/pycom/network/bluetooth/gattscharacteristic.md b/content/firmwareapi/pycom/network/bluetooth/gattscharacteristic.md similarity index 84% rename from firmwareapi/pycom/network/bluetooth/gattscharacteristic.md rename to content/firmwareapi/pycom/network/bluetooth/gattscharacteristic.md index a8f2b7e..57c3f8c 100644 --- a/firmwareapi/pycom/network/bluetooth/gattscharacteristic.md +++ b/content/firmwareapi/pycom/network/bluetooth/gattscharacteristic.md @@ -1,12 +1,16 @@ -# GATTSCharacteristic - -The smallest concept in GATT is the Characteristic, which encapsulates a single data point \(though it may contain an array of related data, such as X/Y/Z values from a 3-axis accelerometer, longitude and latitude from a GPS, etc.\). +--- +title: "GATTSCharacteristic" +aliases: + - firmwareapi/pycom/network/bluetooth/gattscharacteristic.html + - firmwareapi/pycom/network/bluetooth/gattscharacteristic.md +--- +The smallest concept in GATT is the Characteristic, which encapsulates a single data point (though it may contain an array of related data, such as X/Y/Z values from a 3-axis accelerometer, longitude and latitude from a GPS, etc.). The following class allows you to manage Server characteristics. ## Methods -#### characteristic.value\(\[value\]\) +#### characteristic.value(\[value\]) Gets or sets the value of the characteristic. Can take an integer, a string or a bytes object. @@ -15,7 +19,7 @@ characteristic.value(123) # set characteristic value to an integer with the valu characteristic.value() # get characteristic value ``` -#### characteristic.callback\(trigger=None, handler=None, arg=None\) +#### characteristic.callback(trigger=None, handler=None, arg=None) Creates a callback that will be executed when any of the triggers occurs. The arguments are: @@ -25,7 +29,7 @@ Creates a callback that will be executed when any of the triggers occurs. The ar An example of how this could be implemented can be seen in the [`characteristic.events()` ](gattscharacteristic.md#characteristic-events)section. -#### characteristic.events\(\) +#### characteristic.events() Returns a value with bit flags identifying the events that have occurred since the last call. Calling this function clears the events. diff --git a/firmwareapi/pycom/network/bluetooth/gattsservice.md b/content/firmwareapi/pycom/network/bluetooth/gattsservice.md similarity index 77% rename from firmwareapi/pycom/network/bluetooth/gattsservice.md rename to content/firmwareapi/pycom/network/bluetooth/gattsservice.md index 31ec57c..a90095f 100644 --- a/firmwareapi/pycom/network/bluetooth/gattsservice.md +++ b/content/firmwareapi/pycom/network/bluetooth/gattsservice.md @@ -1,5 +1,10 @@ -# GATTSService - +--- +title: "GATTSService" +aliases: + - firmwareapi/pycom/network/bluetooth/gattsservice.html + - firmwareapi/pycom/network/bluetooth/gattsservice.md + - chapter/firmwareapi/pycom/network/bluetooth/gattsservice +--- The GATT Server allows the device to act as a peripheral and hold its own ATT lookup data, server & characteristic definitions. In this mode, the device acts as a slave and a master must initiate a request. Services are used to categorise data up into specific chunks of data known as characteristics. A service may have multiple characteristics, and each service has a unique numeric ID called a UUID. @@ -8,15 +13,15 @@ The following class allows control over Server services. ## Methods -#### service.start\(\) +#### service.start() Starts the service if not already started. -#### service.stop\(\) +#### service.stop() Stops the service if previously started. -#### service.characteristic\(uuid, \* , permissions, properties, value\) +#### service.characteristic(uuid, \* , permissions, properties, value) Creates a new characteristic on the service. Returns an object of the class `GATTSCharacteristic`. The arguments are: diff --git a/firmwareapi/pycom/network/lora/README.md b/content/firmwareapi/pycom/network/lora/README.md similarity index 70% rename from firmwareapi/pycom/network/lora/README.md rename to content/firmwareapi/pycom/network/lora/README.md index 567de7f..9610c27 100644 --- a/firmwareapi/pycom/network/lora/README.md +++ b/content/firmwareapi/pycom/network/lora/README.md @@ -1,5 +1,7 @@ -# LoRa - +--- +title: "LoRa" +aliases: +--- This class provides a LoRaWAN 1.0.2 compliant driver for the LoRa network processor in the LoPy and FiPy. Below is an example demonstrating LoRaWAN Activation by Personalisation usage: ```python @@ -41,9 +43,9 @@ data = s.recv(64) print(data) ``` -{% hint style="danger" %} -Please ensure that there is an antenna connected to your device before sending/receiving LoRa messages as improper use \(e.g. without an antenna\), may damage the device. -{% endhint %} +{{{% hint style="danger" %}}} +Please ensure that there is an antenna connected to your device before sending/receiving LoRa messages as improper use (e.g. without an antenna), may damage the device. +{{< /hint >}} ## Additional Examples @@ -51,7 +53,7 @@ For various other complete LoRa examples, check here for additional examples. ## Constructors -#### class network.LoRa\(id=0, ...\) +#### class network.LoRa(id=0, ...) Create and configure a LoRa object. See init for params of configuration. @@ -61,7 +63,7 @@ lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) ## Methods -#### lora.init\(mode, \* ,region=LoRa.EU868, frequency=868000000, tx\_power=14, bandwidth=LoRa.BW\_125KHZ, sf=7, preamble=8, coding\_rate=LoRa.CODING\_4\_5, power\_mode=LoRa.ALWAYS\_ON, tx\_iq=False, rx\_iq=False, adr=False, public=True, tx\_retries=1, device\_class=LoRa.CLASS\_A\) +#### lora.init(mode, \* ,region=LoRa.EU868, frequency=868000000, tx\_power=14, bandwidth=LoRa.BW\_125KHZ, sf=7, preamble=8, coding\_rate=LoRa.CODING\_4\_5, power\_mode=LoRa.ALWAYS\_ON, tx\_iq=False, rx\_iq=False, adr=False, public=True, tx\_retries=1, device\_class=LoRa.CLASS\_A) This method is used to set the LoRa subsystem configuration and to specific raw LoRa or LoRaWAN. @@ -75,7 +77,7 @@ The arguments are: * `sf` sets the desired spreading factor. Accepts values between 7 and 12. * `preamble` configures the number of pre-amble symbols. The default value is 8. * `coding_rate` can take the following values: `LoRa.CODING_4_5`, `LoRa.CODING_4_6`, `LoRa.CODING_4_7` or `LoRa.CODING_4_8`. -* `power_mode` can be either `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY` or `LoRa.SLEEP`. In `ALWAYS_ON` mode, the radio is always listening for incoming - packets whenever a transmission is not taking place. In `TX_ONLY` the radio goes to sleep as soon as the transmission completes. In `SLEEP` mode the radio is sent to sleep permanently and won’t accept any commands until the power mode is changed. +* `power_mode` can be either `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY` or `LoRa.SLEEP`. In `ALWAYS_ON` mode, the radio is always listening for incoming - packets whenever a transmission is not taking place. In `TX_ONLY` the radio goes to sleep as soon as the transmission completes. In `SLEEP` mode the radio is sent to sleep permanently and won't accept any commands until the power mode is changed. * `tx_iq` enables TX IQ inversion. * `rx_iq` enables RX IQ inversion. * `adr` enables Adaptive Data Rate. @@ -83,9 +85,9 @@ The arguments are: * `tx_retries` sets the number of TX retries in `LoRa.LORAWAN` mode. * `device_class` sets the LoRaWAN device class. Can be either `LoRa.CLASS_A` or `LoRa.CLASS_C`. -{% hint style="info" %} +{{{% hint style="info" %}}} In `LoRa.LORAWAN` mode, only `adr`, `public`, `tx_retries` and `device_class` are used. All the other params will be ignored as they are handled by the LoRaWAN stack directly. On the other hand, in `LoRa.LORA` mode from those 4 arguments, only the public one is important in order to program the sync word. In `LoRa.LORA` mode `adr`, `tx_retries` and `device_class` are ignored since they are only relevant to the LoRaWAN stack. -{% endhint %} +{{< /hint >}} For example, you can do: @@ -101,7 +103,7 @@ or lora.init(mode=LoRa.LORAWAN) ``` -#### lora.join\(activation, auth, \* ,timeout=None, dr=None\) +#### lora.join(activation, auth, \* ,timeout=None, dr=None) Join a LoRaWAN network. Internally the stack will automatically retry every 15 seconds until a Join Accept message is received. @@ -109,7 +111,7 @@ The parameters are: * `activation`: can be either `LoRa.OTAA` or `LoRa.ABP`. * `auth`: is a tuple with the authentication data. -* `timeout`: is the maximum time in milliseconds to wait for the Join Accept message to be received. If no timeout \(or zero\) is given, the call returns immediately and the status of the join request can be checked with `lora.has_joined()`. +* `timeout`: is the maximum time in milliseconds to wait for the Join Accept message to be received. If no timeout (or zero) is given, the call returns immediately and the status of the join request can be checked with `lora.has_joined()`. * `dr`: is an optional value to specify the initial data rate for the Join Request. Possible values are 0 to 5 for **EU868**, or 0 to 4 for **US915**. In the case of `LoRa.OTAA` the authentication tuple is: `(dev_eui, app_eui, app_key)` where `dev_eui` is optional. If it is not provided the LoRa MAC will be used. Therefore, you can do OTAA in 2 different ways: @@ -178,9 +180,9 @@ app_swkey = ubinascii.unhexlify('2B7E151628AED2A6ABF7158809CF4F3C') lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey)) ``` -#### lora.bandwidth\(\[bandwidth\]\) +#### lora.bandwidth(\[bandwidth\]) -Get or set the bandwidth in raw LoRa mode \(`LoRa.LORA`\). Can be either `LoRa.BW_125KHZ` \(0\), `LoRa.BW_250KHZ` \(1\) or `LoRa.BW_500KHZ` \(2\): +Get or set the bandwidth in raw LoRa mode (`LoRa.LORA`). Can be either `LoRa.BW_125KHZ` (0), `LoRa.BW_250KHZ` (1) or `LoRa.BW_500KHZ` (2): ```python # get raw LoRa Bandwidth @@ -190,9 +192,9 @@ lora.bandwidth() lora.bandwidth(LoRa.BW_125KHZ) ``` -#### lora.frequency\(\[frequency\]\) +#### lora.frequency(\[frequency\]) -Get or set the frequency in raw LoRa mode \(`LoRa.LORA`\). The allowed range is between `863000000` and `870000000` Hz for the 868 MHz band version or between `902000000` and `928000000` Hz for the 915 MHz band version. +Get or set the frequency in raw LoRa mode (`LoRa.LORA`). The allowed range is between `863000000` and `870000000` Hz for the 868 MHz band version or between `902000000` and `928000000` Hz for the 915 MHz band version. ```python # get raw LoRa Frequency @@ -202,9 +204,9 @@ lora.frequency() lora.frequency(868000000) ``` -#### lora.coding\_rate\(\[coding\_rate\]\) +#### lora.coding\_rate(\[coding\_rate\]) -Get or set the coding rate in raw LoRa mode \(`LoRa.LORA`\). The allowed values are: `LoRa.CODING_4_5` \(1\), `LoRa.CODING_4_6` \(2\), `LoRa.CODING_4_7` \(3\) and `LoRa.CODING_4_8` \(4\). +Get or set the coding rate in raw LoRa mode (`LoRa.LORA`). The allowed values are: `LoRa.CODING_4_5` (1), `LoRa.CODING_4_6` (2), `LoRa.CODING_4_7` (3) and `LoRa.CODING_4_8` (4). ```python # get raw LoRa Coding Rate @@ -214,9 +216,9 @@ lora.coding_rate() lora.coding_rate(LoRa.CODING_4_5) ``` -#### lora.preamble\(\[preamble\]\) +#### lora.preamble(\[preamble\]) -Get or set the number of preamble symbols in raw LoRa mode \(`LoRa.LORA`\): +Get or set the number of preamble symbols in raw LoRa mode (`LoRa.LORA`): ```python # get raw LoRa preamble symbols @@ -226,9 +228,9 @@ lora.preamble() lora.preamble(LoRa.CODING_4_5) ``` -#### lora.sf\(\[sf\]\) +#### lora.sf(\[sf\]) -Get or set the spreading factor value in raw LoRa mode \(`LoRa.LORA`\). The minimum value is 7 and the maximum is 12: +Get or set the spreading factor value in raw LoRa mode (`LoRa.LORA`). The minimum value is 7 and the maximum is 12: ```python # get raw LoRa spread factor value @@ -238,11 +240,11 @@ lora.sf() lora.sf(7) ``` -#### lora.power\_mode\(\[power\_mode\]\) +#### lora.power\_mode(\[power\_mode\]) -Get or set the power mode in raw LoRa mode \(`LoRa.LORA`\). The accepted values are: `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY`, and `LoRa.SLEEP`: +Get or set the power mode in raw LoRa mode (`LoRa.LORA`). The accepted values are: `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY`, and `LoRa.SLEEP`: -#### lora.stats\(\) +#### lora.stats() Return a named tuple with useful information from the last received LoRa or LoRaWAN packet. The named tuple has the following form: @@ -258,29 +260,29 @@ Where: * `rx_timestamp` is an internal timestamp of the last received packet with microseconds precision. * `rssi` holds the received signal strength in dBm. -* `snr` contains the signal to noise ratio id dB \(as a single precision float\). -* `sfrx` tells the data rate \(in the case of LORAWAN mode\) or the spreading factor \(in the case of LORA mode\) of the last packet received. -* `sftx` tells the data rate \(in the case of LORAWAN mode\) or the spreading factor \(in the case of LORA mode\) of the last packet transmitted. -* `tx_trials` is the number of tx attempts of the last transmitted packet \(only relevant for LORAWAN confirmed packets\). -* `tx_power` is the power of the last transmission \(in dBm\). -* `tx_time_on_air` is the time on air of the last transmitted packet \(in ms\). +* `snr` contains the signal to noise ratio id dB (as a single precision float). +* `sfrx` tells the data rate (in the case of LORAWAN mode) or the spreading factor (in the case of LORA mode) of the last packet received. +* `sftx` tells the data rate (in the case of LORAWAN mode) or the spreading factor (in the case of LORA mode) of the last packet transmitted. +* `tx_trials` is the number of tx attempts of the last transmitted packet (only relevant for LORAWAN confirmed packets). +* `tx_power` is the power of the last transmission (in dBm). +* `tx_time_on_air` is the time on air of the last transmitted packet (in ms). * `tx_counter` is the number of packets transmitted. * `tx_frequency` is the frequency used for the last transmission. -#### lora.has\_joined\(\) +#### lora.has\_joined() Returns `True` if a LoRaWAN network has been joined. `False` otherwise. -#### lora.add\_channel\(index, \* , frequency, dr\_min, dr\_max\) +#### lora.add\_channel(index, \* , frequency, dr\_min, dr\_max) -Add a LoRaWAN channel on the specified `index`. If there’s already a channel with that index it will be replaced with the new one. +Add a LoRaWAN channel on the specified `index`. If there's already a channel with that index it will be replaced with the new one. The arguments are: * `index`: Index of the channel to add. Accepts values between 0 and 15 for EU and between 0 and 71 for US. * `frequency`: Centre frequency in Hz of the channel. -* `dr_min`: Minimum data rate of the channel \(0-7\). -* `dr_max`: Maximum data rate of the channel \(0-7\). +* `dr_min`: Minimum data rate of the channel (0-7). +* `dr_max`: Maximum data rate of the channel (0-7). Examples: @@ -288,7 +290,7 @@ Examples: lora.add_channel(index=0, frequency=868000000, dr_min=5, dr_max=6) ``` -#### lora.remove\_channel\(index\) +#### lora.remove\_channel(index) Removes the channel from the specified `index`. On the 868MHz band the channels 0 to 2 cannot be removed, they can only be replaced by other channels using the `lora.add_channel` method. A way to remove all channels except for one is to add the same channel, 3 times on indexes 0, 1 and 2. An example can be seen below: @@ -298,19 +300,19 @@ lora.remove_channel() On the 915MHz band there are no restrictions around this. -#### lora.mac\(\) +#### lora.mac() Returns a byte object with the 8-Byte MAC address of the LoRa radio. -#### lora.callback\(trigger, handler=None, arg=None\) +#### lora.callback(trigger, handler=None, arg=None) Specify a callback handler for the LoRa radio. The `trigger` types are `LoRa.RX_PACKET_EVENT`, `LoRa.TX_PACKET_EVENT`, and `LoRa.TX_FAILED_EVENT` -The `LoRa.RX_PACKET_EVENT` event is raised for every received packet. The `LoRa.TX_PACKET_EVENT` event is raised as soon as the packet transmission cycle ends, which includes the end of the receive windows \(even if a downlink is received, the `LoRa.TX_PACKET_EVENT` will come last\). In the case of non-confirmed transmissions, this will occur at the end of the receive windows, but, in the case of confirmed transmissions, this event will only be raised if the `ack` is received. If the `ack` is not received `LoRa.TX_FAILED_EVENT` will be raised after the number of `tx_retries` configured have been performed. +The `LoRa.RX_PACKET_EVENT` event is raised for every received packet. The `LoRa.TX_PACKET_EVENT` event is raised as soon as the packet transmission cycle ends, which includes the end of the receive windows (even if a downlink is received, the `LoRa.TX_PACKET_EVENT` will come last). In the case of non-confirmed transmissions, this will occur at the end of the receive windows, but, in the case of confirmed transmissions, this event will only be raised if the `ack` is received. If the `ack` is not received `LoRa.TX_FAILED_EVENT` will be raised after the number of `tx_retries` configured have been performed. An example of how this callback functions can be seen the in method [`lora.events()`](lora.md#lora-events). -#### lora.ischannel\_free\(rssi\_threshold\) +#### lora.ischannel\_free(rssi\_threshold) This method is used to check for radio activity on the current LoRa channel, and if the `rssi` of the measured activity is lower than the `rssi_threshold` given, the return value will be `True`, otherwise `False`. Example: @@ -318,7 +320,7 @@ This method is used to check for radio activity on the current LoRa channel, and lora.ischannel_free(-100) ``` -#### lora.set\_battery\_level\(level\) +#### lora.set\_battery\_level(level) Set the battery level value that will be sent when the LoRaWAN MAC command that retrieves the battery level is received. This command is sent by the network and handled automatically by the LoRaWAN stack. The values should be according to the LoRaWAN specification: @@ -330,9 +332,9 @@ Set the battery level value that will be sent when the LoRaWAN MAC command that lora.set_battery_level(127) # 50% battery ``` -#### lora.events\(\) +#### lora.events() -This method returns a value with bits sets \(if any\) indicating the events that have triggered the callback. Please note that by calling this function the internal events registry is cleared automatically, therefore calling it immediately for a second time will most likely return a value of 0. +This method returns a value with bits sets (if any) indicating the events that have triggered the callback. Please note that by calling this function the internal events registry is cleared automatically, therefore calling it immediately for a second time will most likely return a value of 0. Example: @@ -347,39 +349,39 @@ def lora_cb(lora): lora.callback(trigger=(LoRa.RX_PACKET_EVENT | LoRa.TX_PACKET_EVENT), handler=lora_cb) ``` -#### lora.nvram\_save\(\) +#### lora.nvram\_save() -Save the LoRaWAN state \(joined status, network keys, packet counters, etc\) in non-volatile memory in order to be able to restore the state when coming out of deepsleep or a power cycle. +Save the LoRaWAN state (joined status, network keys, packet counters, etc) in non-volatile memory in order to be able to restore the state when coming out of deepsleep or a power cycle. ```python lora.nvram_save() ``` -#### lora.nvram\_restore\(\) +#### lora.nvram\_restore() -Restore the LoRaWAN state \(joined status, network keys, packet counters, etc\) from non-volatile memory. State must have been previously stored with a call to `nvram_save` before entering deepsleep. This is useful to be able to send a LoRaWAN message immediately after coming out of deepsleep without having to join the network again. This can only be used if the current region matches the one saved. +Restore the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. State must have been previously stored with a call to `nvram_save` before entering deepsleep. This is useful to be able to send a LoRaWAN message immediately after coming out of deepsleep without having to join the network again. This can only be used if the current region matches the one saved. ```python lora.nvram_restore() ``` -#### lora.nvram\_erase\(\) +#### lora.nvram\_erase() -Remove the LoRaWAN state \(joined status, network keys, packet counters, etc\) from non-volatile memory. +Remove the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. ```python lora.nvram_erase() ``` -#### lora.nvram\_erase\(\) +#### lora.nvram\_erase() -Remove the LoRaWAN state \(joined status, network keys, packet counters, etc\) from non-volatile memory. +Remove the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. ```python lora.nvram_erase() ``` -#### lora.mesh\(\) +#### lora.mesh() Enable the Mesh network. Only after Mesh enabling the `lora.cli()` and `socket` can be used. @@ -387,9 +389,9 @@ Enable the Mesh network. Only after Mesh enabling the `lora.cli()` and `socket` lora.mesh() ``` -#### lora.cli\(\) +#### lora.cli() -Send OpenThread CLI commands, the list is [here](https://github.com/openthread/openthread/blob/master/src/cli/README.md). The output is multiline string, having as line-endings the `\r\n`. +Send OpenThread CLI commands, the list is [here](https://github.com/openthread/openthread/blob/master/src/cli/README). The output is multiline string, having as line-endings the `\r\n`. ```bash >>> print(lora.cli("ipaddr")) @@ -406,7 +408,7 @@ fe80:0:0:0:2c97:cb65:3219:c86 * Raw LoRa power mode: `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY`, `LoRa.SLEEP` * Raw LoRa bandwidth: `LoRa.BW_125KHZ`, `LoRa.BW_250KHZ`, `LoRa.BW_500KHZ` * Raw LoRa coding rate: `LoRa.CODING_4_5`, `LoRa.CODING_4_6`, `LoRa.CODING_4_7`, `LoRa.CODING_4_8` -* Callback trigger types \(may be ORed\): `LoRa.RX_PACKET_EVENT`, `LoRa.TX_PACKET_EVENT`, `LoRa.TX_FAILED_EVENT` +* Callback trigger types (may be ORed): `LoRa.RX_PACKET_EVENT`, `LoRa.TX_PACKET_EVENT`, `LoRa.TX_FAILED_EVENT` * LoRaWAN device class: `LoRa.CLASS_A`, `LoRa.CLASS_C` * LoRaWAN regions: `LoRa.AS923`, `LoRa.AU915`, `LoRa.EU868`, `LoRa.US915` @@ -425,15 +427,15 @@ s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) And they must be created after initialising the LoRa network card. -LoRa-Mesh socket is created, if the Mesh was enabled before \(`lora.mesh()` was called\). +LoRa-Mesh socket is created, if the Mesh was enabled before (`lora.mesh()` was called). -{% hint style="info" %} +{{{% hint style="info" %}}} The LoRa-Mesh socket supports only the following socket methods: `close()` , `bind()`, `sendto()`, and `recvfrom()`. -{% endhint %} +{{< /hint >}} LoRa sockets support the following standard methods from the socket module: -#### socket.close\(\) +#### socket.close() Usage: @@ -441,7 +443,7 @@ Usage: s.close() ``` -#### socket.bind\(port\_number\) +#### socket.bind(port\_number) Usage: @@ -449,11 +451,11 @@ Usage: s.bind(1) ``` -{% hint style="info" %} +{{{% hint style="info" %}}} The `bind()` method is only applicable when the radio is configured in `LoRa.LORAWAN` mode. -{% endhint %} +{{< /hint >}} -#### socket.send\(bytes\) +#### socket.send(bytes) Usage: @@ -467,7 +469,7 @@ or s.send('Hello') ``` -#### socket.sendto\(bytes,\(ip, port\)\) +#### socket.sendto(bytes,(ip, port)) This is supported only by the LoRa Mesh socket. @@ -477,7 +479,7 @@ Usage: s.sendto('Hello', ('fdde:ad00:beef:0:0:ff:fe00:e800', 1234)) ``` -#### socket.recv\(bufsize\) +#### socket.recv(bufsize) Usage: @@ -485,7 +487,7 @@ Usage: s.recv(128) ``` -#### socket.recvfrom\(bufsize\) +#### socket.recvfrom(bufsize) This method is useful to know the destination port number of the message received. Returns a tuple of the form: `(data, port)` @@ -495,9 +497,9 @@ Usage: s.recvfrom(128) ``` -#### socket.setsockopt\(level, optname, value\) +#### socket.setsockopt(level, optname, value) -Set the value of the given socket option. The needed symbolic constants are defined in the socket module \(`SO_*` etc.\). In the case of LoRa the values are always integers. Examples: +Set the value of the given socket option. The needed symbolic constants are defined in the socket module (`SO_*` etc.). In the case of LoRa the values are always integers. Examples: ```python # configuring the data rate @@ -510,11 +512,11 @@ s.setsockopt(socket.SOL_LORA, socket.SO_CONFIRMED, False) s.setsockopt(socket.SOL_LORA, socket.SO_CONFIRMED, True) ``` -{% hint style="info" %} +{{{% hint style="info" %}}} Socket options are only applicable when the LoRa radio is used in LoRa.LORAWAN mode. When using the radio in LoRa.LORA mode, use the class methods to change the spreading factor, bandwidth and coding rate to the desired values. -{% endhint %} +{{< /hint >}} -#### socket.settimeout\(value\) +#### socket.settimeout(value) Sets the socket timeout value in seconds. Accepts floating point values. @@ -524,7 +526,7 @@ Usage: s.settimeout(5.5) ``` -#### socket.setblocking\(flag\) +#### socket.setblocking(flag) Usage: diff --git a/content/firmwareapi/pycom/network/lora/_index.md b/content/firmwareapi/pycom/network/lora/_index.md new file mode 100644 index 0000000..9610c27 --- /dev/null +++ b/content/firmwareapi/pycom/network/lora/_index.md @@ -0,0 +1,536 @@ +--- +title: "LoRa" +aliases: +--- +This class provides a LoRaWAN 1.0.2 compliant driver for the LoRa network processor in the LoPy and FiPy. Below is an example demonstrating LoRaWAN Activation by Personalisation usage: + +```python +from network import LoRa +import socket +import ubinascii +import struct + +# Initialise LoRa in LORAWAN mode. +# Please pick the region that matches where you are using the device: +# Asia = LoRa.AS923 +# Australia = LoRa.AU915 +# Europe = LoRa.EU868 +# United States = LoRa.US915 +lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) + +# create an ABP authentication params +dev_addr = struct.unpack(">l", binascii.unhexlify('00000005'))[0] +nwk_swkey = ubinascii.unhexlify('2B7E151628AED2A6ABF7158809CF4F3C') +app_swkey = ubinascii.unhexlify('2B7E151628AED2A6ABF7158809CF4F3C') + +# join a network using ABP (Activation By Personalisation) +lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey)) + +# create a LoRa socket +s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) + +# set the LoRaWAN data rate +s.setsockopt(socket.SOL_LORA, socket.SO_DR, 5) + +# make the socket non-blocking +s.setblocking(False) + +# send some data +s.send(bytes([0x01, 0x02, 0x03])) + +# get any data received... +data = s.recv(64) +print(data) +``` + +{{{% hint style="danger" %}}} +Please ensure that there is an antenna connected to your device before sending/receiving LoRa messages as improper use (e.g. without an antenna), may damage the device. +{{< /hint >}} + +## Additional Examples + +For various other complete LoRa examples, check here for additional examples. + +## Constructors + +#### class network.LoRa(id=0, ...) + +Create and configure a LoRa object. See init for params of configuration. + +```python +lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) +``` + +## Methods + +#### lora.init(mode, \* ,region=LoRa.EU868, frequency=868000000, tx\_power=14, bandwidth=LoRa.BW\_125KHZ, sf=7, preamble=8, coding\_rate=LoRa.CODING\_4\_5, power\_mode=LoRa.ALWAYS\_ON, tx\_iq=False, rx\_iq=False, adr=False, public=True, tx\_retries=1, device\_class=LoRa.CLASS\_A) + +This method is used to set the LoRa subsystem configuration and to specific raw LoRa or LoRaWAN. + +The arguments are: + +* `mode` can be either `LoRa.LORA` or `LoRa.LORAWAN`. +* `region` can take the following values: `LoRa.AS923`, `LoRa.AU915`, `LoRa.EU868` or `LoRa.US915`. If not provided this will default to `LoRaEU868`. If they are not specified, this will also set appropriate defaults for `frequency` and `tx_power`. +* `frequency` accepts values between `863000000` and `870000000` in the 868 band, or between `902000000` and `928000000` in the 915 band. +* `tx_power` is the transmit power in dBm. It accepts between 2 and 14 for the 868 band, and between 5 and 20 in the 915 band. +* `bandwidth` is the channel bandwidth in KHz. In the 868 band the accepted values are `LoRa.BW_125KHZ` and `LoRa.BW_250KHZ`. In the 915 band the accepted values are `LoRa.BW_125KHZ` and `LoRa.BW_500KHZ`. +* `sf` sets the desired spreading factor. Accepts values between 7 and 12. +* `preamble` configures the number of pre-amble symbols. The default value is 8. +* `coding_rate` can take the following values: `LoRa.CODING_4_5`, `LoRa.CODING_4_6`, `LoRa.CODING_4_7` or `LoRa.CODING_4_8`. +* `power_mode` can be either `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY` or `LoRa.SLEEP`. In `ALWAYS_ON` mode, the radio is always listening for incoming - packets whenever a transmission is not taking place. In `TX_ONLY` the radio goes to sleep as soon as the transmission completes. In `SLEEP` mode the radio is sent to sleep permanently and won't accept any commands until the power mode is changed. +* `tx_iq` enables TX IQ inversion. +* `rx_iq` enables RX IQ inversion. +* `adr` enables Adaptive Data Rate. +* `public` selects between the public and private sync word. +* `tx_retries` sets the number of TX retries in `LoRa.LORAWAN` mode. +* `device_class` sets the LoRaWAN device class. Can be either `LoRa.CLASS_A` or `LoRa.CLASS_C`. + +{{{% hint style="info" %}}} +In `LoRa.LORAWAN` mode, only `adr`, `public`, `tx_retries` and `device_class` are used. All the other params will be ignored as they are handled by the LoRaWAN stack directly. On the other hand, in `LoRa.LORA` mode from those 4 arguments, only the public one is important in order to program the sync word. In `LoRa.LORA` mode `adr`, `tx_retries` and `device_class` are ignored since they are only relevant to the LoRaWAN stack. +{{< /hint >}} + +For example, you can do: + +```python +# initialize in raw LoRa mode +lora.init(mode=LoRa.LORA, tx_power=14, sf=12) +``` + +or + +```python +# initialize in LoRaWAN mode +lora.init(mode=LoRa.LORAWAN) +``` + +#### lora.join(activation, auth, \* ,timeout=None, dr=None) + +Join a LoRaWAN network. Internally the stack will automatically retry every 15 seconds until a Join Accept message is received. + +The parameters are: + +* `activation`: can be either `LoRa.OTAA` or `LoRa.ABP`. +* `auth`: is a tuple with the authentication data. +* `timeout`: is the maximum time in milliseconds to wait for the Join Accept message to be received. If no timeout (or zero) is given, the call returns immediately and the status of the join request can be checked with `lora.has_joined()`. +* `dr`: is an optional value to specify the initial data rate for the Join Request. Possible values are 0 to 5 for **EU868**, or 0 to 4 for **US915**. + +In the case of `LoRa.OTAA` the authentication tuple is: `(dev_eui, app_eui, app_key)` where `dev_eui` is optional. If it is not provided the LoRa MAC will be used. Therefore, you can do OTAA in 2 different ways: + +```python +lora.join(activation=LoRa.OTAA, auth=(app_eui, app_key), timeout=0) # the device MAC address is used as DEV_EUI +``` + +or + +```python +lora.join(activation=LoRa.OTAA, auth=(dev_eui, app_eui, app_key), timeout=0) # a custom DEV_EUI is specified +``` + +Example: + +```python +from network import LoRa +import socket +import time +import ubinascii + +# Initialise LoRa in LORAWAN mode. +# Please pick the region that matches where you are using the device: +# Asia = LoRa.AS923 +# Australia = LoRa.AU915 +# Europe = LoRa.EU868 +# United States = LoRa.US915 +lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) + +# create an OTAA authentication parameters +app_eui = ubinascii.unhexlify('ADA4DAE3AC12676B') +app_key = ubinascii.unhexlify('11B0282A189B75B0B4D2D8C7FA38548B') + +# join a network using OTAA (Over the Air Activation) +lora.join(activation=LoRa.OTAA, auth=(app_eui, app_key), timeout=0) + +# wait until the module has joined the network +while not lora.has_joined(): + time.sleep(2.5) + print('Not yet joined...') +``` + +In the case of `LoRa.ABP` the authentication tuple is: `(dev_addr, nwk_swkey, app_swkey)`. Example: + +```python +from network import LoRa +import socket +import ubinascii +import struct + +# Initialise LoRa in LORAWAN mode. +# Please pick the region that matches where you are using the device: +# Asia = LoRa.AS923 +# Australia = LoRa.AU915 +# Europe = LoRa.EU868 +# United States = LoRa.US915 +lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) + +# create an ABP authentication params +dev_addr = struct.unpack(">l", ubinascii.unhexlify('00000005'))[0] +nwk_swkey = ubinascii.unhexlify('2B7E151628AED2A6ABF7158809CF4F3C') +app_swkey = ubinascii.unhexlify('2B7E151628AED2A6ABF7158809CF4F3C') + +# join a network using ABP (Activation By Personalisation) +lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey)) +``` + +#### lora.bandwidth(\[bandwidth\]) + +Get or set the bandwidth in raw LoRa mode (`LoRa.LORA`). Can be either `LoRa.BW_125KHZ` (0), `LoRa.BW_250KHZ` (1) or `LoRa.BW_500KHZ` (2): + +```python +# get raw LoRa Bandwidth +lora.bandwidth() + +# set raw LoRa Bandwidth +lora.bandwidth(LoRa.BW_125KHZ) +``` + +#### lora.frequency(\[frequency\]) + +Get or set the frequency in raw LoRa mode (`LoRa.LORA`). The allowed range is between `863000000` and `870000000` Hz for the 868 MHz band version or between `902000000` and `928000000` Hz for the 915 MHz band version. + +```python +# get raw LoRa Frequency +lora.frequency() + +# set raw LoRa Frequency +lora.frequency(868000000) +``` + +#### lora.coding\_rate(\[coding\_rate\]) + +Get or set the coding rate in raw LoRa mode (`LoRa.LORA`). The allowed values are: `LoRa.CODING_4_5` (1), `LoRa.CODING_4_6` (2), `LoRa.CODING_4_7` (3) and `LoRa.CODING_4_8` (4). + +```python +# get raw LoRa Coding Rate +lora.coding_rate() + +# set raw LoRa Coding Rate +lora.coding_rate(LoRa.CODING_4_5) +``` + +#### lora.preamble(\[preamble\]) + +Get or set the number of preamble symbols in raw LoRa mode (`LoRa.LORA`): + +```python +# get raw LoRa preamble symbols +lora.preamble() + +# set raw LoRa preamble symbols +lora.preamble(LoRa.CODING_4_5) +``` + +#### lora.sf(\[sf\]) + +Get or set the spreading factor value in raw LoRa mode (`LoRa.LORA`). The minimum value is 7 and the maximum is 12: + +```python +# get raw LoRa spread factor value +lora.sf() + +# set raw LoRa spread factor value +lora.sf(7) +``` + +#### lora.power\_mode(\[power\_mode\]) + +Get or set the power mode in raw LoRa mode (`LoRa.LORA`). The accepted values are: `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY`, and `LoRa.SLEEP`: + +#### lora.stats() + +Return a named tuple with useful information from the last received LoRa or LoRaWAN packet. The named tuple has the following form: + +`(rx_timestamp, rssi, snr, sftx, sfrx, tx_trials, tx_power, tx_time_on_air, tx_counter, tx_frequency)` + +Example: + +```python +lora.stats() +``` + +Where: + +* `rx_timestamp` is an internal timestamp of the last received packet with microseconds precision. +* `rssi` holds the received signal strength in dBm. +* `snr` contains the signal to noise ratio id dB (as a single precision float). +* `sfrx` tells the data rate (in the case of LORAWAN mode) or the spreading factor (in the case of LORA mode) of the last packet received. +* `sftx` tells the data rate (in the case of LORAWAN mode) or the spreading factor (in the case of LORA mode) of the last packet transmitted. +* `tx_trials` is the number of tx attempts of the last transmitted packet (only relevant for LORAWAN confirmed packets). +* `tx_power` is the power of the last transmission (in dBm). +* `tx_time_on_air` is the time on air of the last transmitted packet (in ms). +* `tx_counter` is the number of packets transmitted. +* `tx_frequency` is the frequency used for the last transmission. + +#### lora.has\_joined() + +Returns `True` if a LoRaWAN network has been joined. `False` otherwise. + +#### lora.add\_channel(index, \* , frequency, dr\_min, dr\_max) + +Add a LoRaWAN channel on the specified `index`. If there's already a channel with that index it will be replaced with the new one. + +The arguments are: + +* `index`: Index of the channel to add. Accepts values between 0 and 15 for EU and between 0 and 71 for US. +* `frequency`: Centre frequency in Hz of the channel. +* `dr_min`: Minimum data rate of the channel (0-7). +* `dr_max`: Maximum data rate of the channel (0-7). + +Examples: + +```python +lora.add_channel(index=0, frequency=868000000, dr_min=5, dr_max=6) +``` + +#### lora.remove\_channel(index) + +Removes the channel from the specified `index`. On the 868MHz band the channels 0 to 2 cannot be removed, they can only be replaced by other channels using the `lora.add_channel` method. A way to remove all channels except for one is to add the same channel, 3 times on indexes 0, 1 and 2. An example can be seen below: + +```python +lora.remove_channel() +``` + +On the 915MHz band there are no restrictions around this. + +#### lora.mac() + +Returns a byte object with the 8-Byte MAC address of the LoRa radio. + +#### lora.callback(trigger, handler=None, arg=None) + +Specify a callback handler for the LoRa radio. The `trigger` types are `LoRa.RX_PACKET_EVENT`, `LoRa.TX_PACKET_EVENT`, and `LoRa.TX_FAILED_EVENT` + +The `LoRa.RX_PACKET_EVENT` event is raised for every received packet. The `LoRa.TX_PACKET_EVENT` event is raised as soon as the packet transmission cycle ends, which includes the end of the receive windows (even if a downlink is received, the `LoRa.TX_PACKET_EVENT` will come last). In the case of non-confirmed transmissions, this will occur at the end of the receive windows, but, in the case of confirmed transmissions, this event will only be raised if the `ack` is received. If the `ack` is not received `LoRa.TX_FAILED_EVENT` will be raised after the number of `tx_retries` configured have been performed. + +An example of how this callback functions can be seen the in method [`lora.events()`](lora.md#lora-events). + +#### lora.ischannel\_free(rssi\_threshold) + +This method is used to check for radio activity on the current LoRa channel, and if the `rssi` of the measured activity is lower than the `rssi_threshold` given, the return value will be `True`, otherwise `False`. Example: + +```python +lora.ischannel_free(-100) +``` + +#### lora.set\_battery\_level(level) + +Set the battery level value that will be sent when the LoRaWAN MAC command that retrieves the battery level is received. This command is sent by the network and handled automatically by the LoRaWAN stack. The values should be according to the LoRaWAN specification: + +* `0` means that the end-device is connected to an external power source. +* `1..254` specifies the battery level, 1 being at minimum and 254 being at maximum. +* `255` means that the end-device was not able to measure the battery level. + +```python +lora.set_battery_level(127) # 50% battery +``` + +#### lora.events() + +This method returns a value with bits sets (if any) indicating the events that have triggered the callback. Please note that by calling this function the internal events registry is cleared automatically, therefore calling it immediately for a second time will most likely return a value of 0. + +Example: + +```python +def lora_cb(lora): + events = lora.events() + if events & LoRa.RX_PACKET_EVENT: + print('Lora packet received') + if events & LoRa.TX_PACKET_EVENT: + print('Lora packet sent') + +lora.callback(trigger=(LoRa.RX_PACKET_EVENT | LoRa.TX_PACKET_EVENT), handler=lora_cb) +``` + +#### lora.nvram\_save() + +Save the LoRaWAN state (joined status, network keys, packet counters, etc) in non-volatile memory in order to be able to restore the state when coming out of deepsleep or a power cycle. + +```python +lora.nvram_save() +``` + +#### lora.nvram\_restore() + +Restore the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. State must have been previously stored with a call to `nvram_save` before entering deepsleep. This is useful to be able to send a LoRaWAN message immediately after coming out of deepsleep without having to join the network again. This can only be used if the current region matches the one saved. + +```python +lora.nvram_restore() +``` + +#### lora.nvram\_erase() + +Remove the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. + +```python +lora.nvram_erase() +``` + +#### lora.nvram\_erase() + +Remove the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. + +```python +lora.nvram_erase() +``` + +#### lora.mesh() + +Enable the Mesh network. Only after Mesh enabling the `lora.cli()` and `socket` can be used. + +```python +lora.mesh() +``` + +#### lora.cli() + +Send OpenThread CLI commands, the list is [here](https://github.com/openthread/openthread/blob/master/src/cli/README). The output is multiline string, having as line-endings the `\r\n`. + +```bash +>>> print(lora.cli("ipaddr")) +fdde:ad00:beef:0:0:ff:fe00:fc00 +fdde:ad00:beef:0:0:ff:fe00:e800 +fdde:ad00:beef:0:e1f0:783c:1e8f:c763 +fe80:0:0:0:2c97:cb65:3219:c86 +``` + +## Constants + +* LoRa stack mode: `LoRa.LORA`, `LoRa.LORAWAN` +* LoRaWAN join procedure: `LoRa.OTAA`, `LoRa.ABP` +* Raw LoRa power mode: `LoRa.ALWAYS_ON`, `LoRa.TX_ONLY`, `LoRa.SLEEP` +* Raw LoRa bandwidth: `LoRa.BW_125KHZ`, `LoRa.BW_250KHZ`, `LoRa.BW_500KHZ` +* Raw LoRa coding rate: `LoRa.CODING_4_5`, `LoRa.CODING_4_6`, `LoRa.CODING_4_7`, `LoRa.CODING_4_8` +* Callback trigger types (may be ORed): `LoRa.RX_PACKET_EVENT`, `LoRa.TX_PACKET_EVENT`, `LoRa.TX_FAILED_EVENT` +* LoRaWAN device class: `LoRa.CLASS_A`, `LoRa.CLASS_C` +* LoRaWAN regions: `LoRa.AS923`, `LoRa.AU915`, `LoRa.EU868`, `LoRa.US915` + +## Exceptions + +* `LoRa.timeout` + +## Working with LoRa and LoRaWAN Sockets + +LoRa sockets are created in the following way: + +```python +import socket +s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) +``` + +And they must be created after initialising the LoRa network card. + +LoRa-Mesh socket is created, if the Mesh was enabled before (`lora.mesh()` was called). + +{{{% hint style="info" %}}} +The LoRa-Mesh socket supports only the following socket methods: `close()` , `bind()`, `sendto()`, and `recvfrom()`. +{{< /hint >}} + +LoRa sockets support the following standard methods from the socket module: + +#### socket.close() + +Usage: + +```python +s.close() +``` + +#### socket.bind(port\_number) + +Usage: + +```python +s.bind(1) +``` + +{{{% hint style="info" %}}} +The `bind()` method is only applicable when the radio is configured in `LoRa.LORAWAN` mode. +{{< /hint >}} + +#### socket.send(bytes) + +Usage: + +```python +s.send(bytes([1, 2, 3])) +``` + +or + +```python +s.send('Hello') +``` + +#### socket.sendto(bytes,(ip, port)) + +This is supported only by the LoRa Mesh socket. + +Usage: + +```python +s.sendto('Hello', ('fdde:ad00:beef:0:0:ff:fe00:e800', 1234)) +``` + +#### socket.recv(bufsize) + +Usage: + +```python +s.recv(128) +``` + +#### socket.recvfrom(bufsize) + +This method is useful to know the destination port number of the message received. Returns a tuple of the form: `(data, port)` + +Usage: + +```python +s.recvfrom(128) +``` + +#### socket.setsockopt(level, optname, value) + +Set the value of the given socket option. The needed symbolic constants are defined in the socket module (`SO_*` etc.). In the case of LoRa the values are always integers. Examples: + +```python +# configuring the data rate +s.setsockopt(socket.SOL_LORA, socket.SO_DR, 5) + +# selecting non-confirmed type of messages +s.setsockopt(socket.SOL_LORA, socket.SO_CONFIRMED, False) + +# selecting confirmed type of messages +s.setsockopt(socket.SOL_LORA, socket.SO_CONFIRMED, True) +``` + +{{{% hint style="info" %}}} +Socket options are only applicable when the LoRa radio is used in LoRa.LORAWAN mode. When using the radio in LoRa.LORA mode, use the class methods to change the spreading factor, bandwidth and coding rate to the desired values. +{{< /hint >}} + +#### socket.settimeout(value) + +Sets the socket timeout value in seconds. Accepts floating point values. + +Usage: + +```python +s.settimeout(5.5) +``` + +#### socket.setblocking(flag) + +Usage: + +```python +s.setblocking(True) +``` + diff --git a/firmwareapi/pycom/network/lora/pymesh.md b/content/firmwareapi/pycom/network/lora/pymesh.md similarity index 93% rename from firmwareapi/pycom/network/lora/pymesh.md rename to content/firmwareapi/pycom/network/lora/pymesh.md index d58682d..99aaf98 100644 --- a/firmwareapi/pycom/network/lora/pymesh.md +++ b/content/firmwareapi/pycom/network/lora/pymesh.md @@ -1,6 +1,10 @@ -{% hint style="info" %} - These API's are currently only available in the latest RC builds. -{% endhint %} +--- +title: "Pymesh" +aliases: + - firmwareapi/pycom/network/lora/pymesh.html + - firmwareapi/pycom/network/lora/pymesh.md +--- + # Pymesh - LoRa Mesh @@ -36,7 +40,7 @@ For various other complete Pymesh examples, check Tutorials & Examples section ( ## Constructors -#### class network.LoRa.Mesh\(\) +#### class network.LoRa.Mesh() Create and configure the Mesh object. @@ -48,7 +52,7 @@ pymesh = lora.Mesh() ## Methods -#### mesh.deinit\(\) +#### mesh.deinit() De-initialise Pymesh task. Any further Pymesh commands will return no answer. To use again Pymesh the `LoRa.Mesh()` constructor has to be called. @@ -60,7 +64,7 @@ True >>> pymesh.leader() ``` -#### mesh.state\(\) +#### mesh.state() Get node state inside Pymesh, which can be one of the following: ``` @@ -78,7 +82,7 @@ Get node state inside Pymesh, which can be one of the following: ``` More info: https://openthread.io/guides/thread-primer/node-roles-and-types -#### mesh.single\(\) +#### mesh.single() Returns `True` if this node is the only Leader or Router in the current Mesh network. @@ -87,7 +91,7 @@ Returns `True` if this node is the only Leader or Router in the current Mesh net True ``` -#### mesh.ipaddr\(\) +#### mesh.ipaddr() Returns all the IPv6 unicast addresses assigned on Pymesh interface. @@ -113,7 +117,7 @@ In the previous `pymesh.ipaddr()` answer, these are the individual IPv6: More info: https://openthread.io/guides/thread-primer/ipv6-addressing -#### mesh.rloc\(\) +#### mesh.rloc() Returns the routing locator (RLOC) IPv6 address. @@ -126,7 +130,7 @@ Returns the routing locator (RLOC) IPv6 address. More info: https://openthread.io/guides/thread-primer/ipv6-addressing -#### mesh.neighbors\(\) +#### mesh.neighbors() Returns a list with tuples containing information about neighbors, ie. all other nodes that have a direct radio connection to the calling node. @@ -146,7 +150,7 @@ For each neighbor the following properties are returned: -37 ``` -#### mesh.routers\(\) +#### mesh.routers() Returns a list with tuples containing information about all routers from Pymesh. Routers are Pymesh nodes that relay/route packets inside Pymesh. @@ -167,7 +171,7 @@ For each Router the following properties are returned: 25600 ``` -#### mesh.leader\(\) +#### mesh.leader() Returns information about Leader of the current Pymesh. can be called from any connected node. @@ -181,7 +185,7 @@ The following details are returned: (part_id=828258, mac=72340172838076676, rloc16=52224) ``` -#### mesh.rx_cb\(handler, argument\) +#### mesh.rx_cb(handler, argument) Specify the callback handler executed ( with parameter `argument`) when a new packet was received, on **any opened socket** (in case multiple sockets are opened). At this moment, in the callback handler, the right socket has to be checked for incoming data. @@ -230,7 +234,7 @@ sockets.append(br_socket) mesh.mesh.rx_cb(receive_pack, sockets) ``` -#### mesh.border_router\([ipv6_net_address, preference_level]\) +#### mesh.border_router([ipv6_net_address, preference_level]) Gets or sets as Border Router the current node, by specifying the external IPv6 network address (prefix), which should be used for any IPv6 packet to be sent outside of Pymesh. The parameters details are: * ipv6_net_address @@ -259,7 +263,7 @@ Gets or sets as Border Router the current node, by specifying the external IPv6 >>> ``` -#### mesh.border_router_del\(ipv6_net_address\) +#### mesh.border_router_del(ipv6_net_address) Removes a Border Router entry, by specifying the external IPv6 network address (prefix), which should be used for any IPv6 packet to be sent outside of Pymesh. The parameter is the same as for `mesh.border_router(ipv6_net_address, preference_level)`. @@ -282,9 +286,9 @@ This will remove all IPv6 unicast from all Mesh nodes, which previously set an I ['fdde:ad00:beef:0:0:ff:fe00:6800', 'fdde:ad00:beef:0:4623:91c8:64b2:d9ec', 'fe80:0:0:0:200:0:0:8'] ``` -#### mesh.cli\(\) +#### mesh.cli() -Sends a CLI command to the internal openthread engine; the list of CLI commands is [here](https://github.com/openthread/openthread/blob/c482301ec73b80985445102e4d0a936346172ddb/src/cli/README.md) +Sends a CLI command to the internal openthread engine; the list of CLI commands is [here](https://github.com/openthread/openthread/blob/c482301ec73b80985445102e4d0a936346172ddb/src/cli/README) ```python # get the Leader data set >>> print(pymesh.cli('leaderdata')) @@ -309,15 +313,15 @@ s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) Multiple sockets (maximum 3) can be created, being bind on a certain IPv6 unicast and port number. -Pymesh sockets is created, if the Mesh was enabled before \(`lora.Mesh()` was called\). +Pymesh sockets is created, if the Mesh was enabled before (`lora.Mesh()` was called). -{% hint style="info" %} +{{{% hint style="info" %}}} The Pymesh sockets supports only the following socket methods: `close()` , `bind()`, `sendto()`, and `recvfrom()`. -{% endhint %} +{{< /hint >}} LoRa sockets support the following standard methods from the socket module: -#### socket.close\(\) +#### socket.close() Closes the socket. @@ -327,8 +331,8 @@ Usage: s.close() ``` -#### socket.bind\(port\_number\) -#### socket.bind\(\(ipv6_string, port\_number\)\) +#### socket.bind(port\_number) +#### socket.bind((ipv6_string, port\_number)) Binds (links) an socket with an UDP port number (values 1024 to 63535), with or without an IPv6 interface. By default, if just `port_number` is used, then it binds the socket with all IPv6 unicast addresses; it's equivalent with `"::"`as for the `ipv6_string`. @@ -343,7 +347,7 @@ Usage: >>> s.bind(('fdde:ad00:beef:0:4623:91c8:64b2:d9ec', 1235)) ``` -#### socket.sendto\(bytes,\(ip, port\)\) +#### socket.sendto(bytes,(ip, port)) Sends `bytes` buffer to `ip`, on the designated UDP `port`. Returns the number of bytes sent. @@ -354,7 +358,7 @@ Usage: 12 ``` -#### socket.recvfrom\(bufsize\) +#### socket.recvfrom(bufsize) This method is useful to know the destination port number of the message received. Returns a pair of the form: `(data_bytes, (ipv6_string, port_number))` diff --git a/firmwareapi/pycom/network/lte.md b/content/firmwareapi/pycom/network/lte.md similarity index 77% rename from firmwareapi/pycom/network/lte.md rename to content/firmwareapi/pycom/network/lte.md index ee7e314..e0bb967 100644 --- a/firmwareapi/pycom/network/lte.md +++ b/content/firmwareapi/pycom/network/lte.md @@ -1,5 +1,10 @@ -# LTE - +--- +title: "LTE" +aliases: + - firmwareapi/pycom/network/lte.html + - firmwareapi/pycom/network/lte.md + - chapter/firmwareapi/pycom/network/lte +--- The LTE class provides access to the LTE-M/NB-IoT modem on the GPy and FiPy. LTE-M/NB-IoT are new categories of cellular protocols developed by the [3GPP](http://www.3gpp.org) and optimised for long battery life power and longer range. These are new protocols currently in the process of being deployed by mobile networks across the world. The GPy and FiPy support both new LTE-M protocols: @@ -7,23 +12,23 @@ The GPy and FiPy support both new LTE-M protocols: * **Cat-M1**: also known as **LTE-M** defines a 1.4 MHz radio channel size and about 375 kbps of throughput. It is optimised for coverage and long battery life, outperforming 2G/GPRS, while being similar to previous LTE standards. * **Cat-NB1** also known as **NB-IoT**, defines a 200 kHz radio channel size and around 60 kbps of uplink speed. It's optimised for ultra low throughput and specifically designed for IoT devices with a very long battery life. NB-IoT shares some features with LTE such as operating in licensed spectrum, but it's a very different protocol. It should be noted that NB-IoT has many restrictions as does not offer full IP connectivity and does not support mobility. When moving between cells, you will need to reconnect. -{% hint style="info" %} +{{{% hint style="info" %}}} **Please note:** The GPy and FiPy only support the two protocols above and are not compatible with older LTE standards. -{% endhint %} +{{< /hint >}} -{% hint style="info" %} -The Sequans modem used on Pycom's cellular enabled modules can only work in one of these modes at a time. In order to switch between the two protocols you need to flash a different firmware to the Sequans modem. Instructions for this can be found [here](../../../tutorials/lte/firmware.md). -{% endhint %} +{{{% hint style="info" %}}} +The Sequans modem used on Pycom's cellular enabled modules can only work in one of these modes at a time. In order to switch between the two protocols you need to flash a different firmware to the Sequans modem. Instructions for this can be found [here](/../../tutorials/lte/firmware). +{{< /hint >}} ## AT Commands The AT commands for the Sequans Monarch modem on the GPy/FiPy are available in a PDF file. -{% file src="../../../.gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential.pdf" caption="AT Commands for Sequans" %} +{% file src="..//gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential.pdf" caption="AT Commands for Sequans" %} ## Constructors -#### class network.LTE\(id=0, ...\) +#### class network.LTE(id=0, ...) Create and configure a LTE object. See init for params of configuration. @@ -34,11 +39,11 @@ lte = LTE() ## Methods -#### lte.init\(\*, carrier=None\) +#### lte.init(\*, carrier=None) This method is used to set up the LTE subsystem. After a `deinit()` this method can take several seconds to return waiting for the LTE modem to start-up. Optionally specify a carrier name. The available options are: `verizon, at&t, standard`. `standard` is generic for any carrier, and it's also the option used when no arguments are given. -#### lte.deinit\(detach=True, reset = False\) +#### lte.deinit(detach=True, reset = False) Disables LTE modem completely. This reduces the power consumption to the minimum. Call this before entering deepsleep. @@ -46,17 +51,17 @@ Disables LTE modem completely. This reduces the power consumption to the minimum - `reset` : reset LTE modem. -#### lte.attach\(\*, band=None, apn=None, cid=None, type=LTE.IP, legacyattach=True\) +#### lte.attach(\*, band=None, apn=None, cid=None, type=LTE.IP, legacyattach=True) Enable radio functionality and attach to the LTE network authorised by the inserted SIM card. Optionally specify: -- `band` : to scan for networks. If no band \(or `None`\) is specified, all 8 bands will be scanned. The possible values for the band are: `3, 4, 5, 8, 12, 13, 20 and 28`. +- `band` : to scan for networks. If no band (or `None`) is specified, all 8 bands will be scanned. The possible values for the band are: `3, 4, 5, 8, 12, 13, 20 and 28`. - `apn` : Specify the APN (Access point Name). - `cid` : connection ID, see `LTE.connect()`. when the ID is set here it will be remembered when doint connect so no need to specify again -- `type` : PDP context type either `LTE.IP` or `LTE.IPV4V6`. These are options to specify PDP type ‘Packet Data protocol’ either IP [Internet Protocol] or IPV4V6 ver4,6 , that depends actually on what does the Network support. +- `type` : PDP context type either `LTE.IP` or `LTE.IPV4V6`. These are options to specify PDP type ‘Packet Data protocol' either IP [Internet Protocol] or IPV4V6 ver4,6 , that depends actually on what does the Network support. - `legacyattach` : When kept = True the API `LTE.isattached()` will return True when attached to the Network AND Network registration status is home or roaming, when flag is False, API `LTE.isattached()` will return True when attached to the Network only. @@ -66,19 +71,19 @@ When carrier is specified in `LTE()` or `LTE.init()` (eg. `lte = LTE(carrier=ver --- -#### lte.isattached\(\) +#### lte.isattached() Returns `True` if the cellular mode is attached to the network. `False` otherwise. -#### lte.detach\(reset=False\) +#### lte.detach(reset=False) Detach the modem from the LTE Cat M1 and disable the radio functionality. - `reset` : set to True to reset the LTE modem. -#### lte.connect\(\*, cid=1\) +#### lte.connect(\*, cid=1) -Start a data session and obtain and IP address. Optionally specify a CID \(Connection ID\) for the data session. The arguments are: +Start a data session and obtain and IP address. Optionally specify a CID (Connection ID) for the data session. The arguments are: * `cid` is a Connection ID. This is carrier specific, for Verizon use `cid=3`. For others like Telstra it should be `cid=1`. @@ -103,17 +108,17 @@ while not lte.isconnected(): # Now use sockets as usual... ``` -#### lte.isconnected\(\) +#### lte.isconnected() Returns `True` if there is an active LTE data session and IP address has been obtained. `False` otherwise. -#### lte.disconnect\(\) +#### lte.disconnect() End the data session with the network. -#### lte.send\_at\_cmd\(cmd, delay=10000\) +#### lte.send\_at\_cmd(cmd, delay=10000) -Send an AT command directly to the modem. Returns the raw response from the modem as a string object. **IMPORTANT:** If a data session is active \(i.e. the modem is _connected_\), sending the AT commands requires to pause and then resume the data session. This is all done automatically, but makes the whole request take around 2.5 seconds. +Send an AT command directly to the modem. Returns the raw response from the modem as a string object. **IMPORTANT:** If a data session is active (i.e. the modem is _connected_), sending the AT commands requires to pause and then resume the data session. This is all done automatically, but makes the whole request take around 2.5 seconds. Example: @@ -135,31 +140,31 @@ send_at_cmd_pretty('AT!="fsm"') # get the System FSM - `delay` : specify maximum Timeout in ms to wait response from modem. -#### lte.imei\(\) +#### lte.imei() Returns a string object with the IMEI number of the LTE modem. -#### lte.iccid\(\) +#### lte.iccid() Returns a string object with the ICCID number of the SIM card. -#### lte.reset\(\) +#### lte.reset() Perform a hardware reset on the cellular modem. This function can take up to 5 seconds to return as it waits for the modem to shutdown and reboot. -#### lte.pppsuspend\(\) +#### lte.pppsuspend() Suspend PPP session with LTE modem. this function can be used when needing to send AT commands which is not supported in PPP mode. -#### lte.pppresume\(\) +#### lte.pppresume() Resumes PPP session with LTE modem. -#### lte.factory\_reset\(\) +#### lte.factory\_reset() Reset modem configuration to Factory settings. -#### lte.modem\_upgrade\_mode\(\) +#### lte.modem\_upgrade\_mode() Puts the modem in to modem upgrade mode and bridging LTE modem UART port to FiPy/GPy UART0 to enable upgrading Firmware over USB port. @@ -168,11 +173,11 @@ Reset modem configuration to Factory settings. In this mode all All tasks on the board are halted and a reset is required to regain functionality. --- -#### lte.reconnect\_uart\(\) +#### lte.reconnect\_uart() Reconnect esp32 UART 2 to LTE modem UART port. -#### lte.ue\_coverage\(\) +#### lte.ue\_coverage() Check Network Coverage for UE device (i.e LTE modem). diff --git a/firmwareapi/pycom/network/server.md b/content/firmwareapi/pycom/network/server.md similarity index 55% rename from firmwareapi/pycom/network/server.md rename to content/firmwareapi/pycom/network/server.md index a6c5e19..a49508d 100644 --- a/firmwareapi/pycom/network/server.md +++ b/content/firmwareapi/pycom/network/server.md @@ -1,6 +1,11 @@ -# Server - -The `Server` class controls the behaviour and the configuration of the FTP and telnet services running on the Pycom device. Any changes performed using this class’ methods will affect both. +--- +title: "Server" +aliases: + - firmwareapi/pycom/network/server.html + - firmwareapi/pycom/network/server.md + - chapter/firmwareapi/pycom/network/server +--- +The `Server` class controls the behaviour and the configuration of the FTP and telnet services running on the Pycom device. Any changes performed using this class' methods will affect both. Example: @@ -26,25 +31,25 @@ server.isrunning() # check whether the server is running or not ## Constructors -#### class network.Server\(id, ...\) +#### class network.Server(id, ...) Create a server instance, see `init` for parameters of initialisation. ## Methods -#### server.init\(\* , login=\('micro', 'python'\), timeout=300\) +#### server.init(\* , login=('micro', 'python'), timeout=300) -Init \(and effectively start the server\). Optionally a new `user`, `password` and `timeout` \(in seconds\) can be passed. +Init (and effectively start the server). Optionally a new `user`, `password` and `timeout` (in seconds) can be passed. -#### server.deinit\(\) +#### server.deinit() Stop the server. -#### server.timeout\(\[timeout\_in\_seconds\]\) +#### server.timeout(\[timeout\_in\_seconds\]) Get or set the server timeout. -#### server.isrunning\(\) +#### server.isrunning() -Returns `True` if the server is running \(connected or accepting connections\), `False` otherwise. +Returns `True` if the server is running (connected or accepting connections), `False` otherwise. diff --git a/firmwareapi/pycom/network/sigfox.md b/content/firmwareapi/pycom/network/sigfox.md similarity index 77% rename from firmwareapi/pycom/network/sigfox.md rename to content/firmwareapi/pycom/network/sigfox.md index 9244cfd..e6be706 100644 --- a/firmwareapi/pycom/network/sigfox.md +++ b/content/firmwareapi/pycom/network/sigfox.md @@ -1,9 +1,14 @@ -# Sigfox - +--- +title: "Sigfox" +aliases: + - firmwareapi/pycom/network/sigfox.html + - firmwareapi/pycom/network/sigfox.md + - chapter/firmwareapi/pycom/network/sigfox +--- Sigfox is a Low Power Wide Area Network protocol that enables remote devices to connect using ultra-narrow band, UNB technology. The protocol is bi-directional, messages can both be sent up to and down from the Sigfox servers. -{% hint style="info" %} -When operating in `RCZ2` and `RCZ4` the module can only send messages on the default macro-channel \(this is due to Sigfox network limitations\). Therefore, the device needs to reset automatically to the default macro-channel after every 2 transmissions. However, due to FCC duty cycle limitations, there must a minimum of a 20s delay after resetting to the default macro-channel. Our API takes care of this, \(and in real life applications you should not be in the need to send Sigfox messages that often\), so it will wait for the necessary amount of time to make sure that the duty cycle restrictions are fulfilled. +{{{% hint style="info" %}}} +When operating in `RCZ2` and `RCZ4` the module can only send messages on the default macro-channel (this is due to Sigfox network limitations). Therefore, the device needs to reset automatically to the default macro-channel after every 2 transmissions. However, due to FCC duty cycle limitations, there must a minimum of a 20s delay after resetting to the default macro-channel. Our API takes care of this, (and in real life applications you should not be in the need to send Sigfox messages that often), so it will wait for the necessary amount of time to make sure that the duty cycle restrictions are fulfilled. This means that if you run a piece of test code like: @@ -14,7 +19,7 @@ for i in range(1, 100): ``` There will be a 20 second delay after every 2 packets. -{% endhint %} +{{< /hint >}} This class provides a driver for the Sigfox network processor in the Sigfox enabled Pycom devices. @@ -40,13 +45,13 @@ s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False) s.send(bytes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])) ``` -{% hint style="danger" %} -Please ensure that there is an antenna connected to your device before sending/receiving Sigfox messages as in proper use \(e.g. without an antenna\), may damage the device. -{% endhint %} +{{{% hint style="danger" %}}} +Please ensure that there is an antenna connected to your device before sending/receiving Sigfox messages as in proper use (e.g. without an antenna), may damage the device. +{{< /hint >}} ## Constructors -#### class network.Sigfox\(id=0, ...\) +#### class network.Sigfox(id=0, ...) Create and configure a Sigfox object. See init for params of configuration. Examples: @@ -58,13 +63,13 @@ sigfox = Sigfox(mode=Sigfox.SIGFOX, rcz=Sigfox.RCZ1) sigfox = Sigfox(mode=Sigfox.FSK, frequency=912000000) ``` -{% hint style="info" %} +{{{% hint style="info" %}}} `Sigfox.FSK` mode is not supported on LoPy 4 and FiPy. -{% endhint %} +{{< /hint >}} ## Methods -#### sigfox.init\(mode=Sigfox.SIGFOX, rcz=Sigfox.RCZ1, \* , frequency=None\) +#### sigfox.init(mode=Sigfox.SIGFOX, rcz=Sigfox.RCZ1, \* , frequency=None) Set the Sigfox radio configuration. @@ -74,39 +79,39 @@ The arguments are: * `rcz` takes the following values: `Sigfox.RCZ1`, `Sigfox.RCZ2`, `Sigfox.RCZ3`, `Sigfox.RCZ4`. The `rcz` argument is only required if the mode is `Sigfox.SIGFOX`. * `frequency` sets the frequency value in `FSK` mode. Can take values between 863 and 928 MHz. -{% hint style="info" %} +{{{% hint style="info" %}}} The SiPy comes in 2 different hardware flavours: a +14dBm Tx power version which can only work with `RCZ1` and `RCZ3` and a +22dBm version which works exclusively on `RCZ2` and `RCZ4`. -{% endhint %} +{{< /hint >}} -#### sigfox.mac\(\) +#### sigfox.mac() Returns a byte object with the 8-Byte MAC address of the Sigfox radio. -#### sigfox.id\(\) +#### sigfox.id() Returns a byte object with the 4-Byte bytes object with the Sigfox ID. -#### sigfox.rssi\(\) +#### sigfox.rssi() Returns a signed integer with indicating the signal strength value of the last received packet. -#### sigfox.pac\(\) +#### sigfox.pac() Returns a byte object with the 8-Byte bytes object with the Sigfox PAC. -{% hint style="info" %} +{{{% hint style="info" %}}} To return human-readable values you should import `ubinascii` and convert binary values to hexidecimal representation. For example: ```python print(ubinascii.hexlify(sigfox.mac())) ``` -{% endhint %} +{{< /hint >}} -#### sigfox.frequencies\(\) +#### sigfox.frequencies() Returns a tuple of the form: `(uplink_frequency_hz, downlink_frequency_hz)` -#### sigfox.public\_key\(\[public\]\) +#### sigfox.public\_key(\[public\]) Sets or gets the public key flag. When called passing a `True` value the Sigfox public key will be used to encrypt the packets. Calling it without arguments returns the state of the flag. @@ -142,11 +147,11 @@ And they must be created after initialising the Sigfox network card. Sigfox sockets support the following standard methods from the `socket` module: -#### socket.close\(\) +#### socket.close() Use it to close an existing socket. -#### socket.send\(bytes\) +#### socket.send(bytes) In Sigfox mode the maximum data size is 12 bytes. In FSK the maximum is 64. @@ -158,7 +163,7 @@ s.send(bytes([1, 2, 3])) s.send('Hello') ``` -#### socket.recv\(bufsize\) +#### socket.recv(bufsize) This method can be used to receive a Sigfox downlink or FSK message. @@ -167,9 +172,9 @@ This method can be used to receive a Sigfox downlink or FSK message. s.recv(64) ``` -#### socket.setsockopt\(level, optname, value\) +#### socket.setsockopt(level, optname, value) -Set the value of the given socket option. The needed symbolic constants are defined in the socket module \(`SO_*` etc.\). In the case of Sigfox the values are always an integer. Examples: +Set the value of the given socket option. The needed symbolic constants are defined in the socket module (`SO_*` etc.). In the case of Sigfox the values are always an integer. Examples: ```python # wait for a downlink after sending the uplink packet @@ -209,7 +214,7 @@ If the socket is set to blocking, your code will be wait until the socket comple ## Sigfox Downlink -A Sigfox capable Pycom devices \(SiPy\) can both send and receive data from the Sigfox network. To receive data, a message must first be sent up to Sigfox, requesting a downlink message. This can be done by passing a `True` argument into the `setsockopt()` method. +A Sigfox capable Pycom devices (SiPy) can both send and receive data from the Sigfox network. To receive data, a message must first be sent up to Sigfox, requesting a downlink message. This can be done by passing a `True` argument into the `setsockopt()` method. ```python s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, True) @@ -237,13 +242,13 @@ s.send(bytes([1, 2, 3])) s.recv(32) ``` -## Sigfox FSK \(Device to Device\) +## Sigfox FSK (Device to Device) To communicate between two Sigfox capable devices, it may be used in FSK mode. Two devices are required to be set to the same frequency, both using FSK. -{% hint style="info" %} +{{{% hint style="info" %}}} `Sigfox.FSK` mode is not supported on LoPy 4 and FiPy. -{% endhint %} +{{< /hint >}} **Device 1**: @@ -273,7 +278,7 @@ while True: print(s.recv(64)) ``` -{% hint style="danger" %} -Remember to use the correct frequency for your region \(868 MHz for Europe, 912 MHz for USA, etc.\) -{% endhint %} +{{{% hint style="danger" %}}} +Remember to use the correct frequency for your region (868 MHz for Europe, 912 MHz for USA, etc.) +{{< /hint >}} diff --git a/firmwareapi/pycom/network/wlan.md b/content/firmwareapi/pycom/network/wlan.md similarity index 83% rename from firmwareapi/pycom/network/wlan.md rename to content/firmwareapi/pycom/network/wlan.md index b5b4ad3..b4e00ab 100644 --- a/firmwareapi/pycom/network/wlan.md +++ b/content/firmwareapi/pycom/network/wlan.md @@ -1,5 +1,10 @@ -# WLAN - +--- +title: "WLAN" +aliases: + - firmwareapi/pycom/network/wlan.html + - firmwareapi/pycom/network/wlan.md + - chapter/firmwareapi/pycom/network/wlan +--- This class provides a driver for the WiFi network processor in the module. Example usage: ```python @@ -34,17 +39,17 @@ print(wlan.ifconfig()) ## Constructors -### class network.WLAN\(id=0, ...\) +### class network.WLAN(id=0, ...) Create a WLAN object, and optionally configure it. See [`init`](wlan.md#wlan-init-mode-ssid-none-auth-none-channel-1-antenna-none-power_save-false-hidden-false) for params of configuration. -{% hint style="info" %} +{{{% hint style="info" %}}} The WLAN constructor is special in the sense that if no arguments besides the `id` are given, it will return the already existing WLAN instance without re-configuring it. This is because WLAN is a system feature of the WiPy. If the already existing instance is not initialised it will do the same as the other constructors an will initialise it with default values. -{% endhint %} +{{< /hint >}} ## Methods -#### wlan.init\(mode, \* , ssid=None, auth=None, channel=1, antenna=None, power\_save=False, hidden=False, bandwidth=HT40, max\_tx\_pwr=20, country=CN\) +#### wlan.init(mode, \* , ssid=None, auth=None, channel=1, antenna=None, power\_save=False, hidden=False, bandwidth=HT40, max\_tx\_pwr=20, country=CN) Set or get the WiFi network processor configuration. @@ -52,10 +57,10 @@ Arguments are: * `mode` can be either `WLAN.STA`, `WLAN.AP`, or `WLAN.STA_AP`. * `ssid` is a string with the SSID name. Only needed when mode is `WLAN.AP`. -* `auth` is a tuple with \(sec, key\). Security can be `None`, `WLAN.WEP`, `WLAN.WPA`, or `WLAN.WPA2`. The key is a string with the network password. - * If `sec` is `WLAN.WEP` the key must be a string representing hexadecimal values \(e.g. `ABC1DE45BF`\). Only needed when mode is `WLAN.AP`. +* `auth` is a tuple with (sec, key). Security can be `None`, `WLAN.WEP`, `WLAN.WPA`, or `WLAN.WPA2`. The key is a string with the network password. + * If `sec` is `WLAN.WEP` the key must be a string representing hexadecimal values (e.g. `ABC1DE45BF`). Only needed when mode is `WLAN.AP`. * `channel` a number in the range 1-11. Only needed when mode is `WLAN.AP`. -* `antenna` selects between the internal and the external antenna. Can be either `WLAN.INT_ANT`, `WLAN.EXT_ANT`. With our development boards it defaults to using the internal antenna, but in the case of an OEM module, the antenna pin \(`P12`\) is not used, so it’s free to be +* `antenna` selects between the internal and the external antenna. Can be either `WLAN.INT_ANT`, `WLAN.EXT_ANT`. With our development boards it defaults to using the internal antenna, but in the case of an OEM module, the antenna pin (`P12`) is not used, so it's free to be used for other things. @@ -79,16 +84,16 @@ or wlan.init(mode=WLAN.STA) ``` -### wlan.deinit\(\) +### wlan.deinit() Disables the WiFi radio. -### wlan.connect\(ssid, \* , auth=None, bssid=None, timeout=None, ca\_certs=None, keyfile=None, certfile=None, identity=None, hostname=None\) +### wlan.connect(ssid, \* , auth=None, bssid=None, timeout=None, ca\_certs=None, keyfile=None, certfile=None, identity=None, hostname=None) Connect to a wifi access point using the given SSID, and other security parameters. * `auth` is a tuple with `(sec, key)`. Security can be `None`, `WLAN.WEP`, `WLAN.WPA`, `WLAN.WPA2` or `WLAN.WPA2_ENT`. The key is a string with the network password. - * If `sec` is `WLAN.WEP` the key must be a string representing hexadecimal values \(e.g. `ABC1DE45BF`\). + * If `sec` is `WLAN.WEP` the key must be a string representing hexadecimal values (e.g. `ABC1DE45BF`). * If `sec` is `WLAN.WPA2_ENT` then the `auth` tuple can have either 3 elements: `(sec, username, password)`, or just 1: `(sec,)`. When passing the 3 element tuple, the`keyfile` and `certifle` arguments must not be given. * `bssid` is the MAC address of the AP to connect to. Useful when there are several APs with the same SSID. * `timeout` is the maximum time in milliseconds to wait for the connection to succeed. @@ -98,18 +103,18 @@ Connect to a wifi access point using the given SSID, and other security paramete * `identity` is only used in case of `WLAN.WPA2_ENT` security. Needed by the server. * `hostname` is the name of the host connecting to the AP. Max length of name string is 32 Bytes -{% hint style="info" %} -The ESP32 only handles certificates with `pkcs8` format \(but not the "Traditional SSLeay RSAPrivateKey" format\). The private key should be RSA coded with 2048 bits at maximum. -{% endhint %} +{{{% hint style="info" %}}} +The ESP32 only handles certificates with `pkcs8` format (but not the "Traditional SSLeay RSAPrivateKey" format). The private key should be RSA coded with 2048 bits at maximum. +{{< /hint >}} -#### wlan.scan\(\[ssid=NULL, bssid=NULL, channel=0, show\_hidden=False, type=WLAN.SCAN\_ACTIVE, scantime=120ms\]\) +#### wlan.scan(\[ssid=NULL, bssid=NULL, channel=0, show\_hidden=False, type=WLAN.SCAN\_ACTIVE, scantime=120ms\]) -Performs a network scan and returns a list of named tuples with \(ssid, bssid, sec, channel, rssi\). When no config args passed scan will be performed with default configurations. +Performs a network scan and returns a list of named tuples with (ssid, bssid, sec, channel, rssi). When no config args passed scan will be performed with default configurations. Note: For Fast scan mode ssid/bssid and channel should be * `ssid` : If the SSID is not NULL, it is only the AP with the same SSID that can be scanned. -* `bssid` : If the BSSID is not NULL, it is only the AP with the same BSSID that can be scanned. The bssid is given as 6 Hexadecimal bytes literals \(i.e b'\xff\xff\xff\xff\xff\xff'\) +* `bssid` : If the BSSID is not NULL, it is only the AP with the same BSSID that can be scanned. The bssid is given as 6 Hexadecimal bytes literals (i.e b'\xff\xff\xff\xff\xff\xff') * `channel` : If “channel” is 0, there will be an all-channel scan; otherwise, there will be a specific-channel scan. * `show_hidden` : If “show\_hidden” is 0, the scan ignores the AP with a hidden SSID; otherwise, the scan considers the hidden AP a normal one. * `type` : If “type” is `WLAN.SCAN_ACTIVE`, the scan is “active”; otherwise, it is a “passive” one. @@ -119,7 +124,7 @@ Note: For Fast scan mode ssid/bssid and channel should be This field is used to control how long the scan dwells on each channel. For passive scans, scantime=\[int\] designates the dwell time for each channel. - For active scans, dwell times for each channel are listed below. scantime is given as a tuple for min and max times \(min,max\) + For active scans, dwell times for each channel are listed below. scantime is given as a tuple for min and max times (min,max) min=0, max=0: scan dwells on each channel for 120 ms. @@ -129,15 +134,15 @@ min=0, max>0: scan dwells on each channel for max ms. min>0, max>0: The minimum time the scan dwells on each channel is min ms. If no AP is found during this time frame, the scan switches to the next channel. Otherwise, the scan dwells on the channel for max ms.If you want to improve the performance of the the scan, you can try to modify these two parameters. -### wlan.disconnect\(\) +### wlan.disconnect() Disconnect from the WiFi access point. -### wlan.isconnected\(\) +### wlan.isconnected() In case of STA mode, returns `True` if connected to a WiFi access point and has a valid IP address. In AP mode returns `True` when a station is connected, `False` otherwise. -### wlan.ifconfig\(id=0, config=\['dhcp' or configtuple\]\) +### wlan.ifconfig(id=0, config=\['dhcp' or configtuple\]) When `id` is 0, the configuration will be get/set on the Station interface. When `id` is 1 the configuration will be done for the AP interface. @@ -151,13 +156,13 @@ If the 4-tuple config is given then a static IP is configured. For instance: wlan.ifconfig(config=('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8')) ``` -### wlan.mode\(\[mode\]\) +### wlan.mode(\[mode\]) Get or set the WLAN mode. -### wlan.ssid\(\[ssid\]\) +### wlan.ssid(\[ssid\]) -Get or set the SSID \(Set SSID of AP\). +Get or set the SSID (Set SSID of AP). In case if mode = `WLAN.STA` this method can get the ssid of AP the board is connected to. @@ -167,11 +172,11 @@ In case of mode = `WLAN.STA_AP` this method can get the ssid of board's own AP p _\_ -### wlan.auth\(\[auth\]\) +### wlan.auth(\[auth\]) Get or set the authentication type when in AP mode. -### wlan.channel\(\[channel, sec\_chn\]\) +### wlan.channel(\[channel, sec\_chn\]) _In AP mode:_ @@ -185,11 +190,11 @@ _In STA mode:_ _Note: Setting Channel in STA mode is only Allowed in Promiscuous mode_ -### wlan.antenna\(\[antenna\]\) +### wlan.antenna(\[antenna\]) -Get or set the antenna type \(external or internal\). +Get or set the antenna type (external or internal). -### wlan.mac\(\[mac, mode\]\) +### wlan.mac(\[mac, mode\]) when no arguments are passed a 6-byte long `bytes` tuple object with the WiFI MAC address of both Wifi Station mode and Acces Point mode @@ -205,23 +210,23 @@ wlan.mac(bytearray([0xAE, 0x77, 0x88, 0x99, 0x22, 0x44]), WLAN.STA) _Note: STA and AP cannot have the Same Mac Address_ -### wlan.bandwidth\(\) +### wlan.bandwidth() Set the bandwidth of the wifi, either 20 MHz or 40 MHz can be configured, use constants `HT20` or `HT40` -### wlan.hostname\(\) +### wlan.hostname() Set the Host name of the device connecting to the AP in case of Wifi `mode=WLAN.STA`, in case of `mode=WLAN.AP` this is the name of the host hosting the AP. Max length of name string is 32 Bytes -### wlan.ap\_sta\_list\(\) +### wlan.ap\_sta\_list() Gets an info list of all stations connected to the board's AP. -Info returned is a list of tuples containning \(\[mac address of connected STA\], \[average rssi value\], \[Wlan protocol enabled by STA\]\). +Info returned is a list of tuples containning (\[mac address of connected STA\], \[average rssi value\], \[Wlan protocol enabled by STA\]). Protocol types are either : `WLAN.PHY_11_B`, `WLAN.PHY_11_G`, `WLAN.PHY_11_N` or `WLAN.PHY_LOW_RATE` -### wlan.max\_tx\_power\(\[power\]\) +### wlan.max\_tx\_power(\[power\]) Gets or Sets the maximum allowable transmission power for wifi. @@ -242,7 +247,7 @@ Values passed in power are mapped to transmit power levels as follows: * \[8, 19\]: level5 - 11dBm * \[-128, 7\]: level5 - 14dBm -### wlan.country\(\[country, schan, nchan, max\_tx\_pwr, policy\]\) +### wlan.country(\[country, schan, nchan, max\_tx\_pwr, policy\]) Gets or set s Country configuration parameters for wifi. @@ -252,15 +257,15 @@ Gets or set s Country configuration parameters for wifi. * `max_tx_pwr` Maximum transmission power allowed. see `WLAN.max_tx_power()` for more details. * `policy` Is the method when setting country configuration for `WLAN.COUNTRY_POL_AUTO` in STA mode the wifi will aquire the same country config of the connected AP, for `WLAN.COUNTRY_POL_MAN` the configured country parameters will take effect regardless of Connected AP. -### wlan.joined\_ap\_info\(\) +### wlan.joined\_ap\_info() -Returns a tuple with \(bssid, ssid, primary channel, rssi, Authorization method, wifi standard used\) of the connected AP in case of STA mode. +Returns a tuple with (bssid, ssid, primary channel, rssi, Authorization method, wifi standard used) of the connected AP in case of STA mode. -### wlan.wifi\_protocol\(\[\(bool PHY11\_\_B, bool PHY11\_G, bool PHY11\_N\)\]\) +### wlan.wifi\_protocol(\[(bool PHY11\_\_B, bool PHY11\_G, bool PHY11\_N)\]) Sets or gets Wifi Protocol supported. -### wlan.send\_raw\(Buffer, interface=STA, use\_sys\_seq=True\) +### wlan.send\_raw(Buffer, interface=STA, use\_sys\_seq=True) Send raw data through the Wifi Interface. @@ -270,13 +275,13 @@ Send raw data through the Wifi Interface. `use_sys_seq`: `True` to use the systems next sequance number for sending the data, `False` for keeping the sequance number in the given raw data buffer unchanged. -### wlan.callback\(trigger, handler=Null, arg=Null\) +### wlan.callback(trigger, handler=Null, arg=Null) Register a user callback function `handler` to be called once any of the `trigger` events occures optionally with a passed `arg`. by default the wlan obj is passed as arg to the handler. To unregister the callback you can call the `wlan.callback` function with empty `handler` and `arg` parameters. For trigger events see `Constants` section. -### wlan.promiscuous\(\[bool\]\) +### wlan.promiscuous(\[bool\]) * To enable Promiscuous mode `WLAN.promiscuous(True)` should be called, and `WLAN.promiscuous(False)` for disabling * To get current mode setting call function with empty args @@ -286,15 +291,15 @@ Note: * Promiscuous mode should be enabled for Wifi packets types Events to be triggered * for changing wifi channel via `wlan.channel()` promiscuous mode should be enabled. -### wlan.events\(\) +### wlan.events() This function will return an integer object as mask for triggered events. -### wlan.wifi\_packet\(\) +### wlan.wifi\_packet() This function will return a tuble with Wifi packet info captured in promiscuous mode. -### wlan.ctrl\_pkt\_filter\(\[int\]\) +### wlan.ctrl\_pkt\_filter(\[int\]) This function is used to set the filter mask for Wifi control packets in promiscuous mode. for Filter masks, see `Constants` section. diff --git a/firmwareapi/pycom/pycom.md b/content/firmwareapi/pycom/pycom.md similarity index 78% rename from firmwareapi/pycom/pycom.md rename to content/firmwareapi/pycom/pycom.md index 4a68f71..9f85ab1 100644 --- a/firmwareapi/pycom/pycom.md +++ b/content/firmwareapi/pycom/pycom.md @@ -1,5 +1,10 @@ -# pycom - +--- +title: "pycom" +aliases: + - firmwareapi/pycom/pycom.html + - firmwareapi/pycom/pycom.md + - chapter/firmwareapi/pycom/pycom +--- The `pycom` module contains functions to control specific features of the Pycom devices, such as the heartbeat RGB LED. ## Quick Usage Example @@ -15,19 +20,19 @@ pycom.rgbled(0xff00) # make the LED light up in green color ## Methods -#### pycom.heartbeat\(\[enable\]\) +#### pycom.heartbeat(\[enable\]) -Get or set the state \(enabled or disabled\) of the heartbeat LED. Accepts and returns boolean values \(`True` or `False`\). +Get or set the state (enabled or disabled) of the heartbeat LED. Accepts and returns boolean values (`True` or `False`). -#### pycom.heartbeat\_on\_boot\(\[enable\]\) +#### pycom.heartbeat\_on\_boot(\[enable\]) Allows you permanently disable or enable the heartbeat LED. Once this setting is set, it will persist between reboots. Note, this only comes into effect on the next boot, it does not stop the already running heartbeat. -#### pycom.rgbled\(color\) +#### pycom.rgbled(color) Set the colour of the RGB LED. The colour is specified as 24 bit value representing red, green and blue, where the red colour is represented by the 8 most significant bits. For instance, passing the value `0x00FF00` will light up the LED in a very bright green. -#### pycom.nvs\_set\(key, value\) +#### pycom.nvs\_set(key, value) Set the value of the specified key in the NVRAM memory area of the external flash. Data stored here is preserved across resets and power cycles. Value can only take 32-bit integers at the moment. Example: @@ -38,7 +43,7 @@ pycom.nvs_set('temp', 25) pycom.nvs_set('count', 10) ``` -#### pycom.nvs\_get\(key\) +#### pycom.nvs\_get(key) Get the value the specified key from the NVRAM memory area of the external flash. Example: @@ -50,17 +55,17 @@ pulses = pycom.nvs_get('count') If a non-existing key is given the returned value will be `None`. -#### pycom.nvs\_erase\(key\) +#### pycom.nvs\_erase(key) Erase the given key from the NVRAM memory area. -#### pycom.nvs\_erase\_all\(\) +#### pycom.nvs\_erase\_all() Erase the entire NVRAM memory area. -#### pycom.wifi\_on\_boot\(\[enable\]\) +#### pycom.wifi\_on\_boot(\[enable\]) -Get or set the WiFi on boot flag. When this flag is set to `True`, the AP with the default SSID \(`lopy-wlan-xxx` for example\) will be enabled as part of the boot process. If the flag is set to False, the module will boot with WiFi disabled until it's enabled by the script via the `WLAN` class. This setting is stored in non-volatile memory which preserves it across resets and power cycles. Example: +Get or set the WiFi on boot flag. When this flag is set to `True`, the AP with the default SSID (`lopy-wlan-xxx` for example) will be enabled as part of the boot process. If the flag is set to False, the module will boot with WiFi disabled until it's enabled by the script via the `WLAN` class. This setting is stored in non-volatile memory which preserves it across resets and power cycles. Example: ```python import pycom @@ -69,7 +74,7 @@ pycom.wifi_on_boot(True) # enable WiFi on boot pycom.wifi_on_boot() # get the wifi on boot flag ``` -#### pycom.wdt\_on\_boot\(\[enable\]\) +#### pycom.wdt\_on\_boot(\[enable\]) Enables the WDT at boot time with the timeout in ms set by the function `wdt_on_boot_timeout`. If this flag is set, the application needs to reconfigure the WDT with a new timeout and feed it regularly to avoid a reset. @@ -80,7 +85,7 @@ pycom.wdt_on_boot(True) # enable WDT on boot pycom.wdt_on_boot() # get the WDT on boot flag ``` -#### pycom.wdt\_on\_boot\_timeout\(\[timeout\]\) +#### pycom.wdt\_on\_boot\_timeout(\[timeout\]) Sets or gets the WDT on boot timeout in milliseconds. The minimum value is 5000 ms. @@ -91,7 +96,7 @@ pycom.wdt_on_boot_timeout(10000) # set the timeout to 5000ms pycom.wdt_on_boot_timeout() # get the WDT timeout value ``` -#### pycom.pulses\_get\(pin, timeout\) +#### pycom.pulses\_get(pin, timeout) Return a list of pulses at `pin`. The methods scans for transitions at `pin` and returns a list of tuples, each telling the pin value and the duration in microseconds of that value. `pin` is a pin object, which must have set to `INP` or `OPEN_DRAIN` mode. The scan stops if not transitions occurs within `timeout` milliseconds. @@ -110,11 +115,11 @@ pin(1) data = pulses_get(pin, 100) ``` -#### pycom.ota\_start\(\) +#### pycom.ota\_start() -#### pycom.ota\_write\(buffer\) +#### pycom.ota\_write(buffer) -#### pycom.ota\_finish\(\) +#### pycom.ota\_finish() Perform a firmware update. These methods are internally used by a firmware update though FTP. The update starts with a call to `ota_start()`, followed by a series of calls to `ota_write(buffer)`, and is terminated with `ota_finish()`. After reset, the new image gets active. `buffer` shall hold the image data to be written, in arbitrary sizes. A block size of 4096 is recommended. @@ -151,10 +156,10 @@ with open(APPIMG, "rb") as f: Instead of reading the data to be written from a file, it can obviously also be received from a server using any suitable protocol, without the need to store it in the devices file system. -#### pycom.bootmgr\(boot\_partition=pycom.FACTORY, fs\_type=FAT, safeboot=False, reset=False\) +#### pycom.bootmgr(boot\_partition=pycom.FACTORY, fs\_type=FAT, safeboot=False, reset=False) * `boot_partition` This is to set the partition to boot from , this could be set to either `pycom.FACTORY` or `pycom.OTA_0` -* `fs_type` This is to set the filesystem to use for the flash memory \(`/flash`\). This could be set to `pycom.FAT` for FAT16 or `pycom.LittleFS` for LittleFS filesystem. +* `fs_type` This is to set the filesystem to use for the flash memory (`/flash`). This could be set to `pycom.FAT` for FAT16 or `pycom.LittleFS` for LittleFS filesystem. _Note: When the firmware is built with option_ `FS_USE_LITTLEFS` _the file system for_ `/flash` _is forced to be LittleFS._ diff --git a/getting-started/hardwaresetup/README.md b/content/getting-started/hardwaresetup/README.md similarity index 65% rename from getting-started/hardwaresetup/README.md rename to content/getting-started/hardwaresetup/README.md index eea4228..12b2080 100644 --- a/getting-started/hardwaresetup/README.md +++ b/content/getting-started/hardwaresetup/README.md @@ -1,10 +1,12 @@ -# 1.1 Hardware Setup - +--- +title: "" +aliases: +--- This chapter of the documentation will show you how to connect you Pycom module. For each device there are detailed instructions on how to connect your module to one of our base boards, a USB UART adapter or WiFi as well as what antennas you might need to connect. Please select your module below to be taken to the appropriate guide. -[![](../../.gitbook/assets/wipy.png)](wipy.md) +[![](/gitbook/assets/wipy.png)](wipy) -[![](../../.gitbook/assets/lopy%20%282%29.png)](lopy.md) +[![](/gitbook/assets/lopy%20%282%29.png)](lopy) -[![](../../.gitbook/assets/lopy4.png)](lopy4.md) +[![](/gitbook/assets/lopy4.png)](lopy4) diff --git a/getting-started/hardwaresetup/fipy.md b/content/getting-started/hardwaresetup/fipy.md similarity index 81% rename from getting-started/hardwaresetup/fipy.md rename to content/getting-started/hardwaresetup/fipy.md index d69cc6e..b0aa00a 100644 --- a/getting-started/hardwaresetup/fipy.md +++ b/content/getting-started/hardwaresetup/fipy.md @@ -1,54 +1,58 @@ -# 1.1.5 FiPy - +--- +title: "" +aliases: + - getting-started/hardwaresetup/fipy.html + - getting-started/hardwaresetup/fipy.md +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} * When using the expansion board with a FiPy, you will need to remove the CTS and RTS jumpers as these interfere with communication with the cellular modem. -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the FiPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_fipy.png) +![](/gitbook/assets/expansion_board_2_fipy.png) {% endtab %} {% tab title="Exp Board 3.0" %} * Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](https://docs.pycom.io/pytrackpysense/installation/firmware.html). * When using the expansion board with a FiPy, you will need to remove the CTS and RTS jumpers as these interfere with communication with the cellular modem. -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the FiPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_fipy.png) +![](/gitbook/assets/expansion_board_3_fipy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} * Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](https://docs.pycom.io/pytrackpysense/installation/firmware.html). -* Look for the reset button on the FiPy module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the FiPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/pysense_fipy.png) +![](/gitbook/assets/pysense_fipy.png) -![](../../.gitbook/assets/pytrack_fipy.png) +![](/gitbook/assets/pytrack_fipy.png) {% endtab %} {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your FiPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the FiPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the FiPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_fipy.png) +![](/gitbook/assets/uart_fipy.png) {% endtab %} {% tab title="WiFi" %} @@ -56,7 +60,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the FiPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the FiPy: -![](../../.gitbook/assets/bare_fipy.png) +![](/gitbook/assets/bare_fipy.png) * By default, when the FiPy boots, it will create a WiFi access point with the following credentials: * SSID: `fipy-wlan` @@ -71,44 +75,44 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Lora/Sigfox -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LoRa/Sigfox connectivity of the FiPy you **must** connect a LoRa/Sigfox antenna to your FiPy before trying to use LoRa/Sigfox otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} -{% hint style="info" %} +{{{% hint style="info" %}}} The FiPy only supports LoRa on the 868MHz or 915MHz bands. It does not support 433MHz. For this you will require a LoPy4. -{% endhint %} +{{< /hint >}} * Firstly you will need to connect the U.FL to SMA pig tail to the FiPy using the U.FL connector on the same side of the FiPy as the LED. -![](../../.gitbook/assets/lora_sigfox_pigtail_fipy.png) +![](/gitbook/assets/lora_sigfox_pigtail_fipy.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/lora_sigfox_pigtail_ant_fipy.png) +![](/gitbook/assets/lora_sigfox_pigtail_ant_fipy.png) ### LTE Cat-M1/NB-IoT -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the FiPy you **must** connect a LTE CAT-M1/NB-IoT antenna to your FiPy before trying to use LTE Cat-M1 or NB-IoT otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} * You will need to connect the antenna to the FiPy using the U.FL connector on the under side of the FiPy. -![](../../.gitbook/assets/lte_ant_fipy.png) +![](/gitbook/assets/lte_ant_fipy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the FiPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the FiPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.](https://docs.pycom.io/firmwareapi/pycom/network/wlan.html) -![](../../.gitbook/assets/wifi_pigtail_ant_fipy.png) +![](/gitbook/assets/wifi_pigtail_ant_fipy.png) ### SIM card {#sim-card} If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the FiPy you will need to insert a SIM card into your FiPy. It should be noted that the FiPy does not support regular LTE connectivity and you may require a special SIM. It is best to contact your local cellular providers for more information on acquiring a LTE CAT-M1/NB-IoT enabled nano SIM. -![](../../.gitbook/assets/sim_fipy.png) +![](/gitbook/assets/sim_fipy.png) diff --git a/getting-started/hardwaresetup/gpy.md b/content/getting-started/hardwaresetup/gpy.md similarity index 80% rename from getting-started/hardwaresetup/gpy.md rename to content/getting-started/hardwaresetup/gpy.md index 54635cf..562aec5 100644 --- a/getting-started/hardwaresetup/gpy.md +++ b/content/getting-started/hardwaresetup/gpy.md @@ -1,52 +1,56 @@ -# 1.1.4 GPy - +--- +title: "" +aliases: + - getting-started/hardwaresetup/gpy.html + - getting-started/hardwaresetup/gpy.md +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the GPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_gpy.png) +![](/gitbook/assets/expansion_board_2_gpy.png) {% endtab %} {% tab title="Exp Board 3.0" %} * Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the GPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_gpy.png) +![](/gitbook/assets/expansion_board_3_gpy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} * Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the GPy module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the GPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/pysense_gpy.png) +![](/gitbook/assets/pysense_gpy.png) -![](../../.gitbook/assets/pytrack_gpy.png) +![](/gitbook/assets/pytrack_gpy.png) {% endtab %} {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your GPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the GPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the GPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_gpy.png) +![](/gitbook/assets/uart_gpy.png) {% endtab %} {% tab title="WiFi" %} @@ -54,7 +58,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the GPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the GPy: -![](../../.gitbook/assets/bare_gpy.png) +![](/gitbook/assets/bare_gpy.png) * By default, when the GPy boots, it will create a WiFi access point with the following credentials: * SSID:`gpy-wlan` @@ -69,25 +73,25 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### LTE Cat-M1/NB-IoT -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the GPy you **must** connect a LTE CAT-M1/NB-IoT antenna to your GPy before trying to use LTE Cat-M1 or NB-IoT otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} * You will need to connect the antenna to the GPy using the U.FL connector on the same side of the GPy as the LED. -![](../../.gitbook/assets/lte_ant_gpy.png) +![](/gitbook/assets/lte_ant_gpy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the GPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the GPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.](https://docs.pycom.io/chapter/firmwareapi/pycom/network/wlan.html) -![](../../.gitbook/assets/wifi_pigtail_ant_gpy.png) +![](/gitbook/assets/wifi_pigtail_ant_gpy.png) ### SIM card {#sim-card} If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the GPy you will need to insert a SIM card into your GPy. It should be noted that the GPy does not support regular LTE connectivity and you may require a special SIM. It is best to contact your local cellular providers for more information on acquiring a LTE CAT-M1/NB-IoT enabled nano SIM. -![](../../.gitbook/assets/sim_gpy.png) +![](/gitbook/assets/sim_gpy.png) diff --git a/getting-started/hardwaresetup/lopy.md b/content/getting-started/hardwaresetup/lopy.md similarity index 81% rename from getting-started/hardwaresetup/lopy.md rename to content/getting-started/hardwaresetup/lopy.md index cd2e2a7..c39f3c7 100644 --- a/getting-started/hardwaresetup/lopy.md +++ b/content/getting-started/hardwaresetup/lopy.md @@ -1,52 +1,56 @@ -# 1.1.1 LoPy - +--- +title: "" +aliases: + - getting-started/hardwaresetup/lopy.html + - getting-started/hardwaresetup/lopy.md +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_lopy.png) +![](/gitbook/assets/expansion_board_2_lopy.png) {% endtab %} {% tab title="Exp Board 3.0" %} * Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](https://docs.pycom.io/pytrackpysense/installation/firmware.html). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_lopy.png) +![](/gitbook/assets/expansion_board_3_lopy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} * Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](https://docs.pycom.io/pytrackpysense/installation/firmware.html). -* Look for the reset button on the LoPy module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the LoPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/pysense_lopy.png) +![](/gitbook/assets/pysense_lopy.png) -![](../../.gitbook/assets/pytrack_lopy.png) +![](/gitbook/assets/pytrack_lopy.png) {% endtab %} {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your LoPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do _not_ feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the LoPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the LoPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_lopy.png) +![](/gitbook/assets/uart_lopy.png) {% endtab %} {% tab title="WiFi" %} @@ -54,7 +58,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the LoPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the LoPy: -![](../../.gitbook/assets/bare_lopy.png) +![](/gitbook/assets/bare_lopy.png) * By default, when the LoPy boots, it will create a WiFi access point with the following credentials: * SSID: `lopy-wlan` @@ -69,28 +73,28 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Lora -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LoRa connectivity of the LoPy you **must** connect a LoRa antenna to your LoPy before trying to use LoRa otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} -{% hint style="danger" %} +{{{% hint style="danger" %}}} The LoPy only supports LoRa on the 868MHz or 915MHz bands. It does not support 433MHz. For this you will require a LoPy4. -{% endhint %} +{{< /hint >}} * Firstly you will need to connect the U.FL to SMA pig tail to the LoPy using the U.FL connector on the same side of the LoPy as the LED. -![](../../.gitbook/assets/lora_pigtail_lopy.png) +![](/gitbook/assets/lora_pigtail_lopy.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/lora_pigtail_ant_lopy.png) +![](/gitbook/assets/lora_pigtail_ant_lopy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the LoPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the LoPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.](https://docs.pycom.io/chapter/firmwareapi/pycom/network/wlan.html) -![](../../.gitbook/assets/wifi_pigtail_ant_lopy.png) +![](/gitbook/assets/wifi_pigtail_ant_lopy.png) ### Deep Sleep current issue {#deep-sleep-current-issue} diff --git a/getting-started/hardwaresetup/lopy4.md b/content/getting-started/hardwaresetup/lopy4.md similarity index 77% rename from getting-started/hardwaresetup/lopy4.md rename to content/getting-started/hardwaresetup/lopy4.md index 15ad6e1..1b27f54 100644 --- a/getting-started/hardwaresetup/lopy4.md +++ b/content/getting-started/hardwaresetup/lopy4.md @@ -1,52 +1,56 @@ -# 1.1.2 LoPy4 - +--- +title: "" +aliases: + - getting-started/hardwaresetup/lopy4.html + - getting-started/hardwaresetup/lopy4.md +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy4 module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_lopy4.png) +![](/gitbook/assets/expansion_board_2_lopy4.png) {% endtab %} {% tab title="Exp Board 3.0" %} * Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy4 module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_lopy4.png) +![](/gitbook/assets/expansion_board_3_lopy4.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} * Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the LoPy4 module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the LoPy4 module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/pysense_lopy4.png) +![](/gitbook/assets/pysense_lopy4.png) -![](../../.gitbook/assets/pytrack_lopy4.png) +![](/gitbook/assets/pytrack_lopy4.png) {% endtab %} {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your LoPy4. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the LoPy4 respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the LoPy4 into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_lopy4.png) +![](/gitbook/assets/uart_lopy4.png) {% endtab %} {% tab title="WiFi" %} @@ -54,7 +58,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the LoPy4 via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the LoPy4: -![](../../.gitbook/assets/bare_lopy4.png) +![](/gitbook/assets/bare_lopy4.png) * By default, when the LoPy4 boots, it will create a WiFi access point with the following credentials: * SSID: `lopy4-wlan` @@ -69,24 +73,24 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Lora/Sigfox -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LoRa/Sigfox connectivity of the LoPy4 you **must** connect a LoRa/Sigfox antenna to your LoPy4 before trying to use LoRa/Sigfox otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} -* Firstly you will need to connect the U.FL to SMA pig tail to the LoPy4 using one of the two the U.FL connectors on the same side of the LoPy4 as the LED. The one on the left hand side is for 433MHz \(LoRa only\), the one of the right hand side is for 868MHz/915MHz \(LoRa & Sigfox\). **Note:** This is different from the LoPy. +* Firstly you will need to connect the U.FL to SMA pig tail to the LoPy4 using one of the two the U.FL connectors on the same side of the LoPy4 as the LED. The one on the left hand side is for 433MHz (LoRa only), the one of the right hand side is for 868MHz/915MHz (LoRa & Sigfox). **Note:** This is different from the LoPy. -![](../../.gitbook/assets/lora_sigfox_pigtail_lopy4.png) +![](/gitbook/assets/lora_sigfox_pigtail_lopy4.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png) +![](/gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the LoPy4, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the LoPy4 in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.](https://docs.pycom.io/chapter/firmwareapi/pycom/network/wlan.html) -![](../../.gitbook/assets/wifi_pigtail_ant_lopy4.png) +![](/gitbook/assets/wifi_pigtail_ant_lopy4.png) diff --git a/getting-started/hardwaresetup/sipy.md b/content/getting-started/hardwaresetup/sipy.md similarity index 81% rename from getting-started/hardwaresetup/sipy.md rename to content/getting-started/hardwaresetup/sipy.md index 0dee3b8..2a1a642 100644 --- a/getting-started/hardwaresetup/sipy.md +++ b/content/getting-started/hardwaresetup/sipy.md @@ -1,52 +1,56 @@ -# 1.1.3 SiPy - +--- +title: "" +aliases: + - getting-started/hardwaresetup/sipy.html + - getting-started/hardwaresetup/sipy.md +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the SiPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_sipy.png) +![](/gitbook/assets/expansion_board_2_sipy.png) {% endtab %} {% tab title="Exp Board 3.0" %} * Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the SiPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_sipy.png) +![](/gitbook/assets/expansion_board_3_sipy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} * Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the SiPy module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the SiPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/pysense_sipy.png) +![](/gitbook/assets/pysense_sipy.png) -![](../../.gitbook/assets/pytrack_sipy.png) +![](/gitbook/assets/pytrack_sipy.png) {% endtab %} {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your SiPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the SiPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the SiPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_sipy.png) +![](/gitbook/assets/uart_sipy.png) {% endtab %} {% tab title="WiFi" %} @@ -54,7 +58,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the SiPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the SiPy: -![](../../.gitbook/assets/bare_sipy.png) +![](/gitbook/assets/bare_sipy.png) * By default, when the SiPy boots, it will create a WiFi access point with the following credentials: * SSID: `sipy-wlan` @@ -69,24 +73,24 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Sigfox -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the Sigfox connectivity of the SiPy you **must** connect a Sigfox antenna to your SiPy before trying to use Sigfox otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} * Firstly you will need to connect the U.FL to SMA pig tail to the SiPy using the U.FL connector on the same side of the SiPy as the LED. -![](../../.gitbook/assets/sigfox_pigtail_sipy.png) +![](/gitbook/assets/sigfox_pigtail_sipy.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/sigfox_pigtail_ant_sipy.png) +![](/gitbook/assets/sigfox_pigtail_ant_sipy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the FiPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the FiPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.](https://docs.pycom.io/firmwareapi/pycom/network/wlan.html) -![](../../.gitbook/assets/wifi_pigtail_ant_sipy.png) +![](/gitbook/assets/wifi_pigtail_ant_sipy.png) ### Deep Sleep current issue {#deep-sleep-current-issue} diff --git a/getting-started/hardwaresetup/wipy.md b/content/getting-started/hardwaresetup/wipy.md similarity index 82% rename from getting-started/hardwaresetup/wipy.md rename to content/getting-started/hardwaresetup/wipy.md index 496b52e..492f12a 100644 --- a/getting-started/hardwaresetup/wipy.md +++ b/content/getting-started/hardwaresetup/wipy.md @@ -1,52 +1,56 @@ -# 1.1.6 WiPy - +--- +title: "" +aliases: + - getting-started/hardwaresetup/wipy.html + - getting-started/hardwaresetup/wipy.md +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the WiPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_wipy.png) +![](/gitbook/assets/expansion_board_2_wipy.png) {% endtab %} {% tab title="Exp Board 3.0" %} * Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the WiPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_wipy.png) +![](/gitbook/assets/expansion_board_3_wipy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} * Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](https://docs.pycom.io/chapter/pytrackpysense/installation/firmware.html). -* Look for the reset button on the WiPy module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the WiPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/pysense_wipy.png) +![](/gitbook/assets/pysense_wipy.png) -![](../../.gitbook/assets/pytrack_wipy.png) +![](/gitbook/assets/pytrack_wipy.png) {% endtab %} {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your WiPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the WiPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the WiPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_wipy.png) +![](/gitbook/assets/uart_wipy.png) {% endtab %} {% tab title="WiFi" %} @@ -54,7 +58,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the WiPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the WiPy: -![](../../.gitbook/assets/bare_wipy.png) +![](/gitbook/assets/bare_wipy.png) * By default, when the WiPy boots, it will create a WiFi access point with the following credentials: * SSID: `wipy-wlan` @@ -67,11 +71,11 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ## Antennas -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the WiPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the WiPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.](https://docs.pycom.io/chapter/firmwareapi/pycom/network/wlan.html) -![](../../.gitbook/assets/wifi_pigtail_ant_wipy.png) +![](/gitbook/assets/wifi_pigtail_ant_wipy.png) ### Deep Sleep current issue {#deep-sleep-current-issue} @@ -84,5 +88,5 @@ The WiPy 3.0 is an upgraded version of the WiPy 2.0 with the following changes: * The FLASH has been upgraded from 4MB to 8MB. * The RAM has been upgraded from 512KB to 4MB. * The deepsleep current consumption issue has been fixed -* The antenna select pin has moved to GPIO21 \(P12\) +* The antenna select pin has moved to GPIO21 (P12) diff --git a/gettingstarted/introduction.md b/content/gettingstarted/_index.md similarity index 87% rename from gettingstarted/introduction.md rename to content/gettingstarted/_index.md index 066678c..d20b28c 100644 --- a/gettingstarted/introduction.md +++ b/content/gettingstarted/_index.md @@ -1,8 +1,10 @@ -# Introduction +--- +title: "" +aliases: +--- +So, you've decided to order a Pycom development module. Firstly we would like to congratulate you in making an excellent decision. If you haven't yet placed your order we highly recommend you check out the [products](/products) page before you place your order to ensure you know which accessories you might require. -So, you've decided to order a Pycom development module. Firstly we would like to congratulate you in making an excellent decision. If you haven't yet placed your order we highly recommend you check out the [products](../products.md) page before you place your order to ensure you know which accessories you might require. - -![](../.gitbook/assets/getting_started%20%281%29.png) +![](/gitbook/assets/getting_started%20%281%29.png) ## [Step 1: Setting up the hardware](connection/) @@ -20,7 +22,7 @@ Now that you have a connected module and all the required software installed it Now that you familiar with programming your device you will no doubt be keen to get it connected to one of the advertised wireless networks. This usually requires some registration. This step will detail how to get registered and connected to various wireless networks. -{% hint style="info" %} +{{{% hint style="info" %}}} You can navigate through this guide using the arrow buttons at the bottom of the page. -{% endhint %} +{{< /hint >}} diff --git a/content/gettingstarted/connection/README.md b/content/gettingstarted/connection/README.md new file mode 100644 index 0000000..bfa99d3 --- /dev/null +++ b/content/gettingstarted/connection/README.md @@ -0,0 +1,19 @@ +--- +title: "Hardware Setup" +aliases: + - chapter/gettingstarted/hardwaresetup +--- +This chapter of the documentation will show you how to connect you Pycom module. For each device there are detailed instructions on how to connect your module to one of our base boards, a USB UART adapter or WiFi as well as what antennas you might need to connect. Please select your module below to be taken to the appropriate guide. + +{{% refname "lopy.md" %}} + +{{% refname "lopy4.md" %}} + +{{% refname "sipy.md" %}} + +{{% refname "gpy.md" %}} + +{{% refname "fipy.md" %}} + +{{% refname "wipy.md" %}} + diff --git a/gettingstarted/connection/README.md b/content/gettingstarted/connection/_index.md similarity index 63% rename from gettingstarted/connection/README.md rename to content/gettingstarted/connection/_index.md index 2447edb..48cf0cf 100644 --- a/gettingstarted/connection/README.md +++ b/content/gettingstarted/connection/_index.md @@ -1,16 +1,18 @@ -# Hardware Setup - +--- +title: "Hardware Setup" +aliases: +--- This chapter of the documentation will show you how to connect you Pycom module. For each device there are detailed instructions on how to connect your module to one of our base boards, a USB UART adapter or WiFi as well as what antennas you might need to connect. Please select your module below to be taken to the appropriate guide. -{% page-ref page="lopy.md" %} +{{% refname "lopy.md" %}} -{% page-ref page="lopy4.md" %} +{{% refname "lopy4.md" %}} -{% page-ref page="sipy.md" %} +{{% refname "sipy.md" %}} -{% page-ref page="gpy.md" %} +{{% refname "gpy.md" %}} -{% page-ref page="fipy.md" %} +{{% refname "fipy.md" %}} -{% page-ref page="wipy.md" %} +{{% refname "wipy.md" %}} diff --git a/gettingstarted/connection/fipy.md b/content/gettingstarted/connection/fipy.md similarity index 79% rename from gettingstarted/connection/fipy.md rename to content/gettingstarted/connection/fipy.md index 499f9cf..9950060 100644 --- a/gettingstarted/connection/fipy.md +++ b/content/gettingstarted/connection/fipy.md @@ -1,30 +1,36 @@ -# FiPy - +--- +title: "FiPy" +aliases: + - gettingstarted/connection/fipy.html + - gettingstarted/connection/fipy.md + - chapter/gettingstarted/connection/fipy + - gettingstarted/fipy.html +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} * When using the expansion board with a FiPy, you will need to remove the CTS and RTS jumpers as these interfere with communication with the cellular modem. -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the FiPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_fipy.png) +![](/gitbook/assets/expansion_board_2_fipy.png) {% endtab %} {% tab title="Exp Board 3.0" %} -* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). +* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). * When using the expansion board with a FiPy, you will need to remove the CTS and RTS jumpers as these interfere with communication with the cellular modem. -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the FiPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_fipy.png) +![](/gitbook/assets/expansion_board_3_fipy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} -* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the FiPy module \(located at a corner of the board, next to the LED\). +* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the FiPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. ![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqVauBuoNMgcByrNql%2FPysense_FiPy.png?generation=1534772069160637&alt=media)![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqVdDdxkK38AlRxtkc%2FPytrack_FiPy.png?generation=1534772071490748&alt=media) {% endtab %} @@ -32,19 +38,19 @@ {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your FiPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the FiPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the FiPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_fipy.png) +![](/gitbook/assets/uart_fipy.png) {% endtab %} {% tab title="WiFi" %} @@ -52,7 +58,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the FiPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the FiPy: -![](../../.gitbook/assets/bare_fipy.png) +![](/gitbook/assets/bare_fipy.png) * By default, when the FiPy boots, it will create a WiFi access point with the following credentials: * SSID: `fipy-wlan` @@ -67,42 +73,42 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Lora/Sigfox -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LoRa/Sigfox connectivity of the FiPy you **must** connect a LoRa/Sigfox antenna to your FiPy before trying to use LoRa/Sigfox otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} -{% hint style="info" %} +{{{% hint style="info" %}}} The FiPy only supports LoRa on the 868MHz or 915MHz bands. It does not support 433MHz. For this you will require a LoPy4. -{% endhint %} +{{< /hint >}} * Firstly you will need to connect the U.FL to SMA pig tail to the FiPy using the U.FL connector on the same side of the FiPy as the LED. -![](../../.gitbook/assets/lora_sigfox_pigtail_fipy.png) +![](/gitbook/assets/lora_sigfox_pigtail_fipy.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/lora_sigfox_pigtail_ant_fipy.png) +![](/gitbook/assets/lora_sigfox_pigtail_ant_fipy.png) ### LTE Cat-M1/NB-IoT -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the FiPy you **must** connect a LTE CAT-M1/NB-IoT antenna to your FiPy before trying to use LTE Cat-M1 or NB-IoT otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} * You will need to connect the antenna to the FiPy using the U.FL connector on the under side of the FiPy. -![](../../.gitbook/assets/lte_ant_fipy.png) +![](/gitbook/assets/lte_ant_fipy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the FiPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the FiPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.]() -![](../../.gitbook/assets/wifi_pigtail_ant_fipy.png) +![](/gitbook/assets/wifi_pigtail_ant_fipy.png) ### SIM card If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the FiPy you will need to insert a SIM card into your FiPy. It should be noted that the FiPy does not support regular LTE connectivity and you may require a special SIM. It is best to contact your local cellular providers for more information on acquiring a LTE CAT-M1/NB-IoT enabled nano SIM. -![](../../.gitbook/assets/sim_fipy.png) +![](/gitbook/assets/sim_fipy.png) diff --git a/gettingstarted/connection/gpy.md b/content/gettingstarted/connection/gpy.md similarity index 78% rename from gettingstarted/connection/gpy.md rename to content/gettingstarted/connection/gpy.md index 164eeb6..3daba65 100644 --- a/gettingstarted/connection/gpy.md +++ b/content/gettingstarted/connection/gpy.md @@ -1,28 +1,34 @@ -# GPy - +--- +title: "GPy" +aliases: + - gettingstarted/connection/gpy.html + - gettingstarted/connection/gpy.md + - chapter/gettingstarted/connection/gpy + - gettingstarted/gpy.html +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the GPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_gpy.png) +![](/gitbook/assets/expansion_board_2_gpy.png) {% endtab %} {% tab title="Exp Board 3.0" %} -* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the GPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_gpy.png) +![](/gitbook/assets/expansion_board_3_gpy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} -* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the GPy module \(located at a corner of the board, next to the LED\). +* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the GPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. ![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqejpmTIS1tbGw0Vrl%2FPysense_GPy.png?generation=1534772072781141&alt=media)![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqekpWIfccll6qkt85%2FPytrack_GPy.png?generation=1534772080535030&alt=media) {% endtab %} @@ -30,19 +36,19 @@ {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your GPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the GPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the GPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_gpy.png) +![](/gitbook/assets/uart_gpy.png) {% endtab %} {% tab title="WiFi" %} @@ -50,7 +56,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the GPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the GPy: -![](../../.gitbook/assets/bare_gpy.png) +![](/gitbook/assets/bare_gpy.png) * By default, when the GPy boots, it will create a WiFi access point with the following credentials: * SSID:`gpy-wlan` @@ -65,23 +71,23 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### LTE Cat-M1/NB-IoT -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the GPy you **must** connect a LTE CAT-M1/NB-IoT antenna to your GPy before trying to use LTE Cat-M1 or NB-IoT otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} * You will need to connect the antenna to the GPy using the U.FL connector on the same side of the GPy as the LED. -![](../../.gitbook/assets/lte_ant_gpy.png) +![](/gitbook/assets/lte_ant_gpy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the GPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the GPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.]() -![](../../.gitbook/assets/wifi_pigtail_ant_gpy.png) +![](/gitbook/assets/wifi_pigtail_ant_gpy.png) ### SIM card If you intend on using the LTE CAT-M1 or NB-IoT connectivity of the GPy you will need to insert a SIM card into your GPy. It should be noted that the GPy does not support regular LTE connectivity and you may require a special SIM. It is best to contact your local cellular providers for more information on acquiring a LTE CAT-M1/NB-IoT enabled nano SIM. -![](../../.gitbook/assets/sim_gpy.png) +![](/gitbook/assets/sim_gpy.png) diff --git a/gettingstarted/connection/lopy.md b/content/gettingstarted/connection/lopy.md similarity index 84% rename from gettingstarted/connection/lopy.md rename to content/gettingstarted/connection/lopy.md index a9e1c8e..d2035de 100644 --- a/gettingstarted/connection/lopy.md +++ b/content/gettingstarted/connection/lopy.md @@ -1,10 +1,16 @@ -# LoPy - +--- +title: "LoPy" +aliases: + - gettingstarted/connection/lopy.html + - gettingstarted/connection/lopy.md + - chapter/gettingstarted/connection/lopy + - gettingstarted/lopy.html +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. @@ -12,8 +18,8 @@ {% endtab %} {% tab title="Exp Board 3.0" %} -* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. @@ -21,8 +27,8 @@ {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} -* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the LoPy module \(located at a corner of the board, next to the LED\). +* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the LoPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. @@ -32,15 +38,15 @@ {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your LoPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the LoPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the LoPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. @@ -67,28 +73,28 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Lora -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LoRa connectivity of the LoPy you **must** connect a LoRa antenna to your LoPy before trying to use LoRa otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} -{% hint style="danger" %} +{{{% hint style="danger" %}}} The LoPy only supports LoRa on the 868MHz or 915MHz bands. It does not support 433MHz. For this you will require a LoPy4. -{% endhint %} +{{< /hint >}} * Firstly you will need to connect the U.FL to SMA pig tail to the LoPy using the U.FL connector on the same side of the LoPy as the LED. -![](../../.gitbook/assets/lora_pigtail_lopy.png) +![](/gitbook/assets/lora_pigtail_lopy.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/lora_pigtail_ant_lopy.png) +![](/gitbook/assets/lora_pigtail_ant_lopy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the LoPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the LoPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.]() -![](../../.gitbook/assets/wifi_pigtail_ant_lopy.png) +![](/gitbook/assets/wifi_pigtail_ant_lopy.png) ## Deep Sleep current issue diff --git a/gettingstarted/connection/lopy4.md b/content/gettingstarted/connection/lopy4.md similarity index 75% rename from gettingstarted/connection/lopy4.md rename to content/gettingstarted/connection/lopy4.md index 4872462..5db3089 100644 --- a/gettingstarted/connection/lopy4.md +++ b/content/gettingstarted/connection/lopy4.md @@ -1,28 +1,34 @@ -# LoPy 4 - +--- +title: "LoPy 4" +aliases: + - gettingstarted/connection/lopy4.html + - gettingstarted/connection/lopy4.md + - chapter/gettingstarted/connection/lopy4 + - gettingstarted/lopy4.html +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy4 module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_lopy4.png) +![](/gitbook/assets/expansion_board_2_lopy4.png) {% endtab %} {% tab title="Exp Board 3.0" %} -* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the LoPy4 module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_lopy4.png) +![](/gitbook/assets/expansion_board_3_lopy4.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} -* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the LoPy4 module \(located at a corner of the board, next to the LED\). +* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the LoPy4 module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. ![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqbk7blltxqNtvQzH_%2FPysense_LoPy4.png?generation=1534772087747503&alt=media)![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqblUw130dL1aMAkLT%2FPytrack_LoPy4.png?generation=1534772079835788&alt=media) {% endtab %} @@ -30,19 +36,19 @@ {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your LoPy4. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the LoPy4 respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the LoPy4 into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_lopy4.png) +![](/gitbook/assets/uart_lopy4.png) {% endtab %} {% tab title="WiFi" %} @@ -50,7 +56,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the LoPy4 via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the LoPy4: -![](../../.gitbook/assets/bare_lopy4.png) +![](/gitbook/assets/bare_lopy4.png) * By default, when the LoPy4 boots, it will create a WiFi access point with the following credentials: * SSID: `lopy4-wlan` @@ -65,22 +71,22 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Lora/Sigfox -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the LoRa/Sigfox connectivity of the LoPy4 you **must** connect a LoRa/Sigfox antenna to your LoPy4 before trying to use LoRa/Sigfox otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} -* Firstly you will need to connect the U.FL to SMA pig tail to the LoPy4 using one of the two the U.FL connectors on the same side of the LoPy4 as the LED. The one on the left hand side is for 433MHz \(LoRa only\), the one of the right hand side is for 868MHz/915MHz \(LoRa & Sigfox\). **Note:** This is different from the LoPy. +* Firstly you will need to connect the U.FL to SMA pig tail to the LoPy4 using one of the two the U.FL connectors on the same side of the LoPy4 as the LED. The one on the left hand side is for 433MHz (LoRa only), the one of the right hand side is for 868MHz/915MHz (LoRa & Sigfox). **Note:** This is different from the LoPy. -![](../../.gitbook/assets/lora_sigfox_pigtail_lopy4.png) +![](/gitbook/assets/lora_sigfox_pigtail_lopy4.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png) +![](/gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the LoPy4, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the LoPy4 in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.]() -![](../../.gitbook/assets/wifi_pigtail_ant_lopy4.png) +![](/gitbook/assets/wifi_pigtail_ant_lopy4.png) diff --git a/gettingstarted/connection/sipy.md b/content/gettingstarted/connection/sipy.md similarity index 79% rename from gettingstarted/connection/sipy.md rename to content/gettingstarted/connection/sipy.md index 1c4312a..b442f0d 100644 --- a/gettingstarted/connection/sipy.md +++ b/content/gettingstarted/connection/sipy.md @@ -1,28 +1,34 @@ -# SiPy - +--- +title: "SiPy" +aliases: + - gettingstarted/connection/sipy.html + - gettingstarted/connection/sipy.md + - chapter/gettingstarted/connection/sipy + - gettingstarted/sipy.html +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the SiPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_sipy.png) +![](/gitbook/assets/expansion_board_2_sipy.png) {% endtab %} {% tab title="Exp Board 3.0" %} -* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the SiPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_sipy.png) +![](/gitbook/assets/expansion_board_3_sipy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} -* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the SiPy module \(located at a corner of the board, next to the LED\). +* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the SiPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. ![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqd_e51Wyuw40k6yJv%2FPysense_SiPy.png?generation=1534772077104600&alt=media)![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqdauW7rAnQlc-AL07%2FPytrack_SiPy.png?generation=1534772072530754&alt=media) {% endtab %} @@ -30,19 +36,19 @@ {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your SiPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the SiPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the SiPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_sipy.png) +![](/gitbook/assets/uart_sipy.png) {% endtab %} {% tab title="WiFi" %} @@ -50,7 +56,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the SiPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the SiPy: -![](../../.gitbook/assets/bare_sipy.png) +![](/gitbook/assets/bare_sipy.png) * By default, when the SiPy boots, it will create a WiFi access point with the following credentials: * SSID: `sipy-wlan` @@ -65,24 +71,24 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ### Sigfox -{% hint style="danger" %} +{{{% hint style="danger" %}}} If you intend on using the Sigfox connectivity of the SiPy you **must** connect a Sigfox antenna to your SiPy before trying to use Sigfox otherwise you risk damaging the device. -{% endhint %} +{{< /hint >}} * Firstly you will need to connect the U.FL to SMA pig tail to the SiPy using the U.FL connector on the same side of the SiPy as the LED. -![](../../.gitbook/assets/sigfox_pigtail_sipy.png) +![](/gitbook/assets/sigfox_pigtail_sipy.png) * If you are using a pycase, you will next need to put the SMA connector through the antenna hole, ensuring you align the flat edge correctly, and screw down the connector using the provided nut. * Finally you will need to screw on the antenna to the SMA connector. -![](../../.gitbook/assets/sigfox_pigtail_ant_sipy.png) +![](/gitbook/assets/sigfox_pigtail_ant_sipy.png) -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the FiPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the FiPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.]() -![](../../.gitbook/assets/wifi_pigtail_ant_sipy.png) +![](/gitbook/assets/wifi_pigtail_ant_sipy.png) ## Deep Sleep current issue diff --git a/gettingstarted/connection/wipy.md b/content/gettingstarted/connection/wipy.md similarity index 79% rename from gettingstarted/connection/wipy.md rename to content/gettingstarted/connection/wipy.md index 66fbe70..0b9260d 100644 --- a/gettingstarted/connection/wipy.md +++ b/content/gettingstarted/connection/wipy.md @@ -1,28 +1,34 @@ -# WiPy - +--- +title: "WiPy" +aliases: + - gettingstarted/connection/wipy.html + - gettingstarted/connection/wipy.md + - chapter/gettingstarted/connection/wipy + - gettingstarted/wipy.html +--- ## Basic connection {% tabs %} {% tab title="Exp Board 2.0" %} -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the WiPy module on the the expansion board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_2_wipy.png) +![](/gitbook/assets/expansion_board_2_wipy.png) {% endtab %} {% tab title="Exp Board 3.0" %} -* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the module \(located at a corner of the board, next to the LED\). +* Before connecting your module to an Expansion Board 3.0, you should update the firmware on the Expansion Board 3.0. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the module (located at a corner of the board, next to the LED). * Locate the USB connector on the expansion board. * Insert the WiPy module on the Expansion Board with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. -![](../../.gitbook/assets/expansion_board_3_wipy.png) +![](/gitbook/assets/expansion_board_3_wipy.png) {% endtab %} {% tab title="Pytrack/Pysense/Pyscan" %} -* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). -* Look for the reset button on the WiPy module \(located at a corner of the board, next to the LED\). +* Before connecting your module to a Pysense/Pytrack/Pyscan board, you should update the firmware on the Pysense/Pytrack/Pyscan. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). +* Look for the reset button on the WiPy module (located at a corner of the board, next to the LED). * Locate the USB connector on the Pysense/Pytrack/Pyscan. * Insert the module on the Pysense/Pytrack/Pyscan with the reset button pointing towards the USB connector. It should firmly click into place and the pins should now no longer be visible. ![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqfutE_BZ6gjVdmiv0%2FPysense_WiPy.png?generation=1534772071067482&alt=media)![](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LIfiUlGe6_zTmmvcuEa%2F-LKMXk1KQvBgjpw04I3u%2F-LIqfvoSjvxTIwgw2MSg%2FPytrack_WiPy.png?generation=1534772075484372&alt=media) {% endtab %} @@ -30,19 +36,19 @@ {% tab title="USB UART Adapter" %} * Firstly you will need to connect power to your WiPy. You will need to supply `3.5v`-`5.5v` to the `Vin` pin. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Do **not** feed `3.3v` directly to the `3.3v` supply pin, this will damage the regulator. -{% endhint %} +{{< /hint >}} * The connect the `RX` and `TX` of your USB UART to the `TX` and `RX` of the WiPy respectively. -{% hint style="warning" %} +{{{% hint style="warning" %}}} Please ensure you have the signal level of the UART adapter set to `3.3v` before connecting it. -{% endhint %} +{{< /hint >}} * In order to put the WiPy into bootloader mode to update the device firmware you will need to connect `P2` to `GND`. We recommend you connect a button between the two to make this simpler. -![](../../.gitbook/assets/uart_wipy.png) +![](/gitbook/assets/uart_wipy.png) {% endtab %} {% tab title="WiFi" %} @@ -50,7 +56,7 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before * In order to access the WiPy via WiFi you only need to provide `3.5v` - `5.5v` on the `Vin` pin of the WiPy: -![](../../.gitbook/assets/bare_wipy.png) +![](/gitbook/assets/bare_wipy.png) * By default, when the WiPy boots, it will create a WiFi access point with the following credentials: * SSID: `wipy-wlan` @@ -63,11 +69,11 @@ Please ensure you have the signal level of the UART adapter set to `3.3v` before ## Antennas -### WiFi/Bluetooth \(optional\) +### WiFi/Bluetooth (optional) All Pycom modules, including the WiPy, come with a on-board WiFi antenna as well as a U.FL connector for an external antenna. The external antenna is optional and only required if you need better performance or are mounting the WiPy in such a way that the WiFi signal is blocked. Switching between the antennas is done via software, instructions for this can be found [here.]() -![](../../.gitbook/assets/wifi_pigtail_ant_wipy.png) +![](/gitbook/assets/wifi_pigtail_ant_wipy.png) ## Deep Sleep current issue @@ -80,5 +86,5 @@ The WiPy 3.0 is an upgraded version of the WiPy 2.0 with the following changes: * The FLASH has been upgraded from 4MB to 8MB. * The RAM has been upgraded from 512KB to 4MB. * The deepsleep current consumption issue has been fixed -* The antenna select pin has moved to GPIO21 \(P12\) +* The antenna select pin has moved to GPIO21 (P12) diff --git a/content/gettingstarted/installation/README.md b/content/gettingstarted/installation/README.md new file mode 100644 index 0000000..6a51ff0 --- /dev/null +++ b/content/gettingstarted/installation/README.md @@ -0,0 +1,11 @@ +--- +title: "Software" +aliases: + - chapter/gettingstarted/installation/installingsoftware +--- +To get you up and running, Pycom provides a suite of tools to assist with developing and programming your Pycom Devices: + +1. [**Drivers:**](drivers) If you are using Microsoft Windows, you might be required to install drivers for our products to function correctly. +2. [**Pycom firmware update utility:**](firmwaretool) This tool automates the process of upgrading the firmware of your Pycom device. It is important that you use this tool before you attempt to use your device. Not only to ensure you have the most stable and feature packed firmware, but also to ensure all the functionality of your device is enable. E.g. this tool also activates your two year free sigfox connectivity. +3. [**Development Environment:**](pymakr) Pymakr is a plug-in for Atom and Visual Studio Code developed by Pycom to make development for Pycom modules super easy. It allows you to use your favourite text editor while simplifying the process of uploading code to the device. + diff --git a/content/gettingstarted/installation/_index.md b/content/gettingstarted/installation/_index.md new file mode 100644 index 0000000..e68cb9d --- /dev/null +++ b/content/gettingstarted/installation/_index.md @@ -0,0 +1,10 @@ +--- +title: "Software" +aliases: +--- +To get you up and running, Pycom provides a suite of tools to assist with developing and programming your Pycom Devices: + +1. [**Drivers:**](drivers) If you are using Microsoft Windows, you might be required to install drivers for our products to function correctly. +2. [**Pycom firmware update utility:**](firmwaretool) This tool automates the process of upgrading the firmware of your Pycom device. It is important that you use this tool before you attempt to use your device. Not only to ensure you have the most stable and feature packed firmware, but also to ensure all the functionality of your device is enable. E.g. this tool also activates your two year free sigfox connectivity. +3. [**Development Environment:**](pymakr) Pymakr is a plug-in for Atom and Visual Studio Code developed by Pycom to make development for Pycom modules super easy. It allows you to use your favourite text editor while simplifying the process of uploading code to the device. + diff --git a/gettingstarted/installation/drivers.md b/content/gettingstarted/installation/drivers.md similarity index 79% rename from gettingstarted/installation/drivers.md rename to content/gettingstarted/installation/drivers.md index b8d94b8..52de00f 100644 --- a/gettingstarted/installation/drivers.md +++ b/content/gettingstarted/installation/drivers.md @@ -1,5 +1,10 @@ -# Drivers - +--- +title: "Drivers" +aliases: + - gettingstarted/installation/drivers.html + - gettingstarted/installation/drivers.md + - chapter/gettingstarted/installation/drivers +--- ## Linux You should not need to install any drivers for our devices to be recognised by Linux. You may how ever need to adjust permissions to make sure you have access to the serial port. On most distributions this can be done by adding your user to the `dialout` user group. Please check the specific instructions for your linux distribution for how to do this. @@ -22,33 +27,33 @@ Please download the driver software from the link below. First navigate open the Windows start menu and search/navigate to \`Device Manager. You should see your Pytrack/Pysense in the dropdown under **other devices**. -![](../../.gitbook/assets/win7-1.png) +![](/gitbook/assets/win7-1.png) Right click the device and select `Update Driver Software`. -![](../../.gitbook/assets/win7-2%20%281%29.png) +![](/gitbook/assets/win7-2%20%281%29.png) Select the option to **Browse my computer for driver software**. -![](../../.gitbook/assets/win7-3.png) +![](/gitbook/assets/win7-3.png) -Next you will need to navigate to where you downloaded the driver to \(e.g. **Downloads** Folder\). +Next you will need to navigate to where you downloaded the driver to (e.g. **Downloads** Folder). -![](../../.gitbook/assets/win7-4%20%281%29.png) +![](/gitbook/assets/win7-4%20%281%29.png) Specify the folder in which the drivers are contained. If you haven't extracted the `.zip` file, please do this before selecting the folder. -![](../../.gitbook/assets/win7-5%20%281%29.png) +![](/gitbook/assets/win7-5%20%281%29.png) You may receive a warning, suggesting that Windows can't verify the publisher of this driver. Click `Install this driver software anyway` as this link points to our official driver. -![](../../.gitbook/assets/win7-6%20%281%29.png) +![](/gitbook/assets/win7-6%20%281%29.png) If the installation was successful, you should now see a window specifying that the driver was correctly installed. -![](../../.gitbook/assets/win7-7.png) +![](/gitbook/assets/win7-7.png) To confirm that the installation was correct, navigate back to the `Device Manager` and click the dropdown for other devices. The warning label should now be gone and Pytrack/Pysense should be installed. -![](../../.gitbook/assets/win7-8.png) +![](/gitbook/assets/win7-8.png) diff --git a/gettingstarted/installation/firmwaretool.md b/content/gettingstarted/installation/firmwaretool.md similarity index 67% rename from gettingstarted/installation/firmwaretool.md rename to content/gettingstarted/installation/firmwaretool.md index adaaaf1..0e960a1 100644 --- a/gettingstarted/installation/firmwaretool.md +++ b/content/gettingstarted/installation/firmwaretool.md @@ -1,56 +1,60 @@ -# Updating Firmware - +--- +title: "Updating Firmware" +aliases: + - gettingstarted/installation/firmwaretool.html + - gettingstarted/installation/firmwaretool.md + - gettingstarted/installation/firmwaretool +--- We strongly recommend you to upgrade your firmware to the latest version as we are constantly making improvements and adding new features to the devices. Here are the download links to the update tool. Please download the appropriate one for your OS and follow the instructions on the screen. * [Windows](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=win32&redirect=true) -* [macOS](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=macos&redirect=true) \(10.11 or Higher\) -* [Linux](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=unix&redirect=true) \(requires `dialog` and `python-serial` package\) +* [macOS](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=macos&redirect=true) (10.11 or Higher) +* [Linux](https://software.pycom.io/findupgrade?product=pycom-firmware-updater&type=all&platform=unix&redirect=true) (requires `dialog` and `python-serial` package) -{% hint style="info" %} -Previous versions of firmware are available for download [**here**](../../advance/downgrade.md). -{% endhint %} +{{{% hint style="info" %}}} +Previous versions of firmware are available for download [**here**](/../advance/downgrade). +{{< /hint >}} ## Updating Device Firmware The basic firmware upgrade procedure can be found below, please follow these steps carefully: -After you’re done with upgrading, you can use the Pymakr Plugins to upload and run programs in your device. +After you're done with upgrading, you can use the Pymakr Plugins to upload and run programs in your device. {% tabs %} {% tab title="Expansion Board 2.0" %} 1. Disconnect your device from your computer 2. Insert module into the Expansion Board 3. Connect a jumper cable or wire between `G23` and `GND` -4. Reconnect the board via USB to your computer, this puts the device in ‘firmware update mode’. +4. Reconnect the board via USB to your computer, this puts the device in ‘firmware update mode'. 5. Run the Firmware Upgrade tool -![](../../.gitbook/assets/firmware-update.png) +![](/gitbook/assets/firmware-update.png) 6. Remove the `G23` to `GND` jumper cable/wire -7. Reboot the device \(button or power off then on\), your device is now ready to use +7. Reboot the device (button or power off then on), your device is now ready to use If you are having any issues, make sure the **TX and RX jumpers** are present on your Expansion Board, as the jumpers sometimes come loose in the box during transport. Without these jumpers, the updater will fail. {% endtab %} {% tab title=" Pysense/Pytrack/Pyscan/Expansion Board 3.0" %} -{% hint style="info" %} +{{{% hint style="info" %}}} When using a Pysense/Pytrack/Pyscan/Expansion Board 3.0 to update your module you are not required to make a connection between `G23` and `GND`, the Pysense/Pytrack/Pyscan/Expansion Board 3.0 will do this automatically. -{% endhint %} +{{< /hint >}} -1. Before connecting your module to a Pysense/Pytrack board, you should update the firmware on the Pysense/Pytrack. Instructions on how to do this can be found [here](../../pytrackpysense/installation/firmware.md). +1. Before connecting your module to a Pysense/Pytrack board, you should update the firmware on the Pysense/Pytrack. Instructions on how to do this can be found [here](/../pytrackpysense/installation/firmware). 2. Disconnect your device from your computer 3. Insert module into Expansion Board 4. Reconnect the board via USB to your computer 5. Run the Firmware Upgrade tool -![](../../.gitbook/assets/firmware-update-2.png) +![](/gitbook/assets/firmware-update-2.png) 6. Disconnect the USB cable from the board and reconnect it, your device is now ready to use {% endtab %} {% endtabs %} -After you’re done with upgrading, you can use the Pymakr Plugins to upload and run programs in your device. - +After you're done with upgrading, you can use the Pymakr Plugins to upload and run programs in your device. diff --git a/content/gettingstarted/installation/pymakr.md b/content/gettingstarted/installation/pymakr.md new file mode 100644 index 0000000..7b7e56a --- /dev/null +++ b/content/gettingstarted/installation/pymakr.md @@ -0,0 +1,17 @@ +--- +title: "Pymakr" +aliases: + - gettingstarted/installation/pymakr.html + - gettingstarted/installation/pymakr.md + - chapter/gettingstarted/installation/pymakr +--- +![](/gitbook/assets/pymakr-logo-1%20%281%29.png) + +## Pymakr Plugins + +To make it as easy as possible Pycom has developed a plugin for two popular text editors, called Pymakr. These plugins have been built and are available for the following platforms: + +{{% refname "../../pymakr/installation/atom.md" %}} + +{{% refname "../../pymakr/installation/vscode.md" %}} + diff --git a/content/gettingstarted/introduction.md b/content/gettingstarted/introduction.md new file mode 100644 index 0000000..47edc50 --- /dev/null +++ b/content/gettingstarted/introduction.md @@ -0,0 +1,34 @@ +--- +title: "Introduction" +aliases: + - gettingstarted/introduction.html + - gettingstarted/introduction.md + - chapter/gettingstarted + - getting-started + - getting-started/introduction + - chapter/gettingstarted/introduction +--- +So, you've decided to order a Pycom development module. Firstly we would like to congratulate you in making an excellent decision. If you haven't yet placed your order we highly recommend you check out the [products](/products) page before you place your order to ensure you know which accessories you might require. + +![](/gitbook/assets/getting_started%20%281%29.png) + +## [Step 1: Setting up the hardware](connection/) + +In the first part of this getting started guide, we will take you through setting up your device. Firstly we will cover how to connect the module to your computer either via USB or WiFi. Secondly we will explain how to connect various accessories such as antennas or SIM cards to your module. + +## [Step 2: Setting up your computer](installation/) + +Now that your module is successfully connected, you will need to install some software on your computer to interface with it. The second part of this guide will guide you through installing drivers; performing firmware updates for your module/accessories to ensure you have the most stable and feature packed version; and how to setup the software use to program the device. + +## [Step 3: Using your module](programming/) + +Now that you have a connected module and all the required software installed it is time to begin programming your device. This part of the guide will get you started with a basic example and point you in the right direction for getting your device connected to your chosen network. + +## [Step 4: Connecting to a network](registration/) + +Now that you familiar with programming your device you will no doubt be keen to get it connected to one of the advertised wireless networks. This usually requires some registration. This step will detail how to get registered and connected to various wireless networks. + +{{{% hint style="info" %}}} +You can navigate through this guide using the arrow buttons at the bottom of the page. +{{< /hint >}} + diff --git a/content/gettingstarted/programming/README.md b/content/gettingstarted/programming/README.md new file mode 100644 index 0000000..10db8f4 --- /dev/null +++ b/content/gettingstarted/programming/README.md @@ -0,0 +1,19 @@ +--- +title: "Programming the modules" +aliases: + - chapter/gettingstarted/programming +--- +Now that you have connected and updated your pycom module and installed all the required software on your computer, we can begin programming your Pycom module. + +If this is your first time using a Pycom module we highly recommend you read through the following pages: + +* [**Introduction to MicroPython:**](micropython) This page will explain what Micropython is and its relation to Python. +* [**MicroPython Examples:**](examples) We also recommend you browse these short MicroPython examples to familiarise yourself with its syntax. This is not meant as a comprehensive guide to MicroPython programming but rather a reference to those who already know programming. If you are new to python, or programming all together, we highly recommend searching the internet for Python tutorials. There are many very good tutorials available for free and the skills you learn will be easily transferable to our platform. +* [**Your first Pymakr project:**](first-project) Once you understand what MicroPython is, this guide will take you through setting up your first Pymakr project to blink the on-board RGB LED. This guide will explain the structure of a MicroPython project as well as how to upload it to your module. + +Once you are familiar with MicroPython and Pymakr, the recommended way of uploading code to your module, you can explore the pages below. These will discuss in greater detail the various mechanisms for running code on your device as well as how to recover it if something goes wrong. + +* [**REPL:**](repl/) The REPL (Read Evaluate Print Loop) is an interactive terminal that allows you to type in and test your code directly on the device, just like interactive python interpreter. It can be accessed via [UART](repl/serial) or [Telnet](repl/telnet). This is accessed easiest by using Pymakr but if you wish to use other tools, this page will explain how. +* [**FTP:**](ftp) All Pycom modules start up with a WiFi access point enabled, and a simple FTP server running on it. Once connected to the WiFi network, you can use FTP to transfer files over to your device wirelessly. This can be very useful if you do not have physical access to your device. +* [**Safe Boot:**](safeboot) It is possible that some code you upload to your module will prevent you accessing the REPL or FTP server, preventing you from updating your scripts. This guide will detail how to safe boot your module and how to remove the offending scripts from it. + diff --git a/content/gettingstarted/programming/_index.md b/content/gettingstarted/programming/_index.md new file mode 100644 index 0000000..6a77a28 --- /dev/null +++ b/content/gettingstarted/programming/_index.md @@ -0,0 +1,18 @@ +--- +title: "Programming the modules" +aliases: +--- +Now that you have connected and updated your pycom module and installed all the required software on your computer, we can begin programming your Pycom module. + +If this is your first time using a Pycom module we highly recommend you read through the following pages: + +* [**Introduction to MicroPython:**](micropython) This page will explain what Micropython is and its relation to Python. +* [**MicroPython Examples:**](examples) We also recommend you browse these short MicroPython examples to familiarise yourself with its syntax. This is not meant as a comprehensive guide to MicroPython programming but rather a reference to those who already know programming. If you are new to python, or programming all together, we highly recommend searching the internet for Python tutorials. There are many very good tutorials available for free and the skills you learn will be easily transferable to our platform. +* [**Your first Pymakr project:**](first-project) Once you understand what MicroPython is, this guide will take you through setting up your first Pymakr project to blink the on-board RGB LED. This guide will explain the structure of a MicroPython project as well as how to upload it to your module. + +Once you are familiar with MicroPython and Pymakr, the recommended way of uploading code to your module, you can explore the pages below. These will discuss in greater detail the various mechanisms for running code on your device as well as how to recover it if something goes wrong. + +* [**REPL:**](repl/) The REPL (Read Evaluate Print Loop) is an interactive terminal that allows you to type in and test your code directly on the device, just like interactive python interpreter. It can be accessed via [UART](repl/serial) or [Telnet](repl/telnet). This is accessed easiest by using Pymakr but if you wish to use other tools, this page will explain how. +* [**FTP:**](ftp) All Pycom modules start up with a WiFi access point enabled, and a simple FTP server running on it. Once connected to the WiFi network, you can use FTP to transfer files over to your device wirelessly. This can be very useful if you do not have physical access to your device. +* [**Safe Boot:**](safeboot) It is possible that some code you upload to your module will prevent you accessing the REPL or FTP server, preventing you from updating your scripts. This guide will detail how to safe boot your module and how to remove the offending scripts from it. + diff --git a/gettingstarted/programming/examples.md b/content/gettingstarted/programming/examples.md similarity index 74% rename from gettingstarted/programming/examples.md rename to content/gettingstarted/programming/examples.md index 36b38f1..e0156b5 100644 --- a/gettingstarted/programming/examples.md +++ b/content/gettingstarted/programming/examples.md @@ -1,6 +1,11 @@ -# MicroPython Examples - -To get you started with Python \(MicroPython\) syntax, we've provided you with a number of code examples. +--- +title: "MicroPython Examples" +aliases: + - gettingstarted/programming/examples.html + - gettingstarted/programming/examples.md + - chapter/gettingstarted/programming/examples +--- +To get you started with Python (MicroPython) syntax, we've provided you with a number of code examples. ## Variable Assignment @@ -26,7 +31,7 @@ else: print("Just right!") ``` -## Loops \(For & While loop\) +## Loops (For & While loop) Loops are another important feature of any programming language. This allows you to cycle your code and repeat functions/assignments/etc. @@ -50,7 +55,7 @@ print(x) ## Functions -Functions are blocks of code that are referred to by name. Data can be passed into it to be operated on \(i.e. the parameters\) and can optionally return data \(the return value\). All data that is passed to a function is explicitly passed. +Functions are blocks of code that are referred to by name. Data can be passed into it to be operated on (i.e. the parameters) and can optionally return data (the return value). All data that is passed to a function is explicitly passed. The function below takes two numbers and adds them together, outputting the result. @@ -73,11 +78,11 @@ welcome("Alex") # expect "Hello, Alex!" ## Data Structures -Python has a number of different data structures for storing and manipulating variables. The main difference \(regarding data structures\) between C and Python is that Python manages memory for you. This means there’s no need to declare the sizes of lists, dictionaries, strings, etc. +Python has a number of different data structures for storing and manipulating variables. The main difference (regarding data structures) between C and Python is that Python manages memory for you. This means there's no need to declare the sizes of lists, dictionaries, strings, etc. ### Lists -A data structure that holds an ordered collection \(sequence\) of items. +A data structure that holds an ordered collection (sequence) of items. ```python networks = ['lora', 'sigfox', 'wifi', 'bluetooth', 'lte-m'] @@ -86,7 +91,7 @@ print(networks[2]) # expect 'wifi' ### Dictionaries -A dictionary is like an address-book where you can find the address or contact details of a person by knowing only his/her name, i.e. keys \(names\) are associate with values \(details\). +A dictionary is like an address-book where you can find the address or contact details of a person by knowing only his/her name, i.e. keys (names) are associate with values (details). ```python address_book = {'Alex':'2604 Crosswind Drive','Joe':'1301 Hillview Drive','Chris':'3236 Goldleaf Lane'} @@ -102,7 +107,7 @@ pycom_devices = ('wipy', 'lopy', 'sipy', 'gpy', 'fipy') print(pycom_devices[0]) # expect 'wipy' ``` -{% hint style="info" %} +{{{% hint style="info" %}}} For more Python examples, check out these [tutorials](https://www.tutorialspoint.com/python3/). Be aware of the implementation differences between MicroPython and Python 3.5. -{% endhint %} +{{< /hint >}} diff --git a/gettingstarted/programming/first-project.md b/content/gettingstarted/programming/first-project.md similarity index 77% rename from gettingstarted/programming/first-project.md rename to content/gettingstarted/programming/first-project.md index ba5700d..dad7dce 100644 --- a/gettingstarted/programming/first-project.md +++ b/content/gettingstarted/programming/first-project.md @@ -1,5 +1,10 @@ -# Your first Pymakr project - +--- +title: "Your first Pymakr project" +aliases: + - gettingstarted/programming/first-project.html + - gettingstarted/programming/first-project.md + - chapter/gettingstarted/programming/first-project +--- This guide will take you through how to setup your first project with Pymakr and make the on-board RGB LED flash various colours. ## Creating a project in Pymakr @@ -14,13 +19,13 @@ This guide will take you through how to setup your first project with Pymakr and 3. Once the text editor has loaded you will need to click `File` > `Open`, and open the directory you created in step 1 -{% hint style="info" %} -If you are using Atom, it is important to check at this point that Atom has successfully identified the project. The name of the directory you created in step 1 \(`RGB-Blink` in this case\) should be shown in the Pymakr pane like so: +{{{% hint style="info" %}}} +If you are using Atom, it is important to check at this point that Atom has successfully identified the project. The name of the directory you created in step 1 (`RGB-Blink` in this case) should be shown in the Pymakr pane like so: -![](../../.gitbook/assets/atom_project.png) +![](/gitbook/assets/atom_project.png) If this is not the case you can press `alt-ctrl-r` on Windows/Linux or `ctrl-alt-cmd-l` on macOS, in order to reload Atom and fix the issue. -{% endhint %} +{{< /hint >}} 1. Now that you have a project created, we need to add some files to it. A standard MicroPython project has the following structure: @@ -60,11 +65,11 @@ RGB-Blink For this example, you will just need to create a `main.py` file. -Now that the project structure is setup, you may wish to configure project specific settings for Pymakr e.g. Which serial port to use. On Atom you need to click the `^` button on the Pymakr pane, then click `Project Settings`. On Visual Studio Code you need to click the `All commands` button on the bottom of the windows, then click `Pymakr > Project Settings`. This creates a file called `pymakr.conf` inside your project and populates it with default settings copied over from your global settings. A detailed explanation of these settings can be found [here](../../pymakr/settings.md). +Now that the project structure is setup, you may wish to configure project specific settings for Pymakr e.g. Which serial port to use. On Atom you need to click the `^` button on the Pymakr pane, then click `Project Settings`. On Visual Studio Code you need to click the `All commands` button on the bottom of the windows, then click `Pymakr > Project Settings`. This creates a file called `pymakr.conf` inside your project and populates it with default settings copied over from your global settings. A detailed explanation of these settings can be found [here](/../pymakr/settings). ## Controlling the on-board LED -Now that you have setup and configured your project, we can move on to programming your module. The first thing we will need to do is import some libraries in order to interact with the on-board LED. The Pycom firmware comes with a large amount of libraries for standard functionality built-in. You can find out more about these in the [API documentation](../../firmwareapi/introduction.md). For this example you will need to open the `main.py` file and add the following code: +Now that you have setup and configured your project, we can move on to programming your module. The first thing we will need to do is import some libraries in order to interact with the on-board LED. The Pycom firmware comes with a large amount of libraries for standard functionality built-in. You can find out more about these in the [API documentation](/../firmwareapi/introduction). For this example you will need to open the `main.py` file and add the following code: ```python import pycom @@ -79,7 +84,7 @@ You may have noticed that when you power up your Pycom module, the on-board LED pycom.heartbeat(False) ``` -Now it's time to test your code. On the Pymakr pane/bottom of the window you will see a `run` button. \(If you haven't connected to your device yet, you will need to do that first\). When you click the run button, the code in the currently open file will be executed on the device, but it won't copy it to the device. After running this code, you should see that that on-board LED stops blinking blue. +Now it's time to test your code. On the Pymakr pane/bottom of the window you will see a `run` button. (If you haven't connected to your device yet, you will need to do that first). When you click the run button, the code in the currently open file will be executed on the device, but it won't copy it to the device. After running this code, you should see that that on-board LED stops blinking blue. Now that we can confirm the device is connected and Pymakr is able to run code on it, we can complete our script to blink the LED like so: @@ -98,11 +103,11 @@ while True: time.sleep(1) ``` -Once you run the above script, it will run forever. You will notice this prevents you from accessing the interactive REPL on the device \(You cannot see the `>>>` prompt\). In order to stop the script, click onto the Pymakr terminal, and press `ctrl-c` on your keyboard. This should stop the script running and return you to the interactive REPL. +Once you run the above script, it will run forever. You will notice this prevents you from accessing the interactive REPL on the device (You cannot see the `>>>` prompt). In order to stop the script, click onto the Pymakr terminal, and press `ctrl-c` on your keyboard. This should stop the script running and return you to the interactive REPL. ## Uploading to your module -In the previous section we got code running on on your Pycom module using the `run` feature of Pymakr. This is useful for quick testing but has a couple of drawbacks. Firstly the code does not remain on the device permanently. If you reboot the device, it will no longer be running your code. Secondly, it will only work if you are using libraries built into the firmware. If you need any extra libraries, these need to be copied to the device first. This is where the `upload` feature comes in. If instead of `run` you click `upload`, Pymakr will upload all the files in the project \(so long as their type is in the `sync_file_types` setting for your project\). These then persist on your device even between reboots, and allows you to use libraries from the `lib` folder in your project. +In the previous section we got code running on on your Pycom module using the `run` feature of Pymakr. This is useful for quick testing but has a couple of drawbacks. Firstly the code does not remain on the device permanently. If you reboot the device, it will no longer be running your code. Secondly, it will only work if you are using libraries built into the firmware. If you need any extra libraries, these need to be copied to the device first. This is where the `upload` feature comes in. If instead of `run` you click `upload`, Pymakr will upload all the files in the project (so long as their type is in the `sync_file_types` setting for your project). These then persist on your device even between reboots, and allows you to use libraries from the `lib` folder in your project. If you need to remove files from your device you have two options, either connect via FTP and manage your files that way or format the device's internal flash like so: diff --git a/gettingstarted/programming/ftp.md b/content/gettingstarted/programming/ftp.md similarity index 70% rename from gettingstarted/programming/ftp.md rename to content/gettingstarted/programming/ftp.md index 97094b5..a3369a9 100644 --- a/gettingstarted/programming/ftp.md +++ b/content/gettingstarted/programming/ftp.md @@ -1,5 +1,10 @@ -# FTP - +--- +title: "FTP" +aliases: + - gettingstarted/programming/ftp.html + - gettingstarted/programming/ftp.md + - chapter/gettingstarted/programming/ftp +--- There is a small internal file system accessible with each Pycom device, called `/flash`. This is stored within the external serial flash memory. If a microSD card is also connected and mounted, it will be available as well. When the device starts up, it will always boot from the `boot.py` located in the `/flash` file system. The file system is accessible via the native FTP server running on each Pycom device. Open an FTP client and connect to: @@ -8,7 +13,7 @@ The file system is accessible via the native FTP server running on each Pycom de * username: `micro` * password: `python` -See [network.server](../../firmwareapi/pycom/network/server.md) for information on how to change the defaults. The recommended clients are: +See [network.server](/../firmwareapi/pycom/network/server) for information on how to change the defaults. The recommended clients are: * macOS/Linux: default FTP client * Windows: Filezilla and FireFTP @@ -19,7 +24,7 @@ For example, from a macOS/Linux terminal: $ ftp 192.168.4.1 ``` -The FTP server doesn’t support active mode, only passive mode. Therefore, if using the native unix FTP client, immediately after logging in, run the following command: +The FTP server doesn't support active mode, only passive mode. Therefore, if using the native unix FTP client, immediately after logging in, run the following command: ```bash ftp> passive @@ -33,9 +38,9 @@ If using FileZilla, it's important to configure the settings correctly. Do not use the quick connect button. Instead, open the site manager and create a new configuration. Within the `General` tab, ensure that encryption is set to: `Only use plain FTP (insecure)`. -![](../../.gitbook/assets/filezilla-settings-1.png) +![](/gitbook/assets/filezilla-settings-1.png) In the `Transfer Settings` tab, limit the max number of connections to one. Other FTP clients may behave in a similar ways; visit their documentation for more specific information. -![](../../.gitbook/assets/filezilla-settings-2.png) +![](/gitbook/assets/filezilla-settings-2.png) diff --git a/gettingstarted/programming/micropython.md b/content/gettingstarted/programming/micropython.md similarity index 81% rename from gettingstarted/programming/micropython.md rename to content/gettingstarted/programming/micropython.md index d6a9970..2d9ab7d 100644 --- a/gettingstarted/programming/micropython.md +++ b/content/gettingstarted/programming/micropython.md @@ -1,8 +1,13 @@ -# Introduction to MicroPython - +--- +title: "Introduction to MicroPython" +aliases: + - gettingstarted/programming/micropython.html + - gettingstarted/programming/micropython.md + - chapter/gettingstarted/programming/micropython +--- Our boards work with [MicroPython](https://micropython.org/); a Python 3.5 implementation that is optimised to run on micro controllers. This allows for much faster and more simple development process than using C. -![](../../.gitbook/assets/micropython%20%281%29.jpg) +![](/gitbook/assets/micropython%20%281%29.jpg) ## Booting into MicroPython @@ -10,7 +15,7 @@ When booting, two files are executed automatically: first `boot.py` and then `ma The folder structure in `/flash` looks like the picture below. The files can be managed either using FTP or using the Pymakr Plugin. -![](../../.gitbook/assets/mp-filestructure%20%281%29.png) +![](/gitbook/assets/mp-filestructure%20%281%29.png) ## Tips & Tricks @@ -18,9 +23,9 @@ Micropython shares majority of the same syntax as Python 3.5. The intention of t Micropython also has a number of Micropython specific libraries for accessing hardware level features. Specifics relating to those libraries can be found in the Firmware API Reference section of this documentation. -{% hint style="info" %} +{{{% hint style="info" %}}} Micropython, unlike C/C++ or Arduino, **does not use braces {} to indicate blocks of code** specified for class and function definitions or flow control. Blocks of code are denoted by line indentation, which is strictly enforced. The number of spaces in the indentation is variable but all statements within a block must be indented the same amount. -{% endhint %} +{{< /hint >}} diff --git a/content/gettingstarted/programming/repl/README.md b/content/gettingstarted/programming/repl/README.md new file mode 100644 index 0000000..5ee4f44 --- /dev/null +++ b/content/gettingstarted/programming/repl/README.md @@ -0,0 +1,27 @@ +--- +title: "REPL" +aliases: + - chapter/gettingstarted/programming/repl +--- +REPL stands for Read Evaluate Print Loop, and is the name given to the interactive MicroPython prompt that is accessible on the Pycom devices. Using the REPL is by far the easiest way to test out Python code and run commands. You can use the REPL in addition to writing scripts in `main.py`. + +The following pages will explain how to use the REPL with both Serial USB and Telnet connections. + +The REPL includes the following features: + +* Input history: use arrow up and arrow down to scroll through the history +* Tab completion: press tab to auto-complete variables or module names +* Halt any executing code: with `Ctrl-C` +* Copy/paste code or output: `Ctrl-C` and `Ctrl-V` + +{{{% hint style="info" %}}} +There are a number of useful shortcuts for interacting with the MicroPython REPL. See below for the key combinations; + +* `Ctrl-A` on a blank line will enter raw REPL mode. This is similar to permanent paste mode, except that characters are not echoed back. +* `Ctrl-B` on a blank like goes to normal REPL mode. +* `Ctrl-C` cancels any input, or interrupts the currently running code. +* `Ctrl-D` on a blank line will do a soft reset. +* `Ctrl-E` enters ‘paste mode' that allows you to copy and paste chunks of text. Exit this mode using `Ctrl-D`. +* `Ctrl-F` performs a "safe-boot" of the device that prevents `boot.py` and `main.py` from executing +{{< /hint >}} + diff --git a/gettingstarted/programming/repl/README.md b/content/gettingstarted/programming/repl/_index.md similarity index 86% rename from gettingstarted/programming/repl/README.md rename to content/gettingstarted/programming/repl/_index.md index fcad659..22db3b7 100644 --- a/gettingstarted/programming/repl/README.md +++ b/content/gettingstarted/programming/repl/_index.md @@ -1,5 +1,7 @@ -# REPL - +--- +title: "REPL" +aliases: +--- REPL stands for Read Evaluate Print Loop, and is the name given to the interactive MicroPython prompt that is accessible on the Pycom devices. Using the REPL is by far the easiest way to test out Python code and run commands. You can use the REPL in addition to writing scripts in `main.py`. The following pages will explain how to use the REPL with both Serial USB and Telnet connections. @@ -11,14 +13,14 @@ The REPL includes the following features: * Halt any executing code: with `Ctrl-C` * Copy/paste code or output: `Ctrl-C` and `Ctrl-V` -{% hint style="info" %} +{{{% hint style="info" %}}} There are a number of useful shortcuts for interacting with the MicroPython REPL. See below for the key combinations; * `Ctrl-A` on a blank line will enter raw REPL mode. This is similar to permanent paste mode, except that characters are not echoed back. * `Ctrl-B` on a blank like goes to normal REPL mode. * `Ctrl-C` cancels any input, or interrupts the currently running code. * `Ctrl-D` on a blank line will do a soft reset. -* `Ctrl-E` enters ‘paste mode’ that allows you to copy and paste chunks of text. Exit this mode using `Ctrl-D`. +* `Ctrl-E` enters ‘paste mode' that allows you to copy and paste chunks of text. Exit this mode using `Ctrl-D`. * `Ctrl-F` performs a "safe-boot" of the device that prevents `boot.py` and `main.py` from executing -{% endhint %} +{{< /hint >}} diff --git a/gettingstarted/programming/repl/serial.md b/content/gettingstarted/programming/repl/serial.md similarity index 56% rename from gettingstarted/programming/repl/serial.md rename to content/gettingstarted/programming/repl/serial.md index 0a06e6b..b577cfc 100644 --- a/gettingstarted/programming/repl/serial.md +++ b/content/gettingstarted/programming/repl/serial.md @@ -1,12 +1,17 @@ -# Serial USB \(UART\) - -To use the REPL, a Pycom device must be connected to the host computer with a USB connection either to an Expansion Board or to serial converter \(a diagram of how to do this can be found the the [getting started](../../introduction.md) page for your module\). +--- +title: "Serial USB (UART)" +aliases: + - gettingstarted/programming/repl/serial.html + - gettingstarted/programming/repl/serial.md + - chapter/gettingstarted/programming/repl/serial +--- +To use the REPL, a Pycom device must be connected to the host computer with a USB connection either to an Expansion Board or to serial converter (a diagram of how to do this can be found the the [getting started](/../introduction) page for your module). In order to connect to the REPL over USB serial, there are multiple methods. Detailed below are the explanations of how to do it in MacOS, Linux and Windows. ## All platforms -By far the easiest way to access the USB UART REPL is via the our [Pymakr plug-in](../../../pymakr/installation/) for Atom and Visual Studio Code. This adds a pane to the bottom of the editors that allows you to directly access the REPL and any output from the device. Detailed instructions on how to setup Pymakr can be found [here](../../../pymakr/installation/). +By far the easiest way to access the USB UART REPL is via the our [Pymakr plug-in](/../../pymakr/installation/) for Atom and Visual Studio Code. This adds a pane to the bottom of the editors that allows you to directly access the REPL and any output from the device. Detailed instructions on how to setup Pymakr can be found [here](/../../pymakr/installation/). ## macOS and Linux @@ -18,16 +23,16 @@ Open a terminal instance and run the following commands: $ screen /dev/tty.usbmodem* 115200 ``` -Upon exiting `screen`, press `CTRL-A CTRL-\`. If the keyboard does not support the `\`-key \(i.e. an obscure combination for `\` like `ALT-SHIFT-7` is required\), the key combination can be remapped for the `quit` command: +Upon exiting `screen`, press `CTRL-A CTRL-\`. If the keyboard does not support the `\`-key (i.e. an obscure combination for `\` like `ALT-SHIFT-7` is required), the key combination can be remapped for the `quit` command: * create `~/.screenrc` * add bind `q` to the `exit` command This will allow screen to exited by pressing `CTRL-A Q`. -{% hint style="info" %} -On Linux, `picocom` or `minicom` may be used instead of `screen`. The usb serial address might also be listed as `/dev/ttyUSB01` or a higher increment for `ttyUSB`. Additionally, the elevated permissions to access the device \(e.g. group uucp/dialout or use `sudo`\) may be required. -{% endhint %} +{{{% hint style="info" %}}} +On Linux, `picocom` or `minicom` may be used instead of `screen`. The usb serial address might also be listed as `/dev/ttyUSB01` or a higher increment for `ttyUSB`. Additionally, the elevated permissions to access the device (e.g. group uucp/dialout or use `sudo`) may be required. +{{< /hint >}} ## Windows @@ -35,20 +40,20 @@ A terminal emulator is needed to open the connection from Windows; the easiest o ### COM Port -To use PuTTY the serial port \(COM port\) in which the Pycom device is connected, must be located. In Windows, this information can be found from the 'Device Manager' program. +To use PuTTY the serial port (COM port) in which the Pycom device is connected, must be located. In Windows, this information can be found from the 'Device Manager' program. 1. Open the Windows start menu and search for 'Device Manager' 2. The COM port for the Pycom device will be listed as 'USB Serial Device' or a similar name -3. Copy/Write down the associated COM port \(e.g. `COM4`\) +3. Copy/Write down the associated COM port (e.g. `COM4`) ### Using Putty 1. With PuTTY open, click on `Session` in the left-hand panel 2. Next click the `Serial` radio button on the right and enter the associated - COM port \(e.g. `COM4`\) in the `Serial Line` box + COM port (e.g. `COM4`) in the `Serial Line` box 3. Finally, click the `Open` button -![](../../../.gitbook/assets/putty.png) +![](//gitbook/assets/putty.png) diff --git a/gettingstarted/programming/repl/telnet.md b/content/gettingstarted/programming/repl/telnet.md similarity index 56% rename from gettingstarted/programming/repl/telnet.md rename to content/gettingstarted/programming/repl/telnet.md index 8f76d56..810e807 100644 --- a/gettingstarted/programming/repl/telnet.md +++ b/content/gettingstarted/programming/repl/telnet.md @@ -1,6 +1,11 @@ -# Telnet REPL - -Pycom devices also support a connection via `telnet`, using the device's on board WiFi/WLAN. Connect to the device's WiFi Access Point \(AP\) and using the following credentials to connect to the AP. The WiFi `SSID` will appear upon powering on a Pycom Device for the first time \(e.g. `lopy-`\). To re-enable this feature at a later date, please see [network.WLAN](). +--- +title: "Telnet REPL" +aliases: + - gettingstarted/programming/repl/telnet.html + - gettingstarted/programming/repl/telnet.md + - chapter/gettingstarted/programming/repl/telnet +--- +Pycom devices also support a connection via `telnet`, using the device's on board WiFi/WLAN. Connect to the device's WiFi Access Point (AP) and using the following credentials to connect to the AP. The WiFi `SSID` will appear upon powering on a Pycom Device for the first time (e.g. `lopy-`). To re-enable this feature at a later date, please see [network.WLAN](). * password: `www.pycom.io` @@ -11,11 +16,11 @@ Additionally, to use the MircoPython REPL over telnet, further authentication is * username: `micro` * password: `python` -See [network.server](../../../firmwareapi/pycom/network/server.md) for info on how to change the default authentication. +See [network.server](/../../firmwareapi/pycom/network/server) for info on how to change the default authentication. ## All platforms -By far the easiest way to access the Telnet REPL is via the our [Pymakr plug-in](../../../pymakr/installation/) for Atom and Visual Studio Code. This adds a pane to the bottom of the editors that allows you to directly access the REPL and any output from the device. Detailed instructions on how to setup Pymakr can be found [here](../../../pymakr/installation/). +By far the easiest way to access the Telnet REPL is via the our [Pymakr plug-in](/../../pymakr/installation/) for Atom and Visual Studio Code. This adds a pane to the bottom of the editors that allows you to directly access the REPL and any output from the device. Detailed instructions on how to setup Pymakr can be found [here](/../../pymakr/installation/). ## macOS and Linux @@ -31,11 +36,11 @@ Upon connection, the telnet program will prompt for the `username` and `password A terminal emulator is needed to open a telnet connection from Windows; the easiest option is to download the free program, [PuTTY](http://www.putty.org/). -1. With PuTTY open, select telnet as connection type and leave the default port \(`23`\) -2. Next enter the IP address of the Pycom device \(e.g. `192.168.4.1`\) +1. With PuTTY open, select telnet as connection type and leave the default port (`23`) +2. Next enter the IP address of the Pycom device (e.g. `192.168.4.1`) 3. Finally click `Open` -{% hint style="info" %} +{{{% hint style="info" %}}} When using a Pycom device with a personal, home or office WiFi access point, the telnet connection may still be used. In this instance, the user will need to determine the Pycom device's local IP address and substitute this for `192.168.4.1`, referred to in the earlier sections. -{% endhint %} +{{< /hint >}} diff --git a/gettingstarted/programming/safeboot.md b/content/gettingstarted/programming/safeboot.md similarity index 73% rename from gettingstarted/programming/safeboot.md rename to content/gettingstarted/programming/safeboot.md index 1e235c6..8a27cf3 100644 --- a/gettingstarted/programming/safeboot.md +++ b/content/gettingstarted/programming/safeboot.md @@ -1,5 +1,10 @@ -# Safe boot - +--- +title: "Safe boot" +aliases: + - gettingstarted/programming/safeboot.html + - gettingstarted/programming/safeboot.md + - chapter/gettingstarted/programming/safeboot +--- If powering up normally or upon pressing the reset button, a Pycom module will boot into standard mode; the `boot.py` file will be executed first, followed by `main.py`. It is possible to alter the boot procedure of the module by tying certain pins `high` or `low` when the module boots. ## Bootloader @@ -14,7 +19,7 @@ Some times the code you have written will prevent you gaining access to the REPL * Your code gets stuck before reaching the REPL * You set a socket as blocking but never receive any data -In order to fix this you can safe boot your module. This will prevent `boot.py` and `main.py` from being executed and will drop you straight into the interactive REPL. After reset, if `P12` pin is held `high` \(i.e. connect it to the `3V3` output pin\), the heartbeat LED will begin flashing orange slowly. If after 3 seconds the pin is still held high, the LED will start blinking faster. In this mode the module will do the same as previously explained but it will also select the previous OTA image to boot if you have updated the module via the OTA update procedure \(updates performed via the firmware update tool do not count\). This is useful if you flashed a OTA update that breaks the device. +In order to fix this you can safe boot your module. This will prevent `boot.py` and `main.py` from being executed and will drop you straight into the interactive REPL. After reset, if `P12` pin is held `high` (i.e. connect it to the `3V3` output pin), the heartbeat LED will begin flashing orange slowly. If after 3 seconds the pin is still held high, the LED will start blinking faster. In this mode the module will do the same as previously explained but it will also select the previous OTA image to boot if you have updated the module via the OTA update procedure (updates performed via the firmware update tool do not count). This is useful if you flashed a OTA update that breaks the device. Pin `P12` released during: @@ -31,9 +36,9 @@ If problems occur within the filesystem or you wish to factory reset your module >>> os.mkfs('/flash') ``` -{% hint style="danger" %} -Be aware, resetting the flash filesystem will delete all files inside the internal device storage \(not the SD card\) and they cannot be recovered. -{% endhint %} +{{{% hint style="danger" %}}} +Be aware, resetting the flash filesystem will delete all files inside the internal device storage (not the SD card) and they cannot be recovered. +{{< /hint >}} ## Reset diff --git a/content/gettingstarted/registration/README.md b/content/gettingstarted/registration/README.md new file mode 100644 index 0000000..934f4c7 --- /dev/null +++ b/content/gettingstarted/registration/README.md @@ -0,0 +1,19 @@ +--- +title: "Device Registration" +aliases: + - chapter/gettingstarted/registration/README +--- +Some of our devices require registration before you can utilise specific features such as certain types of networking. Please see the list below for setup guides to ensure that your device is registered and activated on the various platforms required to access all of the available features. + +[![](/gitbook/assets/sigfox-logo.png)](sigfox) + +[![](/gitbook/assets/lorawan_logo.png)](lora/) + +[![](/gitbook/assets/image.png)](cellular) + +[![](/gitbook/assets/image-1.png)](cellular) + +{{{% hint style="info" %}}} +**Not all Pycom devices require activation**; most features work immediately out of the box! +{{< /hint >}} + diff --git a/gettingstarted/registration/README.md b/content/gettingstarted/registration/_index.md similarity index 58% rename from gettingstarted/registration/README.md rename to content/gettingstarted/registration/_index.md index ceadcbd..f083320 100644 --- a/gettingstarted/registration/README.md +++ b/content/gettingstarted/registration/_index.md @@ -1,16 +1,18 @@ -# Device Registration - +--- +title: "Device Registration" +aliases: +--- Some of our devices require registration before you can utilise specific features such as certain types of networking. Please see the list below for setup guides to ensure that your device is registered and activated on the various platforms required to access all of the available features. -[![](../../.gitbook/assets/sigfox-logo.png)](sigfox.md) +[![](/gitbook/assets/sigfox-logo.png)](sigfox) -[![](../../.gitbook/assets/lorawan_logo.png)](lora/) +[![](/gitbook/assets/lorawan_logo.png)](lora/) -[![](../../.gitbook/assets/image.png)](cellular.md) +[![](/gitbook/assets/image.png)](cellular) -[![](../../.gitbook/assets/image-1.png)](cellular.md) +[![](/gitbook/assets/image-1.png)](cellular) -{% hint style="info" %} +{{{% hint style="info" %}}} **Not all Pycom devices require activation**; most features work immediately out of the box! -{% endhint %} +{{< /hint >}} diff --git a/gettingstarted/registration/cellular.md b/content/gettingstarted/registration/cellular.md similarity index 69% rename from gettingstarted/registration/cellular.md rename to content/gettingstarted/registration/cellular.md index ee14ca3..c59c9fb 100644 --- a/gettingstarted/registration/cellular.md +++ b/content/gettingstarted/registration/cellular.md @@ -1,10 +1,15 @@ -# Cellular - +--- +title: "Cellular" +aliases: + - gettingstarted/registration/cellular.html + - gettingstarted/registration/cellular.md + - chapter/gettingstarted/registration/cellular +--- In order to use your GPy/FiPy on a cellular network you are required to get a SIM card from a local provider. _Note: This might differ from a standard SIM you can buy in a store, our devices do not support standard LTE._ -Currently we are not able to provide any specific details about how to get such a SIM card and how to register it as most deployments are closed trials, each carrier has it’s own rules \(for example, whether they require special SIMs or not\). +Currently we are not able to provide any specific details about how to get such a SIM card and how to register it as most deployments are closed trials, each carrier has it's own rules (for example, whether they require special SIMs or not). We recommend contacting your local cellular providers to check their plans surrounding LTE CAT-M1 and NB-IoT. By contacting them, you will show the carriers that there is local interest in deploying such networks. diff --git a/content/gettingstarted/registration/lora/README.md b/content/gettingstarted/registration/lora/README.md new file mode 100644 index 0000000..8284f44 --- /dev/null +++ b/content/gettingstarted/registration/lora/README.md @@ -0,0 +1,45 @@ +--- +title: "LoRaWAN" +aliases: + - chapter/gettingstarted/registration/lora +--- +## Raw LoRa + +When using raw LoRa, you do not have to register your module in any way. The modules can talk to each other directly. + +## LoRaWAN + +In order to connect your LoRa capable Pycom module to a LoRaWAN network you will have to register your device with the desired network. We are unable to provide instructions for all LoRaWAN networks but below you will find some generic instructions, along with links to any specific guides we are aware of. + +### Generic instructions + +Firstly you will need to get your modules `Device EUI`, this can be achieved using the following code: + +```python +from network import LoRa +import ubinascii + +lora = LoRa(mode=LoRa.LORAWAN) +print(ubinascii.hexlify(lora.mac()).upper().decode('utf-8')) +``` + +The output will be a hex string like: `70B3D5499585FCA1`. Once you have this you will need to provide it to your LoRaWAN network which will then provide you with the details need to connect via Over-the-Air Activation (OTAA) or Activation by Personalisation (ABP) + +#### OTAA + +If you wish to connect via OTAA (which is the recommended method) the network will provide you with an `Application EUI` and `Application Key`. The former identifies what application your device is connecting to, the latter is a shared secret key unique to your device to generate the session keys that prove its identity to the network. Once you have these you can use the [LoRaWAN OTAA example](/../../tutorials/lora/lorawan-otaa) code to connect to the network. + +#### ABP + +With ABP the encryption keys enabling communication with the network are preconfigured in the device. The network will need to provide you with a `Device Address`, `Network Session Key` and `Application Session Key`. Once you have these you can use the [LoRaWAN ABP example](/../../tutorials/lora/lorawan-abp) code to connect to the network. + +### Networks + +[![](//gitbook/assets/image-2.png)](ttn) + +[![](//gitbook/assets/image-3.png)](objenious) + +{{{% hint style="info" %}}} +If you cannot find your favourite LoRaWAN network in the list above, please consider writing a tutorial for how to connect a Pycom module with it and contribute it to this documentation via a [GitHub pull request](https://github.com/pycom/pycom-documentation). +{{< /hint >}} + diff --git a/gettingstarted/registration/lora/README.md b/content/gettingstarted/registration/lora/_index.md similarity index 65% rename from gettingstarted/registration/lora/README.md rename to content/gettingstarted/registration/lora/_index.md index 74a5473..a6fca13 100644 --- a/gettingstarted/registration/lora/README.md +++ b/content/gettingstarted/registration/lora/_index.md @@ -1,5 +1,7 @@ -# LoRaWAN - +--- +title: "LoRaWAN" +aliases: +--- ## Raw LoRa When using raw LoRa, you do not have to register your module in any way. The modules can talk to each other directly. @@ -20,23 +22,23 @@ lora = LoRa(mode=LoRa.LORAWAN) print(ubinascii.hexlify(lora.mac()).upper().decode('utf-8')) ``` -The output will be a hex string like: `70B3D5499585FCA1`. Once you have this you will need to provide it to your LoRaWAN network which will then provide you with the details need to connect via Over-the-Air Activation \(OTAA\) or Activation by Personalisation \(ABP\) +The output will be a hex string like: `70B3D5499585FCA1`. Once you have this you will need to provide it to your LoRaWAN network which will then provide you with the details need to connect via Over-the-Air Activation (OTAA) or Activation by Personalisation (ABP) #### OTAA -If you wish to connect via OTAA \(which is the recommended method\) the network will provide you with an `Application EUI` and `Application Key`. The former identifies what application your device is connecting to, the latter is a shared secret key unique to your device to generate the session keys that prove its identity to the network. Once you have these you can use the [LoRaWAN OTAA example](../../../tutorials/lora/lorawan-otaa.md) code to connect to the network. +If you wish to connect via OTAA (which is the recommended method) the network will provide you with an `Application EUI` and `Application Key`. The former identifies what application your device is connecting to, the latter is a shared secret key unique to your device to generate the session keys that prove its identity to the network. Once you have these you can use the [LoRaWAN OTAA example](/../../tutorials/lora/lorawan-otaa) code to connect to the network. #### ABP -With ABP the encryption keys enabling communication with the network are preconfigured in the device. The network will need to provide you with a `Device Address`, `Network Session Key` and `Application Session Key`. Once you have these you can use the [LoRaWAN ABP example](../../../tutorials/lora/lorawan-abp.md) code to connect to the network. +With ABP the encryption keys enabling communication with the network are preconfigured in the device. The network will need to provide you with a `Device Address`, `Network Session Key` and `Application Session Key`. Once you have these you can use the [LoRaWAN ABP example](/../../tutorials/lora/lorawan-abp) code to connect to the network. ### Networks -[![](../../../.gitbook/assets/image-2.png)](ttn.md) +[![](//gitbook/assets/image-2.png)](ttn) -[![](../../../.gitbook/assets/image-3.png)](objenious.md) +[![](//gitbook/assets/image-3.png)](objenious) -{% hint style="info" %} +{{{% hint style="info" %}}} If you cannot find your favourite LoRaWAN network in the list above, please consider writing a tutorial for how to connect a Pycom module with it and contribute it to this documentation via a [GitHub pull request](https://github.com/pycom/pycom-documentation). -{% endhint %} +{{< /hint >}} diff --git a/gettingstarted/registration/lora/objenious.md b/content/gettingstarted/registration/lora/objenious.md similarity index 61% rename from gettingstarted/registration/lora/objenious.md rename to content/gettingstarted/registration/lora/objenious.md index ced9fb5..2f66c0a 100644 --- a/gettingstarted/registration/lora/objenious.md +++ b/content/gettingstarted/registration/lora/objenious.md @@ -1,12 +1,17 @@ -# Objenious - +--- +title: "Objenious" +aliases: + - gettingstarted/registration/lora/objenious.html + - gettingstarted/registration/lora/objenious.md + - chapter/gettingstarted/registration/lora/objenious +--- ## Identifiers -To connect a Pycom LoRa device \(LoPy, LoPy4, FiPy\) to Objenious you'll need to provision it. This requires three pieces of information +To connect a Pycom LoRa device (LoPy, LoPy4, FiPy) to Objenious you'll need to provision it. This requires three pieces of information -* Device EUI \(DevEUI\) -* Application EUI \(AppEUI\) -* Application Key \(AppKey\) +* Device EUI (DevEUI) +* Application EUI (AppEUI) +* Application Key (AppKey) ### Device EUI @@ -24,16 +29,16 @@ print("DevEUI: %s" % (ubinascii.hexlify(lora.mac()).decode('ascii'))) ### Application EUI and Application Key Application EUI and Key are two LoRaWAN parameters that should ideally by generated by you, if supplying devices to end customers. -The Application EUI is a EUI-64 \(8 bytes\) identifier which should be universally unique - it's usually allocated from a MA-S block purchased from the [IEEE Registration Authority](http://standards.ieee.org/develop/regauth/oui36/index.html). -The Application Key should be a randomly generated, secure, 128 bit \(16 byte\) token. +The Application EUI is a EUI-64 (8 bytes) identifier which should be universally unique - it's usually allocated from a MA-S block purchased from the [IEEE Registration Authority](http://standards.ieee.org/develop/regauth/oui36/index.html). +The Application Key should be a randomly generated, secure, 128 bit (16 byte) token. For testing purposes we provide a script which generates a random Application EUI from our assignment and a series of Application Keys: [EUI/Key generator for testing](https://github.com/pycom/pycom-scripts/blob/master/lorakeys/generate_keys.py) -_\(note: the Application EUI produced by this script is not guaranteed to be unique\)_ +_(note: the Application EUI produced by this script is not guaranteed to be unique)_ -To use the script make sure you are using Python 3.6 on your computer and run it \(on your computer, _not_ on the Pycom board\) as: +To use the script make sure you are using Python 3.6 on your computer and run it (on your computer, _not_ on the Pycom board) as: ```bash python generate_keys.py 1 @@ -53,9 +58,9 @@ If you are registering multiple devices you can generate more Applications Keys Once you have the three identifiers for your device you need to register them on the Objenius portal. Follow "Importer des capteurs" under "Statuc do Parc" and select "Provisioning Unitaire": -![](../../../.gitbook/assets/objeniousprovision1.jpg) +![](//gitbook/assets/objeniousprovision1.jpg) Once there give your device a name and enter the DevEUI, AppEUI, and AppKey obtained from the steps above: -![](../../../.gitbook/assets/objeniousprovision2%20%281%29.jpg) +![](//gitbook/assets/objeniousprovision2%20%281%29.jpg) diff --git a/gettingstarted/registration/lora/ttn.md b/content/gettingstarted/registration/lora/ttn.md similarity index 73% rename from gettingstarted/registration/lora/ttn.md rename to content/gettingstarted/registration/lora/ttn.md index c11198a..0bfd471 100644 --- a/gettingstarted/registration/lora/ttn.md +++ b/content/gettingstarted/registration/lora/ttn.md @@ -1,8 +1,13 @@ -# The Things Network +--- +title: "The Things Network" +aliases: + - gettingstarted/registration/lora/ttn.html + - gettingstarted/registration/lora/ttn.md + - chapter/gettingstarted/registration/lora/ttn +--- +In order to use The Things Network (TTN) you should navigate to their website and create/register an account. Enter a username and an email address to verify with their platform. -In order to use The Things Network \(TTN\) you should navigate to their website and create/register an account. Enter a username and an email address to verify with their platform. - -![](../../../.gitbook/assets/ttn-1.png) +![](//gitbook/assets/ttn-1.png) Once an account has been registered, you can register your Pycom module as either a node or a nano-gateway. The steps below will detail how to do this. @@ -12,7 +17,7 @@ In order to register your device to connect to the things network, you must firs Selecting the `Applications` tab at the top of the TTN console, will bring up a screen for registering applications. Click register and a new page, similar to the one below, will open. -![](../../../.gitbook/assets/ttn-5.png) +![](//gitbook/assets/ttn-5.png) Enter a unique `Application ID` as well as a Description & Handler Registration. @@ -22,7 +27,7 @@ Now the Pycom module nodes can be registered to send data up to the new Applicat To connect nodes to a things network gateway, devices need to be added to the application. To do this, navigate to the `Devices` tab on the `Application` home page and click the `Register Device` button. -![](../../../.gitbook/assets/ttn-6.png) +![](//gitbook/assets/ttn-6.png) In the `Register Device` panel, complete the forms for the `Device ID` and the `Device EUI`. The `Device ID` is user specified and is unique to the device in this application. The `Device EUI` should be a globally unique identifier for the device. You can run the following on you Pycom module to retrieve its EUI. @@ -38,15 +43,15 @@ Once the device has been added, change the `Activation Method` between `OTAA` an ## Register a Nano-Gateway -You can also setup your Pycom module to act as a gateway with The Things Network. The code required to do this can be found [here](../../../tutorials/lora/lorawan-nano-gateway.md). +You can also setup your Pycom module to act as a gateway with The Things Network. The code required to do this can be found [here](/../../tutorials/lora/lorawan-nano-gateway). Inside the TTN Console, there are two options, `Applications` and `Gateways`. Select `Gateways` and then click on `register Gateway`. This will allow for the set up and registration of a new nano-gateway. -![](../../../.gitbook/assets/ttn-2%20%281%29.png) +![](//gitbook/assets/ttn-2%20%281%29.png) On the Register Gateway page, you will need to set the following settings: -![](../../../.gitbook/assets/ttn-gatewayreg-11-2017-2.jpg) +![](//gitbook/assets/ttn-gatewayreg-11-2017-2.jpg) These are unique to each gateway, location and country specific frequency. Please verify that correct settings are selected otherwise the gateway will not connect to TTN. @@ -55,13 +60,13 @@ These are unique to each gateway, location and country specific frequency. Pleas | Option | Value | | :--- | :--- | | Protocol | Packet Forwarder | -| Gateway EUI | User Defined \(must match `config.py`\) | +| Gateway EUI | User Defined (must match `config.py`) | | Description | User Defined | -| Frequency Plan | Select Country \(e.g. EU - 868 MHz\) | +| Frequency Plan | Select Country (e.g. EU - 868 MHz) | | Location | User Defined | | Antenna Placement | Indoor or Outdoor | -Most LoRaWAN network servers expect a Gateway ID in the form of a unique 64-bit hexadecimal number \(called a EUI-64\). The recommended practice is to produce this ID from your board by expanding the WiFi MAC address \(a 48-bit number, called MAC-48\). You can obtain that by running this code prior to configuration: +Most LoRaWAN network servers expect a Gateway ID in the form of a unique 64-bit hexadecimal number (called a EUI-64). The recommended practice is to produce this ID from your board by expanding the WiFi MAC address (a 48-bit number, called MAC-48). You can obtain that by running this code prior to configuration: ```python from network import WLAN @@ -70,9 +75,9 @@ Most LoRaWAN network servers expect a Gateway ID in the form of a unique 64-bit binascii.hexlify(wl.mac())[:6] + 'FFFE' + binascii.hexlify(wl.mac())[6:] ``` -Once these settings have been applied, click `Register Gateway`. A Gateway Overview page will appear, with the configuration settings showing. Next click on the `Gateway Settings` and configure the Router address to match that of the gateway \(default: `router.eu.thethings.network`\). +Once these settings have been applied, click `Register Gateway`. A Gateway Overview page will appear, with the configuration settings showing. Next click on the `Gateway Settings` and configure the Router address to match that of the gateway (default: `router.eu.thethings.network`). -![](../../../.gitbook/assets/ttn-4%20%281%29.png) +![](//gitbook/assets/ttn-4%20%281%29.png) The `Gateway` should now be configured. diff --git a/gettingstarted/registration/sigfox.md b/content/gettingstarted/registration/sigfox.md similarity index 71% rename from gettingstarted/registration/sigfox.md rename to content/gettingstarted/registration/sigfox.md index 9fd1c78..7afe9c7 100644 --- a/gettingstarted/registration/sigfox.md +++ b/content/gettingstarted/registration/sigfox.md @@ -1,10 +1,15 @@ -# Sigfox - +--- +title: "Sigfox" +aliases: + - gettingstarted/registration/sigfox.html + - gettingstarted/registration/sigfox.md + - chapter/gettingstarted/registration/sigfox +--- Before you start, update your device to the latest firmware. Select _stable_ firmware in Firmware updater. After firmware update is done, _Sigfox ID_ and _Sigfox PAC_ were assigned to your device. Copy _Sigfox ID_ and _Sigfox PAC_ from the last screen of firmware updater. -![](../../.gitbook/assets/fwupdater.png) +![](/gitbook/assets/fwupdater.png) _Sigfox ID_ and _Sigfox Pac_ is assigned to your device just once during the first update process. _Sigfox ID_ and _Sigfox Pac_ will not change after successive firmware updates. @@ -28,27 +33,27 @@ print(binascii.hexlify(sigfox.pac())) You need to register to the Sigfox Backend. Navigate to [https://backend.sigfox.com/activate](https://backend.sigfox.com/activate) -![](../../.gitbook/assets/sigfoxactivate%20%281%29.png) +![](/gitbook/assets/sigfoxactivate%20%281%29.png) Find the specific country country where the device will be activated. Enter the device's _Sigfox ID_ and _Sigfox PAC_. You should see green microchip if you entered correct _Sigfox ID_ and _Sigfox PAC_ -![](../../.gitbook/assets/sigfoxidpac.png) +![](/gitbook/assets/sigfoxidpac.png) Then provide the required information including email address and complete registration. -{% hint style="info" %} -When registering your other devices \(not your first device\), you already have created Sigfox Account before. Be sure you are login with your Sigfox account. In that way all of your devices will be added to same Sigfox Account. -{% endhint %} +{{{% hint style="info" %}}} +When registering your other devices (not your first device), you already have created Sigfox Account before. Be sure you are login with your Sigfox account. In that way all of your devices will be added to same Sigfox Account. +{{< /hint >}} -![](../../.gitbook/assets/sigfoxregistrationform.png) +![](/gitbook/assets/sigfoxregistrationform.png) After registration, you will receive confirmation email with _password_ to Sigfox backend [https://backend.sigfox.com/auth/login](https://backend.sigfox.com/auth/login) Use your email and password to login to Sigfox backend. -![](../../.gitbook/assets/sigfoxbackend.png) +![](/gitbook/assets/sigfoxbackend.png) If you enter correct credentials then you should be able to login to Sigfox backend. @@ -56,15 +61,15 @@ If you enter correct credentials then you should be able to login to Sigfox back You may want to transfer your devices to new Sigfox account. -Once you register your device on Sigfox backend, then your Sigfox PAC was used, and is not valid anymore. You need to get new Sigfox PAC. We don't update Sigfox PAC assigned to your device \(which can be seen on last page of Firmware updater or read from device\). +Once you register your device on Sigfox backend, then your Sigfox PAC was used, and is not valid anymore. You need to get new Sigfox PAC. We don't update Sigfox PAC assigned to your device (which can be seen on last page of Firmware updater or read from device). To get new Sigfox PAC navigate to your device on Sigfox backend. On _device_ click on Sigfox Id of device you want to transfer. -![](../../.gitbook/assets/sigfoxtableid%20%281%29.png) +![](/gitbook/assets/sigfoxtableid%20%281%29.png) Now you can see your new Sigfox PAC. -![](../../.gitbook/assets/newsigfoxpac%20%281%29.png) +![](/gitbook/assets/newsigfoxpac%20%281%29.png) Once you know your new Sigfox PAC go to [https://backend.sigfox.com/activate](https://backend.sigfox.com/activate) and register device with different account. diff --git a/products.md b/content/products.md similarity index 64% rename from products.md rename to content/products.md index a33d5dd..fdb5bd6 100644 --- a/products.md +++ b/content/products.md @@ -1,5 +1,10 @@ -# Pycom Products - +--- +title: "Pycom Products" +aliases: + - products.html + - products.md + - chapter/products +--- ## Pycom Products Below you will find tables of all Pycom products. These tables illustrate the functionality of our various products, their compatibility with each other, as well as what accessories are required to utilise certain functionality. @@ -8,12 +13,12 @@ Below you will find tables of all Pycom products. These tables illustrate the fu | Module | WiFi | Bluetooth | LoRa | Sigfox | LTE CAT-M1NB-IoT | | :--- | :--- | :--- | :--- | :--- | :--- | -| [ WiPy 3.0](datasheets/development/wipy3.md) | ✔ | ✔ | | | | -| [SiPy](datasheets/development/sipy.md) | ✔ | ✔ | | ✔ | | -| [GPy](datasheets/development/gpy.md) | ✔ | ✔ | | | ✔ | -| [LoPy](datasheets/development/lopy.md) | ✔ | ✔ | ✔ | | | -| [LoPy4](datasheets/development/lopy4.md) | ✔ | ✔ | ✔ | ✔ | | -| [FiPy](datasheets/development/fipy.md) | ✔ | ✔ | ✔ | ✔ | ✔ | +| [ WiPy 3.0](datasheets/development/wipy3) | ✔ | ✔ | | | | +| [SiPy](datasheets/development/sipy) | ✔ | ✔ | | ✔ | | +| [GPy](datasheets/development/gpy) | ✔ | ✔ | | | ✔ | +| [LoPy](datasheets/development/lopy) | ✔ | ✔ | ✔ | | | +| [LoPy4](datasheets/development/lopy4) | ✔ | ✔ | ✔ | ✔ | | +| [FiPy](datasheets/development/fipy) | ✔ | ✔ | ✔ | ✔ | ✔ | | Antennas | [External WiFi/BT Antenna Kit](https://pycom.io/product/external-wifi-antenna/) | [External WiFi/BT Antenna Kit](https://pycom.io/product/external-wifi-antenna/) | [LoRa & Sigfox Antenna Kit](https://pycom.io/product/lora-antenna-kit/) | [LoRa & Sigfox Antenna Kit](https://pycom.io/product/lora-antenna-kit/) | [LTE-M Antenna Kit](https://pycom.io/product/lte-m-antenna-kit/) | ## Accessories @@ -36,7 +41,7 @@ Below you will find tables of all Pycom products. These tables illustrate the fu PyCase - ✔ + ✔ @@ -44,7 +49,7 @@ Below you will find tables of all Pycom products. These tables illustrate the fu IP67 Case for Expansion Board - ✔ + ✔ @@ -53,31 +58,31 @@ Below you will find tables of all Pycom products. These tables illustrate the fu IP67 Case for Pysense/Pytrack/Pyscan - ✔ - ✔ - ✔ + ✔ + ✔ + ✔ IP67 Case (universal) - ✔ - ✔ - ✔ - ✔ + ✔ + ✔ + ✔ + ✔ LiPo Battery (user-supplied) - ✔ - ✔ - ✔ - ✔ + ✔ + ✔ + ✔ + ✔ Micro USB Cable Required (user-supplied) - ✔ - ✔ - ✔ - ✔ + ✔ + ✔ + ✔ + ✔ @@ -96,15 +101,15 @@ Below you will find tables of all Pycom products. These tables illustrate the fu - ✔ + ✔ ## OEM Modules -| OEM Module | [L01/W01 Reference Board](datasheets/oem/l01_reference.md) | [Universal Reference Board](datasheets/oem/universal_reference.md) | +| OEM Module | [L01/W01 Reference Board](datasheets/oem/l01_reference) | [Universal Reference Board](datasheets/oem/universal_reference) | | :--- | :--- | :--- | -| [W01](datasheets/oem/w01.md) | ✔ | ✔ | -| [L01](datasheets/oem/l01.md) | ✔ | ✔ | -| [L04](datasheets/oem/l04.md) | | ✔ | -| [G01](datasheets/oem/g01.md) | | ✔ | +| [W01](datasheets/oem/w01) | ✔ | ✔ | +| [L01](datasheets/oem/l01) | ✔ | ✔ | +| [L04](datasheets/oem/l04) | | ✔ | +| [G01](datasheets/oem/g01) | | ✔ | diff --git a/pybytes/introduction.md b/content/pybytes/_index.md similarity index 89% rename from pybytes/introduction.md rename to content/pybytes/_index.md index 8e6a154..1aea51f 100644 --- a/pybytes/introduction.md +++ b/content/pybytes/_index.md @@ -1,6 +1,8 @@ -# Introduction - -![](../.gitbook/assets/pybyteslogo%20%281%29.png) +--- +title: "" +aliases: +--- +![](/gitbook/assets/pybyteslogo%20%281%29.png) ## What is Pybytes? @@ -25,8 +27,8 @@ In a nutshell, Pybytes is an environment designed to optimise your IoT applicati ## Let's get started! -* [Getting started with Pybytes](getstarted.md) +* [Getting started with Pybytes](getstarted) * [Connect your Pycom module to Pybytes](connect/) -* [Visualise data from your device](dashboard.md) +* [Visualise data from your device](dashboard) * [Integrations with external services](integrations/) diff --git a/content/pybytes/connect/README.md b/content/pybytes/connect/README.md new file mode 100644 index 0000000..ed28e12 --- /dev/null +++ b/content/pybytes/connect/README.md @@ -0,0 +1,51 @@ +--- +title: "Add a device to Pybytes" +aliases: + - chapter/pybytes/connect/intro +--- +In this section, we will explain to you how to add a device to Pybytes + +## Step 1: Add device wizard + +In Pybytes, go to `Devices` Page: + +1. Click on `Add Device`. + +![](/gitbook/assets/1-1.jpg) + +2. Select your device (e.g., WiPy, LoPy, SiPy, etc.); + +![](/gitbook/assets/2-1.jpg) + +3. Select your shield (e.g., PySense, PyTrack, PyScan or other); + +![](/gitbook/assets/3%20%281%29.jpg) + +4. Select your network option; + +![](/gitbook/assets/4%20%281%29.jpg) + +5. Enter a unique name and the network credentials (SSID and password) for your device; + +![](/gitbook/assets/5-1.jpg) + +## Step 2: Connect your device to Pybytes + +At the end of the "Add Device" wizard, Pybytes will give you two options for you to connect your device to Pybytes: + +![](/gitbook/assets/7-1.png) + +Select how you would like to connect your device to Pybytes: + +1. [Connect your device quickly (Recommended)](quick) + +{{% refname "quick.md" %}} + +2. [Connect your device by flashing Pybytes Library](flash) + +{{% refname "flash.md" %}} + +{{{% hint style="info" %}}} +From firmware 1.16.x onwards all Pycom devices come with Pybytes library built-in `/frozen` folder. That means that you can choose between adding your device quickly with the firmware updater or you can flash Pybytes library manually. +{{< /hint >}} + diff --git a/content/pybytes/connect/_index.md b/content/pybytes/connect/_index.md new file mode 100644 index 0000000..409e3a6 --- /dev/null +++ b/content/pybytes/connect/_index.md @@ -0,0 +1,50 @@ +--- +title: "Add a device to Pybytes" +aliases: +--- +In this section, we will explain to you how to add a device to Pybytes + +## Step 1: Add device wizard + +In Pybytes, go to `Devices` Page: + +1. Click on `Add Device`. + +![](/gitbook/assets/1-1.jpg) + +2. Select your device (e.g., WiPy, LoPy, SiPy, etc.); + +![](/gitbook/assets/2-1.jpg) + +3. Select your shield (e.g., PySense, PyTrack, PyScan or other); + +![](/gitbook/assets/3%20%281%29.jpg) + +4. Select your network option; + +![](/gitbook/assets/4%20%281%29.jpg) + +5. Enter a unique name and the network credentials (SSID and password) for your device; + +![](/gitbook/assets/5-1.jpg) + +## Step 2: Connect your device to Pybytes + +At the end of the "Add Device" wizard, Pybytes will give you two options for you to connect your device to Pybytes: + +![](/gitbook/assets/7-1.png) + +Select how you would like to connect your device to Pybytes: + +1. [Connect your device quickly (Recommended)](quick) + +{{% refname "quick.md" %}} + +2. [Connect your device by flashing Pybytes Library](flash) + +{{% refname "flash.md" %}} + +{{{% hint style="info" %}}} +From firmware 1.16.x onwards all Pycom devices come with Pybytes library built-in `/frozen` folder. That means that you can choose between adding your device quickly with the firmware updater or you can flash Pybytes library manually. +{{< /hint >}} + diff --git a/pybytes/connect/flash.md b/content/pybytes/connect/flash.md similarity index 74% rename from pybytes/connect/flash.md rename to content/pybytes/connect/flash.md index f1b5b2d..8994f84 100644 --- a/pybytes/connect/flash.md +++ b/content/pybytes/connect/flash.md @@ -1,22 +1,27 @@ -# Connect to Pybytes: Flash Pybytes library manually - +--- +title: "Connect to Pybytes: Flash Pybytes library manually" +aliases: + - pybytes/connect/flash.html + - pybytes/connect/flash.md + - chapter/pybytes/connect/flash +--- ## Connecting a device to Pybytes by flashing Pybytes library manually In this section, we will explain to you how to connect your device to Pybytes by flashing Pybytes library manually. -{% hint style="info" %} -From firmware 1.16.x onwards all Pycom devices come with Pybytes library build-in `/frozen` folder. That means that you can add your device quickly without the need of flashing Pybytes library manually. [Click here for more information.](quick.md) -{% endhint %} +{{{% hint style="info" %}}} +From firmware 1.16.x onwards all Pycom devices come with Pybytes library build-in `/frozen` folder. That means that you can add your device quickly without the need of flashing Pybytes library manually. [Click here for more information.](quick) +{{< /hint >}} ### Step 1: Download your Pybytes Library At the last step of the "Add Device" process: -![](../../.gitbook/assets/pybyteslib-box-1.gif) +![](/gitbook/assets/pybyteslib-box-1.gif) 1. Click on download "Pybytes library" -![](../../.gitbook/assets/pybytes-library-wizard%20%281%29.png) +![](/gitbook/assets/pybytes-library-wizard%20%281%29.png) You can also download _Pybytes library_ at the device's settings page: @@ -26,13 +31,13 @@ You can also download _Pybytes library_ at the device's settings page: 4. Click on the button _Download_ at Pybytes library; -![](../../.gitbook/assets/pybytes-library-download%20%281%29.gif) +![](/gitbook/assets/pybytes-library-download%20%281%29.gif) ### Step 2. Flash your device with Pymakr -{% hint style="info" %} -In case you haven't installed Pymakr plugin, follow [these instructions](../../pymakr/installation/atom.md). -{% endhint %} +{{{% hint style="info" %}}} +In case you haven't installed Pymakr plugin, follow [these instructions](/../pymakr/installation/atom). +{{< /hint >}} 1. Connect your device to your computer with USB cable. 2. Extract download Pybytes library and open extracted folder with Atom. @@ -52,18 +57,18 @@ In case you haven't installed Pymakr plugin, follow [these instructions](../../p Like deviceToken or WiFi credentials. You can change e.g. your WiFy password here. -6. Put your device in [safe boot mode](../../gettingstarted/programming/safeboot.md). +6. Put your device in [safe boot mode](/../gettingstarted/programming/safeboot). 7. Upload code to your device by clicking on _Upload_ button in Pymakr. After all Pybytes library files are uploaded to device, device will restart and will connect to Pybytes. -{% hint style="info" %} +{{{% hint style="info" %}}} Pybytes library is written to `/flash` folder and will take precedence over build in firmware libraries in `/frozen` folder. -{% endhint %} +{{< /hint >}} ## Next step: Set up your device's dashboard! Now it's time to display data from your device into Pybytes dashboard. -{% page-ref page="../dashboard.md" %} +{{% refname "../dashboard.md" %}} diff --git a/pybytes/connect/quick.md b/content/pybytes/connect/quick.md similarity index 58% rename from pybytes/connect/quick.md rename to content/pybytes/connect/quick.md index 69da636..f2d182e 100644 --- a/pybytes/connect/quick.md +++ b/content/pybytes/connect/quick.md @@ -1,22 +1,27 @@ -# Connect to Pybytes: Quick Add - +--- +title: "Connect to Pybytes: Quick Add" +aliases: + - pybytes/connect/quick.html + - pybytes/connect/quick.md + - chapter/pybytes/connect/quick +--- ## Connecting a device to Pybytes quickly by using the Firmware Updater In this section, we explain to you how to connect your device to Pybytes quickly using the Firmware Updater. -{% hint style="info" %} -In case you want to extend Pybytes library you can flash Pybytes library manually. [Click here for more information.](flash.md) -{% endhint %} +{{{% hint style="info" %}}} +In case you want to extend Pybytes library you can flash Pybytes library manually. [Click here for more information.](flash) +{{< /hint >}} ### Step 1: Download the firmware updater At the last step of the "Add Device" process: -![](../../.gitbook/assets/7-1.png) +![](/gitbook/assets/7-1.png) 1. Download the [firmware updater](https://pycom.io/downloads/) for your operating system; -![](../../.gitbook/assets/8-1.png) +![](/gitbook/assets/8-1.png) 2. Copy the device token. @@ -26,29 +31,29 @@ Install the Firmware updater on your computer. 1. Start the `Firmware updater`; -![](../../.gitbook/assets/1-1.png) +![](/gitbook/assets/1-1.png) -![](../../.gitbook/assets/2%20%281%29.png) +![](/gitbook/assets/2%20%281%29.png) -2 .Select your device serial port \(Make sure your device is connected to your computer\); +2 .Select your device serial port (Make sure your device is connected to your computer); 3. Mark the options "Erase flash file system" and "Force update Pybytes registration"; -![](../../.gitbook/assets/3.png) +![](/gitbook/assets/3.png) 4. Paste your device token from Pybytes; -![](../../.gitbook/assets/5-1.gif) +![](/gitbook/assets/5-1.gif) 5. The firmware updater will update the device's firmware. -![](../../.gitbook/assets/6%20%281%29.png) +![](/gitbook/assets/6%20%281%29.png) -![](../../.gitbook/assets/7%20%282%29.png) +![](/gitbook/assets/7%20%282%29.png) ## Next step: Set up your device's dashboard! Now it's time to display data from your device into Pybytes dashboard. -{% page-ref page="../dashboard.md" %} +{{% refname "../dashboard.md" %}} diff --git a/content/pybytes/connect/sigfox/README.md b/content/pybytes/connect/sigfox/README.md new file mode 100644 index 0000000..7b387c0 --- /dev/null +++ b/content/pybytes/connect/sigfox/README.md @@ -0,0 +1,43 @@ +--- +title: "Add Sigfox device" +aliases: + - chapter/pybytes/connect/sigfox/sigfox +--- +{{{% hint style="danger" %}}} +Before you start you need to create Sigfox account. You need Pycom device with Sigfox to get your Sigfox account. [**Follow these instructions**](/../../gettingstarted/registration/sigfox). +{{< /hint >}} + +## Create Sigfox API credentials + +Once you have you account setup and are logged in Sigfox backend, you need to create API credentials for Pybytes. + +Click on GROUP → <your\_company\_name> → API ACCESS → New + +![](//gitbook/assets/apiaccess%20%281%29.png) + +In the form chose arbitrary _name_, select Profiles `DEVICE MANAGER [R]` and `DEVICE MANAGER [W]`. Then click on Ok. + +![](//gitbook/assets/apiaccessscope.png) + +Copy _Login_ and _Password_ to the clipboard. + +![](//gitbook/assets/apiaccesskeys.png) + +In Pybytes go to Settings → Sigfox API or [follow this link](https://pybytes.pycom.io/settings/sigfox-credentials) then paste in the form. + +![](//gitbook/assets/pybytessigfoxcredentials.png) + +## Sigfox contract types + +### Sigfox DevKit contracts + +Read more how to use Sigfox with [devKit contract](devkit). + +{{% refname "devkit.md" %}} + +### Sigfox custom contracts + +Read more how to use Sigfox with [Custom contract](devkit). + +{{% refname "custom.md" %}} + diff --git a/pybytes/connect/sigfox/README.md b/content/pybytes/connect/sigfox/_index.md similarity index 58% rename from pybytes/connect/sigfox/README.md rename to content/pybytes/connect/sigfox/_index.md index b6c1eeb..41f5ae1 100644 --- a/pybytes/connect/sigfox/README.md +++ b/content/pybytes/connect/sigfox/_index.md @@ -1,8 +1,10 @@ -# Add Sigfox device - -{% hint style="danger" %} -Before you start you need to create Sigfox account. You need Pycom device with Sigfox to get your Sigfox account. [**Follow these instructions**](../../../gettingstarted/registration/sigfox.md). -{% endhint %} +--- +title: "Add Sigfox device" +aliases: +--- +{{{% hint style="danger" %}}} +Before you start you need to create Sigfox account. You need Pycom device with Sigfox to get your Sigfox account. [**Follow these instructions**](/../../gettingstarted/registration/sigfox). +{{< /hint >}} ## Create Sigfox API credentials @@ -10,31 +12,31 @@ Once you have you account setup and are logged in Sigfox backend, you need to cr Click on GROUP → <your\_company\_name> → API ACCESS → New -![](../../../.gitbook/assets/apiaccess%20%281%29.png) +![](//gitbook/assets/apiaccess%20%281%29.png) In the form chose arbitrary _name_, select Profiles `DEVICE MANAGER [R]` and `DEVICE MANAGER [W]`. Then click on Ok. -![](../../../.gitbook/assets/apiaccessscope.png) +![](//gitbook/assets/apiaccessscope.png) Copy _Login_ and _Password_ to the clipboard. -![](../../../.gitbook/assets/apiaccesskeys.png) +![](//gitbook/assets/apiaccesskeys.png) In Pybytes go to Settings → Sigfox API or [follow this link](https://pybytes.pycom.io/settings/sigfox-credentials) then paste in the form. -![](../../../.gitbook/assets/pybytessigfoxcredentials.png) +![](//gitbook/assets/pybytessigfoxcredentials.png) ## Sigfox contract types ### Sigfox DevKit contracts -Read more how to use Sigfox with [devKit contract](devkit.md). +Read more how to use Sigfox with [devKit contract](devkit). -{% page-ref page="devkit.md" %} +{{% refname "devkit.md" %}} ### Sigfox custom contracts -Read more how to use Sigfox with [Custom contract](devkit.md). +Read more how to use Sigfox with [Custom contract](devkit). -{% page-ref page="custom.md" %} +{{% refname "custom.md" %}} diff --git a/pybytes/connect/sigfox/custom.md b/content/pybytes/connect/sigfox/custom.md similarity index 54% rename from pybytes/connect/sigfox/custom.md rename to content/pybytes/connect/sigfox/custom.md index d0abe06..0bc71d5 100644 --- a/pybytes/connect/sigfox/custom.md +++ b/content/pybytes/connect/sigfox/custom.md @@ -1,8 +1,13 @@ -# Custom contract - +--- +title: "Custom contract" +aliases: + - pybytes/connect/sigfox/custom.html + - pybytes/connect/sigfox/custom.md + - chapter/pybytes/connect/sigfox/sigfoxCustomContract +--- For building Sigfox application on Pybytes we recommend to [buy Sigfox contract](https://buy.sigfox.com/). -With Sigfox custom contract you can use Pybytes to register Sigfox devices on Sigfox backend automatically \(Pybytes talk to Sigfox backend API to register Sigfox devices automatically\). +With Sigfox custom contract you can use Pybytes to register Sigfox devices on Sigfox backend automatically (Pybytes talk to Sigfox backend API to register Sigfox devices automatically). You can select Sigfox _device type_ associated with your Sigfox _custom contract_. @@ -10,28 +15,28 @@ Newly created devices will be added to selected device type completely by Pybyte ## Adding devices using Sigfox custom contract -Go to: Settings \(in sidebar\) → Sigfox API → Settings +Go to: Settings (in sidebar) → Sigfox API → Settings and select Sigfox device type which is associated with Sigfox custom contract. -![](../../../.gitbook/assets/selectdevicetypecustomcontract.png) +![](//gitbook/assets/selectdevicetypecustomcontract.png) ### Add your Sigfox device to Pybytes -1. Create Sigfox device \(Lopy4, SiPy, FiPy\) in Pybytes and copy its device token to clipboard. +1. Create Sigfox device (Lopy4, SiPy, FiPy) in Pybytes and copy its device token to clipboard. 2. Connect your device to your computer and update it with Pycom firmware updater. 1. Select Pybytes firmware 2. Paste your device token to firmware updater -{% hint style="info" %} -Detailed steps which are same for all devices are [**described here**](../quick.md). -{% endhint %} +{{{% hint style="info" %}}} +Detailed steps which are same for all devices are [**described here**](/quick). +{{< /hint >}} After your device was flashed with Pybytes firmware in automatically start adding itself to Sigfox backend. -![](../../../.gitbook/assets/sigfoxcustomcontractstatus%20%281%29.png) +![](//gitbook/assets/sigfoxcustomcontractstatus%20%281%29.png) ## Troubleshooting -[Disengage Sigfox sequence number](../../../tutorials/sigfox.md#disengage-sequence-number) +[Disengage Sigfox sequence number](/../../tutorials/sigfox.md#disengage-sequence-number) diff --git a/pybytes/connect/sigfox/devkit.md b/content/pybytes/connect/sigfox/devkit.md similarity index 60% rename from pybytes/connect/sigfox/devkit.md rename to content/pybytes/connect/sigfox/devkit.md index 3323200..2f2d3d9 100644 --- a/pybytes/connect/sigfox/devkit.md +++ b/content/pybytes/connect/sigfox/devkit.md @@ -1,23 +1,28 @@ -# DevKit contract - +--- +title: "DevKit contract" +aliases: + - pybytes/connect/sigfox/devkit.html + - pybytes/connect/sigfox/devkit.md + - chapter/pybytes/connect/sigfox/sigfoxDevKit +--- Every Sigfox Pycom device comes with free Sigfox connectivity - Sigfox DevKit contract. It provides one year of Sigfox connectivity. This is great for prototyping. -But every device you want to add to Pybytes you need register on Sigfox backend. You need to repeat [Sigfox activation procedure](../../../gettingstarted/registration/sigfox.md). +But every device you want to add to Pybytes you need register on Sigfox backend. You need to repeat [Sigfox activation procedure](/../../gettingstarted/registration/sigfox). -After you add your Sigfox credentials to Pybytes you can see DevKit contract type is selected as default \(on page Settings → Sigfox API\). +After you add your Sigfox credentials to Pybytes you can see DevKit contract type is selected as default (on page Settings → Sigfox API). -![](../../../.gitbook/assets/pybytesdevkit%20%281%29.png) +![](//gitbook/assets/pybytesdevkit%20%281%29.png) ## Add your device to Pybytes -1. Create Sigfox device \(Lopy4, SiPy, FiPy\) in Pybytes and copy its device token to clipboard. +1. Create Sigfox device (Lopy4, SiPy, FiPy) in Pybytes and copy its device token to clipboard. 2. Connect your device to your computer and update it with Pycom firmware updater. 1. Select Pybytes firmware 2. Paste your device token to firmware updater -{% hint style="info" %} -Detailed steps which are same for all devices are [**described here**](../quick.md). -{% endhint %} +{{{% hint style="info" %}}} +Detailed steps which are same for all devices are [**described here**](/quick). +{{< /hint >}} ## Check sigfox status @@ -27,19 +32,19 @@ Now you should see sigfox status component. Click on _Check Sigfox status_ button -![](../../../.gitbook/assets/devkitcheck.png) +![](//gitbook/assets/devkitcheck.png) You should see two green lights. First green light means that your device was found in Sigfox group which uses Sigfox API credentials you saved to Pybytes. -Second green light means that HTTP POST callback was created on Sigfox backend for your _Dev Kit_ device type. Because Dev Kit device type is associated with Dev Kit contract \(which can hold only one device\), you need to create Sigfox callback for every device you add to Pybytes. +Second green light means that HTTP POST callback was created on Sigfox backend for your _Dev Kit_ device type. Because Dev Kit device type is associated with Dev Kit contract (which can hold only one device), you need to create Sigfox callback for every device you add to Pybytes. Note that Sigfox callback are associated to Sigfox device types. -This is not an issue with Custom contract, where _device type_ on Sigfox backend can contain many devices, therefore you just need to one Sigfox HTTP POST callback \(It is created automatically by Pybytes\). +This is not an issue with Custom contract, where _device type_ on Sigfox backend can contain many devices, therefore you just need to one Sigfox HTTP POST callback (It is created automatically by Pybytes). ## Troubleshooting -[Disengage Sigfox sequence number](../../../tutorials/sigfox.md#disengage-sequence-number) +[Disengage Sigfox sequence number](/../../tutorials/sigfox.md#disengage-sequence-number) diff --git a/pybytes/dashboard.md b/content/pybytes/dashboard.md similarity index 76% rename from pybytes/dashboard.md rename to content/pybytes/dashboard.md index f008a01..89c8c72 100644 --- a/pybytes/dashboard.md +++ b/content/pybytes/dashboard.md @@ -1,12 +1,17 @@ -# Visualise data from your device - +--- +title: "Visualise data from your device" +aliases: + - pybytes/dashboard.html + - pybytes/dashboard.md + - chapter/pybytes/dashboard/intro +--- In this section, we will explain to you how to create widgets for data visualisation and set up your device's dashboard on Pybytes. -{% hint style="info" %} +{{{% hint style="info" %}}} We assume that you already have your device connected to Pybytes. In case you haven't, check how to [add your device here](connect/). After your done with that, you can proceed to the next example. -{% endhint %} +{{< /hint >}} -## Step 1: Set up your application \(main.py\) +## Step 1: Set up your application (main.py) The first step is to have an application running on your device. The application in this example sends data from a vector every 10 seconds to Pybytes. @@ -41,7 +46,7 @@ _thread.start_new_thread(send_env_data, ()) 3. Upload the code into your device. Now your device is sending data to Pybytes. -{% hint style="info" %} +{{{% hint style="info" %}}} In this code, we're calling the function `pybytes.send_virtual_pin_value(persistent, pin, value))` to communicate with Pybytes. This function is part of the Pybytes library, and it has three arguments: `persistent`, `pin` and `value`. @@ -55,75 +60,75 @@ Go to Pybytes. 1. On `Devices` page select a device; -![](../.gitbook/assets/01%20%281%29.gif) +![](/gitbook/assets/01%20%281%29.gif) 2. On your device's page click on `Data` tab. -![](../.gitbook/assets/02-1.png) +![](/gitbook/assets/02-1.png) 3. Click on the `Define New Signal` button. -![](../.gitbook/assets/03-1.png) +![](/gitbook/assets/03-1.png) 4. Define the new signal by entering a number, a name, a data type and a unit. Finally, click on the button `Define`. -![](../.gitbook/assets/04-1.gif) +![](/gitbook/assets/04-1.gif) 5. Your signal was added! -![](../.gitbook/assets/05%20%281%29.png) +![](/gitbook/assets/05%20%281%29.png) -{% hint style="info" %} -The name and unit are labels used to identify your signal inside Pybytes \(In this example we defined `Sinwave` as the name of the signal and `Rad` as the unit\). +{{{% hint style="info" %}}} +The name and unit are labels used to identify your signal inside Pybytes (In this example we defined `Sinwave` as the name of the signal and `Rad` as the unit). -The signal number has to match the pin number that you defined on `pybytes.send_virtual_pin_value` function call, inside your `main.py` code \(In this example we defined `pin = 1`\); +The signal number has to match the pin number that you defined on `pybytes.send_virtual_pin_value` function call, inside your `main.py` code (In this example we defined `pin = 1`); -The datatype also has to match the variable used as argument on `pybytes.send_virtual_pin_value` function call, inside your `main.py` code \(In this example our variable is a floating number; therefore we defined as a `Float32`\). -{% endhint %} +The datatype also has to match the variable used as argument on `pybytes.send_virtual_pin_value` function call, inside your `main.py` code (In this example our variable is a floating number; therefore we defined as a `Float32`). +{{< /hint >}} ## Step 3: Add a widget for the signal 1. Click on the signal card. -![](../.gitbook/assets/01.png) +![](/gitbook/assets/01.png) 2. Click on the button `Create a new display`. -![](../.gitbook/assets/02-1%20%281%29.png) +![](/gitbook/assets/02-1%20%281%29.png) -3. Select the type of visualisation \(e.g. Bar chart or Line chart\). +3. Select the type of visualisation (e.g. Bar chart or Line chart). -![](../.gitbook/assets/03.gif) +![](/gitbook/assets/03.gif) 4. You can adjust the parameters of your widget at `Settings`. After, click on the button `Create`. -![](../.gitbook/assets/04-1.png) +![](/gitbook/assets/04-1.png) 5. Your widget was created. Now, add your widget to your device's dashboard. Click on the button `Edit` on your widget. -![](../.gitbook/assets/05-1.png) +![](/gitbook/assets/05-1.png) 6. Mark the checkbox `Display on Dashboard` at `Settings`. Finally, click on the button `Save`. -![](../.gitbook/assets/06.gif) +![](/gitbook/assets/06.gif) 7. Click on the tab `Dashboard`. Your widget was successfully added there! -![](../.gitbook/assets/07.png) +![](/gitbook/assets/07.png) ## Step 4: Organise your dashboard 1. Click on the button `Organise`. Now the dashboard's grid will enter the edit mode and allow you to resize and reposition its widgets. -![](../.gitbook/assets/edit-mode%20%281%29.gif) +![](/gitbook/assets/edit-mode%20%281%29.gif) 2. Resize a widget by clicking on the triangle icon at the bottom right corner of the widget and drag the cursor over the grid. After, click on the button `Save` to save this action. -![](../.gitbook/assets/02-1.gif) +![](/gitbook/assets/02-1.gif) 3. Change the widget's position by drag-and-dropping it over the grid. After, click on the button `Save` to save this action. -![](../.gitbook/assets/03-1.gif) +![](/gitbook/assets/03-1.gif) ## Done! diff --git a/pybytes/getstarted.md b/content/pybytes/getstarted.md similarity index 71% rename from pybytes/getstarted.md rename to content/pybytes/getstarted.md index 2802109..3ef53c6 100644 --- a/pybytes/getstarted.md +++ b/content/pybytes/getstarted.md @@ -1,5 +1,10 @@ -# Getting Started with Pybytes - +--- +title: "Getting Started with Pybytes" +aliases: + - pybytes/getstarted.html + - pybytes/getstarted.md + - chapter/pybytes/getstarted/intro +--- Follow these steps to create a Pybytes account: ## Step 1: Go to the registration page @@ -13,5 +18,5 @@ Follow these steps to create a Pybytes account: Now it's time to explore Pybytes. You can start by connecting your Pycom board to Pybytes. -{% page-ref page="connect/" %} +{{% refname "connect/" %}} diff --git a/content/pybytes/integrations/README.md b/content/pybytes/integrations/README.md new file mode 100644 index 0000000..04dcc1d --- /dev/null +++ b/content/pybytes/integrations/README.md @@ -0,0 +1,13 @@ +--- +title: "Integrations" +aliases: +--- +## Integration with external services + +Pybytes offers a way to interact with external IoT platform or custom services, like the following: + +* [AWS IoT](amazon-iot): a managed cloud platform that lets connected devices easily and securely interact with cloud applications and other devices +* [Microsoft Azure](azure): it's a comprehensive collection of services and solutions designed to help you create end-to-end IoT applications on Azure. +* [Google Cloud IoT](google): a complete set of tools to connect, process, store, and analyze data both at the edge and in the cloud. +* [Web Hooks](webhooks): user-defined HTTP callbacks to a defined remote destination. All elements of +the requests (headers, query string parameters, etc) are customizable. diff --git a/content/pybytes/integrations/_index.md b/content/pybytes/integrations/_index.md new file mode 100644 index 0000000..04dcc1d --- /dev/null +++ b/content/pybytes/integrations/_index.md @@ -0,0 +1,13 @@ +--- +title: "Integrations" +aliases: +--- +## Integration with external services + +Pybytes offers a way to interact with external IoT platform or custom services, like the following: + +* [AWS IoT](amazon-iot): a managed cloud platform that lets connected devices easily and securely interact with cloud applications and other devices +* [Microsoft Azure](azure): it's a comprehensive collection of services and solutions designed to help you create end-to-end IoT applications on Azure. +* [Google Cloud IoT](google): a complete set of tools to connect, process, store, and analyze data both at the edge and in the cloud. +* [Web Hooks](webhooks): user-defined HTTP callbacks to a defined remote destination. All elements of +the requests (headers, query string parameters, etc) are customizable. diff --git a/pybytes/integrations/amazon-iot.md b/content/pybytes/integrations/amazon-iot.md similarity index 73% rename from pybytes/integrations/amazon-iot.md rename to content/pybytes/integrations/amazon-iot.md index 2eb6cee..54fe4af 100644 --- a/pybytes/integrations/amazon-iot.md +++ b/content/pybytes/integrations/amazon-iot.md @@ -1,32 +1,36 @@ -# Amazon IoT - +--- +title: "Amazon IoT" +aliases: + - pybytes/integrations/amazon-iot.html + - pybytes/integrations/amazon-iot.md +--- Whenever one of your integrated devices sends a signal to our broker, we republish the binary payload to the endpoint specified for its integration. ## Integrate your devices 1. Go in the sidebar, click on _New Integration_ and then on _Amazon Web Services_ -![New AWS integration](../../.gitbook/assets/01_aws_integration.png) +![New AWS integration](/gitbook/assets/01_aws_integration.png) 2. Fill in the form choosing an [AWS region](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) and your AWS credentials. You can optionally choose to save them inside the local storage for future use. Once you're done, click _Login_ -![Fill in the form with AWS keys and choosing a region](../../.gitbook/assets/02_aws_integration.png) +![Fill in the form with AWS keys and choosing a region](/gitbook/assets/02_aws_integration.png) -3. In this step, you have to specify the [AWS group](https://docs.aws.amazon.com/iot/latest/developerguide/thing-groups.html) name \(just alphanumeric letter, dashes and underscore are allowed\), the custom topic and the devices you want to bind to AWS. When you're ready, click _Create_ +3. In this step, you have to specify the [AWS group](https://docs.aws.amazon.com/iot/latest/developerguide/thing-groups.html) name (just alphanumeric letter, dashes and underscore are allowed), the custom topic and the devices you want to bind to AWS. When you're ready, click _Create_ -![AWS group creation](../../.gitbook/assets/03_aws_integration.png) +![AWS group creation](/gitbook/assets/03_aws_integration.png) 4. If everything's worked as expected, you should be able to see a summary of your integration like the following: -![Creation process result](../../.gitbook/assets/04_aws_integration.png) +![Creation process result](/gitbook/assets/04_aws_integration.png) 5. The corresponding AWS Thing and AWS Group has been created as well, you just have to [log in to the console](https://console.aws.amazon.com/console/home?nc2=h_ct&src=header-signin) and choose the same region of your devices from the topbar. You'll be able to explore groups and things' details. -![AWS things and groups just created](../../.gitbook/assets/05_aws_integration.png) +![AWS things and groups just created](/gitbook/assets/05_aws_integration.png) 6. The device's name is specified as an attribute of the thing. -![Device's attributes](../../.gitbook/assets/06_aws_integration.png) +![Device's attributes](/gitbook/assets/06_aws_integration.png) ## Final considerations diff --git a/pybytes/integrations/azure.md b/content/pybytes/integrations/azure.md similarity index 87% rename from pybytes/integrations/azure.md rename to content/pybytes/integrations/azure.md index 62ad727..6206c13 100644 --- a/pybytes/integrations/azure.md +++ b/content/pybytes/integrations/azure.md @@ -1,5 +1,9 @@ -# Azure - +--- +title: "" +aliases: + - pybytes/integrations/azure.html + - pybytes/integrations/azure.md +--- Whenever one of your integrated devices sends a signal to our broker, we republish the binary payload to the endpoint specified for its integration through [Azure IoT Hub SDK](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-sdks). ## Integrate your devices @@ -11,32 +15,32 @@ Whenever one of your integrated devices sends a signal to our broker, we republi - choose the Iot Hub name (its length must be between 3 and 50, and it must contains only alphanumeric characters and hyphens). It won't be possible to change this name later. - [specify tier scaling and units](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-scaling) -![IoT Hub creation](../../.gitbook/assets/01_azure_integration.png) +![IoT Hub creation](/gitbook/assets/01_azure_integration.png) 2. Now copy and paste a connection string with the privilege to write into the registry by clicking on the relative button -![Copy the connection string](../../.gitbook/assets/02_azure_integration.png) +![Copy the connection string](/gitbook/assets/02_azure_integration.png) 3. Now go into Pybytes and click on *Integrations* > *New Integration* and choose *Microsoft Azure*. Paste the IoT Hub Connection String copied from the previous step and click *Login* -![Login](../../.gitbook/assets/03_azure_integration.png) +![Login](/gitbook/assets/03_azure_integration.png) 4. This step requires you to create a custom MQTT topic and the devices you want to bind to this Azure IoT hub. All the messages sent by your devices, will be republished to the Azure's MQTT broker with the topic specified here. When you're ready, click _Create_ -![Specify topic and name](../../.gitbook/assets/04_azure_integration.png) +![Specify topic and name](/gitbook/assets/04_azure_integration.png) 5. If everything's worked as expected, you should be able to see a summary of your integration like the following: -![Azure integration's summary](../../.gitbook/assets/05_azure_integration.png) +![Azure integration's summary](/gitbook/assets/05_azure_integration.png) 6. The corresponding device has been created in Azure as well, you just have to [log in to the portal](https://portal.azure.com/), click on its IoT Hub and then click on the device just created. You should be able to see all the device's details, also the connection string which will be saved encrypted in our database and used to republish your data to your Azure IoT Hub. -![Azure device's details](../../.gitbook/assets/06_azure_integration.png) +![Azure device's details](/gitbook/assets/06_azure_integration.png) 7. Try to send some signal messages with your device. You should be able to see in the dashboard that the system has received them. More information on testing device's connectivity could be found [here](https://docs.microsoft.com/en-us/azure/iot-hub/tutorial-connectivity). -![Test device connectivity](../../.gitbook/assets/07_azure_integration.png) +![Test device connectivity](/gitbook/assets/07_azure_integration.png) ## Final considerations diff --git a/pybytes/integrations/google.md b/content/pybytes/integrations/google.md similarity index 82% rename from pybytes/integrations/google.md rename to content/pybytes/integrations/google.md index 2757293..32ff507 100644 --- a/pybytes/integrations/google.md +++ b/content/pybytes/integrations/google.md @@ -1,5 +1,9 @@ -# Google Cloud IoT - +--- +title: "" +aliases: + - pybytes/integrations/google.html + - pybytes/integrations/google.md +--- Whenever one of your integrated devices sends a signal to our broker, we republish the binary payload to the Google endpoint specified for its integration through MQTT protocol. ## Integrate your devices @@ -8,35 +12,35 @@ Whenever one of your integrated devices sends a signal to our broker, we republi 2. Make sure to [enable billing](https://cloud.google.com/billing/docs/how-to/modify-project) and [the Cloud IoT Core API](https://console.cloud.google.com/flows/enableapi?apiid=cloudiot.googleapis.com&redirect=https://console.cloud.google.com&_ga=2.236270149.-51976751.1517992223) for that project. 3. At this point, you should see inside your Google IoT dashboard that your project is correctly bound to Google IoT services -![Google dashboard](../../.gitbook/assets/01_google_integration.png) +![Google dashboard](/gitbook/assets/01_google_integration.png) 4. Now let's access Pybytes and click _Integrations > New integration > Google Cloud_ -![Google Cloud's selection](../../.gitbook/assets/02_google_integration.png) +![Google Cloud's selection](/gitbook/assets/02_google_integration.png) 5. You'll see that Pybytes requires you to authenticate with your Google account. The account you'll be using, must have the privileges to access that project. -![Google's authentication](../../.gitbook/assets/03_google_integration.png) +![Google's authentication](/gitbook/assets/03_google_integration.png) 6. Once you've logged in, the first thing to do is to specify the project's ID and the region. This is required to correctly identify a resource and list all the related [registries](https://cloud.google.com/iot/docs/concepts/devices#device_registries). -![Step 1: project ID and region](../../.gitbook/assets/04_google_integration.png) +![Step 1: project ID and region](/gitbook/assets/04_google_integration.png) 7. The following step allows you to create a new registry or select an existing one. Whenever you choose a registry, the corresponding topics will be loaded in the dropdown menu below. This is required by Google, but it's different from the topics used by the integration to publish payloads to Google cloud. For further information, [please read this section](https://cloud.google.com/iot/docs/how-tos/mqtt-bridge#publishing_telemetry_events). -![Step 2: registry and topic](../../.gitbook/assets/05_google_integration.png) +![Step 2: registry and topic](/gitbook/assets/05_google_integration.png) 8. The last step allows you to choose the devices you want to integrate and summarizes the identifying elements of this integration. -![Step 3: Choose devices](../../.gitbook/assets/06_google_integration.png) +![Step 3: Choose devices](/gitbook/assets/06_google_integration.png) 9. Once you click _Create_, if the operation is successful, you'll be able to see the final screen which states the correct integration. -![Successfully integrated](../../.gitbook/assets/07_google_integration.png) +![Successfully integrated](/gitbook/assets/07_google_integration.png) If you access the registry on Google cloud, you'll be able to see the just created device there as well. -![Google registry's devices view](../../.gitbook/assets/08_google_integration.png) +![Google registry's devices view](/gitbook/assets/08_google_integration.png) ## Final considerations diff --git a/pybytes/integrations/webhooks.md b/content/pybytes/integrations/webhooks.md similarity index 80% rename from pybytes/integrations/webhooks.md rename to content/pybytes/integrations/webhooks.md index 562c0c5..9f85e0f 100644 --- a/pybytes/integrations/webhooks.md +++ b/content/pybytes/integrations/webhooks.md @@ -1,12 +1,16 @@ -# Web hooks - +--- +title: "" +aliases: + - pybytes/integrations/webhooks.html + - pybytes/integrations/webhooks.md +--- Whenever one of your integrated devices sends a signal to our broker, we perform an HTTP request defined by the user. You can use some presets (`DEVICE_TOKEN`, `USER_ID`, etc), which will act like placeholders and will be dinamically replaced at the moment of performing the request with the relative content. ## Integrate your devices 1. Go in the sidebar, click on _New Integration_ and then on _Webhook_ -![New Web Hook integration](../../.gitbook/assets/01_webhook_integration.png) +![New Web Hook integration](/gitbook/assets/01_webhook_integration.png) 2. Fill in the form specifying the following information: 1. The remote URL to which we will send the data @@ -18,8 +22,8 @@ Whenever one of your integrated devices sends a signal to our broker, we perform We will take care of formatting the body accordingly to the chosen request format. In case you've chosen _Custom Body_, you'll have to define everything by yourself and you'll also be allowed to manually insert the presets. Once you're done, you'll see a preview of the request at the bottom of the page. Remember to choose the devices you want to bind to this service. -![Web Hook definition](../../.gitbook/assets/02_webhook_integration.png) +![Web Hook definition](/gitbook/assets/02_webhook_integration.png) 1. If everything's worked as expected, you should be able to see a summary of your integration like the following: -![Creation process result](../../.gitbook/assets/03_webhook_integration.png) +![Creation process result](/gitbook/assets/03_webhook_integration.png) diff --git a/content/pybytes/introduction.md b/content/pybytes/introduction.md new file mode 100644 index 0000000..04dd23c --- /dev/null +++ b/content/pybytes/introduction.md @@ -0,0 +1,37 @@ +--- +title: "Introduction" +aliases: + - pybytes/introduction.html + - pybytes/introduction.md + - chapter/pybytes +--- +![](/gitbook/assets/pybyteslogo%20%281%29.png) + +## What is Pybytes? + +Pybytes is an IoT Ecosystem that empowers you by granting full control of all your Pycom devices. + +With Pybytes you have control over your device's data stream and more: + +* Visualise sensors data according to your interests using our customisable dashboard; +* Check the status of your entire fleet; +* Keep track of your assets with our geolocation feature; +* Distribute firmware updates on a scalable approach. + +In a nutshell, Pybytes is an environment designed to optimise your IoT applications using Pycom boards. + +## What Pybytes offers you? + +* Data Visualisation: Pybytes dashboard is customisable, allowing you to freely set up key performance indicators and time series data from all your sensors. +* Intelligent notifications: Keep track of your device's status, battery level, data streaming and measurements with pre-defined alarms. Receive notifications via email or SMS. +* Terminal: Execute commands to gather accurate information from your devices using Pybytes terminal shell. +* Firmware updates over the air: Upgrade or downgrade firmware versions with our exclusive firmware update. +* Track your assets position: Google Maps API empowers your view over your device's geolocation. + +## Let's get started! + +* [Getting started with Pybytes](getstarted) +* [Connect your Pycom module to Pybytes](connect/) +* [Visualise data from your device](dashboard) +* [Integrations with external services](integrations/) + diff --git a/gettingstarted/installation/pymakr.md b/content/pymakr/installation/README.md similarity index 56% rename from gettingstarted/installation/pymakr.md rename to content/pymakr/installation/README.md index 6cc809f..e561898 100644 --- a/gettingstarted/installation/pymakr.md +++ b/content/pymakr/installation/README.md @@ -1,12 +1,15 @@ -# Pymakr - -![](../../.gitbook/assets/pymakr-logo-1%20%281%29.png) +--- +title: "Installation" +aliases: + - chapter/pymakr/installation +--- +![](/gitbook/assets/pymakr-logo-1.png) ## Pymakr Plugins To make it as easy as possible Pycom has developed a plugin for two popular text editors, called Pymakr. These plugins have been built and are available for the following platforms: -{% page-ref page="../../pymakr/installation/atom.md" %} +{{% refname "atom.md" %}} -{% page-ref page="../../pymakr/installation/vscode.md" %} +{{% refname "vscode.md" %}} diff --git a/pymakr/installation/README.md b/content/pymakr/installation/_index.md similarity index 63% rename from pymakr/installation/README.md rename to content/pymakr/installation/_index.md index 1781c20..6405db5 100644 --- a/pymakr/installation/README.md +++ b/content/pymakr/installation/_index.md @@ -1,12 +1,14 @@ -# Installation - -![](../../.gitbook/assets/pymakr-logo-1.png) +--- +title: "Installation" +aliases: +--- +![](/gitbook/assets/pymakr-logo-1.png) ## Pymakr Plugins To make it as easy as possible Pycom has developed a plugin for two popular text editors, called Pymakr. These plugins have been built and are available for the following platforms: -{% page-ref page="atom.md" %} +{{% refname "atom.md" %}} -{% page-ref page="vscode.md" %} +{{% refname "vscode.md" %}} diff --git a/pymakr/installation/atom.md b/content/pymakr/installation/atom.md similarity index 73% rename from pymakr/installation/atom.md rename to content/pymakr/installation/atom.md index 396eaa0..0e75b72 100644 --- a/pymakr/installation/atom.md +++ b/content/pymakr/installation/atom.md @@ -1,28 +1,33 @@ -# Atom - +--- +title: "Atom" +aliases: + - pymakr/installation/atom.html + - pymakr/installation/atom.md + - chapter/pymakr/installation/atom +--- For beginners, users getting started with MicroPython & Pycom as well as Atom text editor users, we recommend the **Pymakr Plugin for Atom**. This section will help you get started using the Atom Text Editor & Pymakr Plugin. Please follow these steps to install the Pymakr Plugin: 1. Ensure that you have Atom installed and open. -![](../../.gitbook/assets/atom_setup_step_1-1.png) +![](/gitbook/assets/atom_setup_step_1-1.png) 2. Navigate to the Install page, via `Atom > Preferences > Install` -![](../../.gitbook/assets/atom_setup_step_2-1.png) +![](/gitbook/assets/atom_setup_step_2-1.png) 3. Search for `Pymakr` and select the official Pycom Pymakr Plugin. -![](../../.gitbook/assets/atom_setup_step_3-1.png) +![](/gitbook/assets/atom_setup_step_3-1.png) 4. You should now see and click the Install button. This will download and install the Pymakr Plugin. -![](../../.gitbook/assets/atom_setup_step_4-1.png) +![](/gitbook/assets/atom_setup_step_4-1.png) -5. That’s it! You’ve installed the Pymakr Plugin for Atom. +5. That's it! You've installed the Pymakr Plugin for Atom. -![](../../.gitbook/assets/atom_setup_step_5-1.png) +![](/gitbook/assets/atom_setup_step_5-1.png) ## Connecting via Serial USB @@ -34,40 +39,40 @@ After installing the Pymakr Plugin, you need to take a few seconds to configure 2. Open Atom and ensure that the Pymakr Plugin has correctly installed. -![](../../.gitbook/assets/atom_config_step_2-1.png) +![](/gitbook/assets/atom_config_step_2-1.png) 3. Open the Pymakr console by clicking the `^` button, located in the lower right side of the Atom window. -![](../../.gitbook/assets/atom_config_step_3%20%281%29.png) +![](/gitbook/assets/atom_config_step_3%20%281%29.png) 4. Click, `More` followed by `Get Serial Ports`. This will copy the serial address of your expansion board to your clipboard. -![](../../.gitbook/assets/atom_config_step_4.png) +![](/gitbook/assets/atom_config_step_4.png) 5. Navigate to `Settings > Global Settings` -![](../../.gitbook/assets/atom_config_step_5.png) +![](/gitbook/assets/atom_config_step_5.png) 6. Paste the serial address you copied earlier into the text field `Device Address` -![](../../.gitbook/assets/atom_config_step_6%20%281%29.png) +![](/gitbook/assets/atom_config_step_6%20%281%29.png) 7. Press connect and the Pymakr console should show three arrows `>>>`, indicating that you are connected -![](../../.gitbook/assets/atom_config_step_7%20%281%29.png) +![](/gitbook/assets/atom_config_step_7%20%281%29.png) These settings can also be applied on a per project basis by clicking `Settings` then `Project Settings`. This will open a JSON file which you can edit to enter your desired settings. -{% hint style="info" %} +{{{% hint style="info" %}}} This process is easiest with either a Pycom Expansion Board or a Pytrack/Pysense as the addresses are automatically selected. For external products such as FTDI USB Serial Cables, the serial address may need to be copied manually. Additionally, the reset button on the device may also need to be pressed before a connection message appears. -{% endhint %} +{{< /hint >}} ## Connecting via Telnet After installing the Pymakr Plugin, a device may be connected via the telnet interface. Please see the following steps: 1. Ensure that Pycom device is turned on -2. Connect the host computer to the WiFi Access Point named after your board \(the SSID will be as follows e.g. `lopy-wlan-xxxx`, `wipy-wlan-xxxx`, etc.\). The password is `www.pycom.io`. +2. Connect the host computer to the WiFi Access Point named after your board (the SSID will be as follows e.g. `lopy-wlan-xxxx`, `wipy-wlan-xxxx`, etc.). The password is `www.pycom.io`. 3. Follow the steps as above in the "Connecting via Serial USB" section but enter `192.168.4.1` as the address. @@ -75,5 +80,5 @@ After installing the Pymakr Plugin, a device may be connected via the telnet int 4. The default username and password are `micro` and `python`, respectively. 5. Click `Connect` in the Pymakr pane, Pymakr will now connect via telnet. -![](../../.gitbook/assets/pymakr-plugin-settings-1.png) +![](/gitbook/assets/pymakr-plugin-settings-1.png) diff --git a/pymakr/installation/vscode.md b/content/pymakr/installation/vscode.md similarity index 78% rename from pymakr/installation/vscode.md rename to content/pymakr/installation/vscode.md index 053e998..031481e 100644 --- a/pymakr/installation/vscode.md +++ b/content/pymakr/installation/vscode.md @@ -1,5 +1,10 @@ -# Visual Studio Code - +--- +title: "Visual Studio Code" +aliases: + - pymakr/installation/vscode.html + - pymakr/installation/vscode.md + - chapter/pymakr/installation/vscode +--- Pycom also supports Microsoft's Visual Studio Code IDE platform with the Pymakr Plugin. To download Visual Studio Code, navigate to [VS Code](https://code.visualstudio.com/). You will also need NodeJS installed on your PC. Please download the latest LTS version available [from the NodeJS website.](https://nodejs.org/) @@ -8,23 +13,23 @@ Please follow these steps to install the Pymakr VSCode Extension: 1. Ensure that you have VSCode installed and open. -![](../../.gitbook/assets/vsc_setup_step_1-1.png) +![](/gitbook/assets/vsc_setup_step_1-1.png) 2. Navigate to the Extensions page, using the 5th button in the left navigation -![](../../.gitbook/assets/vsc_setup_step_2-1.png) +![](/gitbook/assets/vsc_setup_step_2-1.png) 3. Search for `Pymakr` and click the install button next to it. -![](../../.gitbook/assets/vsc_setup_step_3.png) +![](/gitbook/assets/vsc_setup_step_3.png) 4. Within a few minutes, a reload button should appear. Press it to reload VSCode. -![](../../.gitbook/assets/vsc_setup_step_4.png) +![](/gitbook/assets/vsc_setup_step_4.png) -5. That’s it! You’ve installed the Pymakr Extension for VSCode +5. That's it! You've installed the Pymakr Extension for VSCode -![](../../.gitbook/assets/vsc_setup_step_5%20%281%29.png) +![](/gitbook/assets/vsc_setup_step_5%20%281%29.png) ## Connecting via Serial USB @@ -38,33 +43,33 @@ After installing the Pymakr Plugin, you need to take a few seconds to configure 2. Open Visual Studio Code and ensure that the Pymakr Plugin has correctly installed. -![](../../.gitbook/assets/vsc_config_step_1-1.png) +![](/gitbook/assets/vsc_config_step_1-1.png) 3. Click `All commands` on the bottom of the Visual Studio Code window -![](../../.gitbook/assets/vsc_config_step_2-1.png) +![](/gitbook/assets/vsc_config_step_2-1.png) 4. In the list that appears, click `Pymakr > Extra > List Serial Ports` -![](../../.gitbook/assets/vsc_config_step_3-1.png) +![](/gitbook/assets/vsc_config_step_3-1.png) 5. This will list the available serial ports. If Pymakr is able to auto-detect which to use, this will be copied to your clipboard. If not please manually copy the correct serial port. -![](../../.gitbook/assets/vsc_config_step_4.png) +![](/gitbook/assets/vsc_config_step_4.png) 6. Once again click `All commands`, then click `Pymakr > Global Settings`. This will open a JSON file. Paste the serial address you copied earlier into the field `address` and save the file. -![](../../.gitbook/assets/vsc_config_step_5-1.png) +![](/gitbook/assets/vsc_config_step_5-1.png) 7. Finally close the JSON file, click `All commands`, then `Pymakr > Connect` to connect your device. The Pymakr console should show three arrows `>>>`, indicating that you are connected -![](../../.gitbook/assets/vsc_config_step_6%20%281%29.png) +![](/gitbook/assets/vsc_config_step_6%20%281%29.png) These settings can also be applied on a per project basis by clicking `All commands` then `Pymakr > Project Settings`. This will open a JSON file which you can edit to enter your desired settings for the currently open project. -{% hint style="info" %} +{{{% hint style="info" %}}} This process is easiest with either a Pycom Expansion Board or a Pytrack/Pysense as the addresses are automatically selected. For external products such as FTDI USB Serial Cables, the serial address may need to be copied manually. Additionally, the reset button on the device may also need to be pressed before a connection message appears. -{% endhint %} +{{< /hint >}} ## Connecting via Telnet @@ -73,7 +78,7 @@ After installing the Pymakr Plugin, a device may be connected via the telnet int 1. Ensure that Pycom device is turned on 2. Connect the host computer to the WiFi Access Point named after your board - \(the SSID will be as follows e.g. `lopy-wlan-xxxx`, `wipy-wlan-xxxx`, etc.\). + (the SSID will be as follows e.g. `lopy-wlan-xxxx`, `wipy-wlan-xxxx`, etc.). The password is `www.pycom.io`. diff --git a/pymakr/settings.md b/content/pymakr/settings.md similarity index 83% rename from pymakr/settings.md rename to content/pymakr/settings.md index 3e75c85..bddca45 100644 --- a/pymakr/settings.md +++ b/content/pymakr/settings.md @@ -1,10 +1,15 @@ -# Settings - +--- +title: "Settings" +aliases: + - pymakr/settings.html + - pymakr/settings.md + - chapter/pymakr/settings +--- Below you will find a description of the various settings available for Pymakr. ## address -This is the address of the Pycom module you want Pymakr can connect to. This can be either a serial port \(e.g `COM1` on windows or `/dev/cu.usbserial-DQ0054ES` on Linux/macOS\) or an IP address \(Telnet\) \(e.g. `192.168.4.1` if connected to the AP created by the Pycom module\). +This is the address of the Pycom module you want Pymakr can connect to. This can be either a serial port (e.g `COM1` on windows or `/dev/cu.usbserial-DQ0054ES` on Linux/macOS) or an IP address (Telnet) (e.g. `192.168.4.1` if connected to the AP created by the Pycom module). ## username diff --git a/pymakr/toolsfeatures.md b/content/pymakr/toolsfeatures.md similarity index 72% rename from pymakr/toolsfeatures.md rename to content/pymakr/toolsfeatures.md index 19f3bb3..55dc614 100644 --- a/pymakr/toolsfeatures.md +++ b/content/pymakr/toolsfeatures.md @@ -1,8 +1,13 @@ -# Tools/Features +--- +title: "Tools/Features" +aliases: + - pymakr/toolsfeatures.html + - pymakr/toolsfeatures.md + - chapter/pymakr/toolsfeatures +--- +## Console (REPL) -## Console \(REPL\) - -MicroPython has an interactive code tool known as the REPL \(Read Evaluate Print Line\). The REPL allows you to run code on your device, line by line. To begin coding, go to the Pymakr Plugin Console and start typing your code. Start by making the LED change colour. +MicroPython has an interactive code tool known as the REPL (Read Evaluate Print Line). The REPL allows you to run code on your device, line by line. To begin coding, go to the Pymakr Plugin Console and start typing your code. Start by making the LED change colour. ```python import pycom # we need this module to control the LED @@ -21,19 +26,19 @@ The console can be used to run any python code, also functions or loops. Use `print()` to output contents of variables to the console for you to read. Returned values from functions will also be displayed if they are not caught in a variable. This will not happen for code running from the main or boot files. Here you need to use `print()` to output to the console. -{% hint style="info" %} -Note that after writing or pasting any indented code like a function or a while loop, the user will have to press enter up to three times to tell MicroPython the code is to be closed \(this is standard MicroPython & Python behaviour\). +{{{% hint style="info" %}}} +Note that after writing or pasting any indented code like a function or a while loop, the user will have to press enter up to three times to tell MicroPython the code is to be closed (this is standard MicroPython & Python behaviour). Also be aware that code written into the REPL is not saved after the device is powered off/on again. -{% endhint %} +{{< /hint >}} ## Run To test code on a device, create a new `.py` file or open an existing one, type the desired code, save the file and then press the `Run` button. This will run the code directly onto the Pycom board and output the results of the script to the REPL. -{% hint style="info" %} -Changes made to files won’t be automatically uploaded to the board upon restarting or exiting the `Run` feature, as the Pycom board will not store this code. In order to push the code permanently to a device, use the `Upload` feature. -{% endhint %} +{{{% hint style="info" %}}} +Changes made to files won't be automatically uploaded to the board upon restarting or exiting the `Run` feature, as the Pycom board will not store this code. In order to push the code permanently to a device, use the `Upload` feature. +{{< /hint >}} ## Projects @@ -58,9 +63,9 @@ The Pymakr Plugins have a feature to sync and upload code to a device. This can To start using the `Upload` feature, ensure that a project folder has been created for the device. For example, if using the `pymakr.conf` from above, this project folder should be named `scripts`. This folder should have the following structure: -![](../.gitbook/assets/mp-filestructure%20%281%29.png) +![](/gitbook/assets/mp-filestructure%20%281%29.png) -Library files should be placed into the `lib` folder, certificates into the `cert` folder and so on. The `Upload` button will take the highest level folder \(currently open\) and upload this to the connected Pycom device. The files will be pushed to the device in exactly the same structure as within the code editor's file directory. +Library files should be placed into the `lib` folder, certificates into the `cert` folder and so on. The `Upload` button will take the highest level folder (currently open) and upload this to the connected Pycom device. The files will be pushed to the device in exactly the same structure as within the code editor's file directory. ## More diff --git a/pytrackpysense/introduction.md b/content/pytrackpysense/_index.md similarity index 50% rename from pytrackpysense/introduction.md rename to content/pytrackpysense/_index.md index 06be3d3..a91f3e9 100644 --- a/pytrackpysense/introduction.md +++ b/content/pytrackpysense/_index.md @@ -1,62 +1,64 @@ -# Introduction - +--- +title: "" +aliases: +--- In addition to the Expansion Board, Pycom also offers three additional sensor boards, which are ideal for quickly building a fully functioning IoT solution! Whether the application is environment sensing or asset tracking, these additional boards support a variety of sensors. ## Pytrack Pytrack is a location enabled version of the Expansion Board, intended for use in GPS applications such as asset tracking or monitoring. -![](../.gitbook/assets/pytrack%20%281%29.png) +![](/gitbook/assets/pytrack%20%281%29.png) ### Features & Hardware The Pytrack is has a number of features including GPS, 3-Axis Accelerometer and Battery Charger. See the list below for detailed specifics about each sensor, including datasheets. * Serial USB -* 3-Axis Accelerometer \([LIS2HH12](apireference/pytrack.md#3-axis-accelerometer-lis-2-hh-12)\) -* Battery Charger \(BQ24040 with JST connector\) -* GPS and GLONASS \([L76-L](apireference/pytrack.md#gps-with-glonass-quectel-l-76-l-gnss)\) +* 3-Axis Accelerometer ([LIS2HH12](apireference/pytrack.md#3-axis-accelerometer-lis-2-hh-12)) +* Battery Charger (BQ24040 with JST connector) +* GPS and GLONASS ([L76-L](apireference/pytrack.md#gps-with-glonass-quectel-l-76-l-gnss)) * MicroSD Card Reader -All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `P22` \(SDA\) and `P21` \(SCL\). +All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `P22` (SDA) and `P21` (SCL). ## Pysense Pysense is a sensor packed version of the Expansion Board, intended for use in environment sensing applications such as temperature, humidity monitoring, and light sensing. -![](../.gitbook/assets/pysense%20%281%29.png) +![](/gitbook/assets/pysense%20%281%29.png) ### Features & Hardware The Pysense is packed with a number of sensors and hardware, see the list below for detailed specifics about each sensor, including datasheets. * Serial USB -* 3-Axis Accelerometer \([LIS2HH12](apireference/pysense.md#3-axis-accelerometer-lis-2-hh-12)\) -* Battery Charger \(BQ24040 with JST connector\) -* Digital Ambient Light Sensor \([LTR-329ALS-01](apireference/pysense.md#digital-ambient-light-sensor-ltr-329-als-01)\) -* Humidity and Temperature Sensor \([SI7006-A20](apireference/pysense.md#humidity-and-temperature-sensor-si-7006-a20)\) -* Barometric Pressure Sensor with Altimeter \([MPL3115A2](apireference/pysense.md#barometric-pressure-sensor-with-altimeter-mpl-3115-a2)\) +* 3-Axis Accelerometer ([LIS2HH12](apireference/pysense.md#3-axis-accelerometer-lis-2-hh-12)) +* Battery Charger (BQ24040 with JST connector) +* Digital Ambient Light Sensor ([LTR-329ALS-01](apireference/pysense.md#digital-ambient-light-sensor-ltr-329-als-01)) +* Humidity and Temperature Sensor ([SI7006-A20](apireference/pysense.md#humidity-and-temperature-sensor-si-7006-a20)) +* Barometric Pressure Sensor with Altimeter ([MPL3115A2](apireference/pysense.md#barometric-pressure-sensor-with-altimeter-mpl-3115-a2)) * MicroSD Card Reader -All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `GPI09` \(SDA\) and `GPI08` \(SCL\). +All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `GPI09` (SDA) and `GPI08` (SCL). ## Pyscan Pyscan is a RFID-NFC enabled version of the Expansion Board, intended for use in scanning applications, such as RFID/NFC readers. -![](../.gitbook/assets/pyscan-new%20%281%29.png) +![](/gitbook/assets/pyscan-new%20%281%29.png) ### Features & Hardware The Pyscan is packed with a number of sensors and hardware, see the list below for detailed specifics about each sensor, including datasheets. -* 3-Axis Accelerometer \([LIS2HH12](apireference/pyscan.md#3-axis-accelerometer-lis-2-hh-12)\) -* Digital Ambient Light Sensor \([LTR-329ALS-01](apireference/pyscan.md#digital-ambient-light-sensor-ltr-329-als-01)\) -* RFID-NFC Chip \([MFRC63002HN](apireference/pyscan.md#pyscan-nfc-library-mfrc-6300)\) +* 3-Axis Accelerometer ([LIS2HH12](apireference/pyscan.md#3-axis-accelerometer-lis-2-hh-12)) +* Digital Ambient Light Sensor ([LTR-329ALS-01](apireference/pyscan.md#digital-ambient-light-sensor-ltr-329-als-01)) +* RFID-NFC Chip ([MFRC63002HN](apireference/pyscan.md#pyscan-nfc-library-mfrc-6300)) * Serial USB -* Battery Charger \(BQ24040 with JST connector\) +* Battery Charger (BQ24040 with JST connector) * MicroSD Card Reader -* Ultra low power operation \(~1uA in deep sleep\) +* Ultra low power operation (~1uA in deep sleep) -All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `P22` \(SDA\) and `P21` \(SCL\). +All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `P22` (SDA) and `P21` (SCL). diff --git a/content/pytrackpysense/apireference/README.md b/content/pytrackpysense/apireference/README.md new file mode 100644 index 0000000..8c01da3 --- /dev/null +++ b/content/pytrackpysense/apireference/README.md @@ -0,0 +1,7 @@ +--- +title: "API Reference" +aliases: + - chapter/pytrackpysense/apireference +--- +To simplify usability, APIs for the libraries have been created, abstracting away the low level interactions with the sensors. The next following pages refer to the respective libraries for the Pytrack, Pysense, and Pyscan. + diff --git a/pytrackpysense/apireference/README.md b/content/pytrackpysense/apireference/_index.md similarity index 84% rename from pytrackpysense/apireference/README.md rename to content/pytrackpysense/apireference/_index.md index 79e556c..e1eb2f3 100644 --- a/pytrackpysense/apireference/README.md +++ b/content/pytrackpysense/apireference/_index.md @@ -1,4 +1,6 @@ -# API Reference - +--- +title: "API Reference" +aliases: +--- To simplify usability, APIs for the libraries have been created, abstracting away the low level interactions with the sensors. The next following pages refer to the respective libraries for the Pytrack, Pysense, and Pyscan. diff --git a/pytrackpysense/apireference/pyscan.md b/content/pytrackpysense/apireference/pyscan.md similarity index 73% rename from pytrackpysense/apireference/pyscan.md rename to content/pytrackpysense/apireference/pyscan.md index f47bf79..4106a13 100644 --- a/pytrackpysense/apireference/pyscan.md +++ b/content/pytrackpysense/apireference/pyscan.md @@ -1,44 +1,49 @@ -# Pyscan +--- +title: "Pyscan" +aliases: + - pytrackpysense/apireference/pyscan.html + - pytrackpysense/apireference/pyscan.md + - chapter/pytrackpysense/apireference/pyscan +--- +This chapter describes the various libraries which are designed for the Pyscan board. This includes details about the various methods and classes available for each of the Pyscan's sensors. -This chapter describes the various libraries which are designed for the Pyscan board. This includes details about the various methods and classes available for each of the Pyscan’s sensors. - -## 3-Axis Accelerometer \(LIS2HH12\) +## 3-Axis Accelerometer (LIS2HH12) Pysense has a 3-Axis Accelerometer that provides outputs for acceleration as well as roll, pitch and yaw. ### Constructors -#### class LIS2HH12\(pysense = None, sda = 'P22', scl = 'P21'\) +#### class LIS2HH12(pysense = None, sda = 'P22', scl = 'P21') Creates a `LIS2HH12` object, that will return values for acceleration, roll, pitch and yaw. Constructor must be passed a Pysense or I2C object to successfully construct. ### Methods -#### LIS2HH12.acceleration\(\) +#### LIS2HH12.acceleration() -Read the acceleration from the `LIS2HH12`. Returns a **tuple** with the 3 values of acceleration \(G\). +Read the acceleration from the `LIS2HH12`. Returns a **tuple** with the 3 values of acceleration (G). -#### LIS2HH12.roll\(\) +#### LIS2HH12.roll() Read the current roll from the `LIS2HH12`. Returns a **float** in degrees in the range -180 to 180. -#### LIS2HH12.pitch\(\) +#### LIS2HH12.pitch() Read the current pitch from the `LIS2HH12`. Returns a **float** in degrees in the range -90 to 90. Once the board tilts beyond this range the values will repeat. This is due to a lack of yaw measurement, making it not possible to know the exact orientation of the board. -## Digital Ambient Light Sensor \(LTR-329ALS-01\) +## Digital Ambient Light Sensor (LTR-329ALS-01) Pysense has a dual light sensor that provides outputs for external light levels in lux. See the datasheet for more information about the wavelengths of the two sensors. ### Constructors -#### class LTR329ALS01\(pysense = None, sda = 'P22', scl = 'P21', gain = ALS\_GAIN\_1X, integration = ALS\_INT\_100, rate = ALS\_RATE\_500\) +#### class LTR329ALS01(pysense = None, sda = 'P22', scl = 'P21', gain = ALS\_GAIN\_1X, integration = ALS\_INT\_100, rate = ALS\_RATE\_500) Creates a `LTR329ALS01` object, that will return values for light in lux. Constructor must be passed a Pysense or I2C object to successfully construct. ### Methods -#### LTR329ALS01.light\(\) +#### LTR329ALS01.light() Read the light levels of both `LTR329ALS01` sensors. Returns a **tuple** with two values for light levels in lux. @@ -50,35 +55,35 @@ The following arguments may be passed into the constructor. * integration: `ALS_INT_50`, `ALS_INT_100`, `ALS_INT_150`, `ALS_INT_200`, `ALS_INT_250`, `ALS_INT_300`, `ALS_INT_350`, `ALS_INT_400` * rate: `ALS_RATE_50`, `ALS_RATE_100`, `ALS_RATE_200`, `ALS_RATE_500`, `ALS_RATE_1000`, `ALS_RATE_2000` -## Pyscan NFC library \(MFRC6300\) +## Pyscan NFC library (MFRC6300) ### Constructors -#### class MFRC630\(pyscan=None, sda='P22', scl='P21', timeout=None, debug=False\) +#### class MFRC630(pyscan=None, sda='P22', scl='P21', timeout=None, debug=False) Creates a `MFRC630` object. Constructor must be passed a Pyscan or I2C object to successfully construct. ### Methods -#### MFRC630.mfrc630\_cmd\_init\(\) +#### MFRC630.mfrc630\_cmd\_init() Initialise the `MFRC630` with some settings -#### MFRC630.mfrc630\_cmd\_reset\(\) +#### MFRC630.mfrc630\_cmd\_reset() Reset the device. Stops the currently active command and resets device. -#### MFRC630.mfrc630\_cmd\_idle\(\) +#### MFRC630.mfrc630\_cmd\_idle() Set the device into idle mode. Stops the currently active command and return to idle mode. -#### MFRC630.mfrc630\_cmd\_load\_key\(key\) +#### MFRC630.mfrc630\_cmd\_load\_key(key) Loads the provided key into the key buffer. * `key` Array which holds the MIFARE key, **it is always 6 bytes long** -#### MFRC630.mfrc630\_MF\_read\_block\(block\_address, dest\) +#### MFRC630.mfrc630\_MF\_read\_block(block\_address, dest) Reads a block of memory from an authenticated card. Try to read a block of memory from the card with the appropriate timeouts and error checking. @@ -87,59 +92,59 @@ Reads a block of memory from an authenticated card. Try to read a block of memor Returns `0` for failure, otherwise the number of bytes received. -#### MFRC630.mfrc630\_MF\_auth\(uid, key\_type, block\) +#### MFRC630.mfrc630\_MF\_auth(uid, key\_type, block) Perform a MIFARE authentication procedure. This function is a higher-level wrapper around the MF authenticate command. The result of the authentication is checked to identify whether it appears to have succeeded. The key must be loaded into the key buffer with `MFRC630.mfrc630_cmd_load_key(key)`. Once authenticated, the authentication MUST be stopped manually by calling the `mfrc630_MF_deauth()` function or otherwise disabling the `Crypto1 ON` bit in the status register. -* `key_type` The MIFARE key A or B \(`MFRC630_MF_AUTH_KEY_A` or `MFRC630_MF_AUTH_KEY_B`\) to use +* `key_type` The MIFARE key A or B (`MFRC630_MF_AUTH_KEY_A` or `MFRC630_MF_AUTH_KEY_B`) to use * `block` The block to authenticate * `uid` The authentication procedure required the first four bytes of the card's UID to authenticate Returns `0` in case of failure, nonzero in case of success. -#### MFRC630.mfrc630\_MF\_deauth\(\) +#### MFRC630.mfrc630\_MF\_deauth() Disables MIFARE authentication. Disable the `Crypto1` bit from the status register to disable encryption. -#### MFRC630.mfrc630\_iso14443a\_WUPA\_REQA\(instruction\) +#### MFRC630.mfrc630\_iso14443a\_WUPA\_REQA(instruction) -Send `WUPA` and `REQA`. Returns the response byte, the answer to request `A` byte \(`ATQA`\), or `0` in case of no answer. +Send `WUPA` and `REQA`. Returns the response byte, the answer to request `A` byte (`ATQA`), or `0` in case of no answer. * instruction: `MFRC630_ISO14443_CMD_WUPA`, `MFRC630_ISO14443_CMD_REQA` -#### MFRC630.mfrc630\_iso14443a\_select\(uid\) +#### MFRC630.mfrc630\_iso14443a\_select(uid) Performs the `SELECT` procedure to discover a card's UID. This performs the `SELECT` procedure as explained in _ISO14443A_, this determines the UID of the card, if multiple cards are present, a collision will occur, which is handled according to the norm. * `uid`: The UID of the card will be stored into this array. -Returns the length of the UID in bytes \(`4, 7, 10`\), or `0` in case of failure. +Returns the length of the UID in bytes (`4, 7, 10`), or `0` in case of failure. -#### MFRC630.print\_debug\(msg\) +#### MFRC630.print\_debug(msg) Prints debug statements if `DEBUG` is enabled. -#### MFRC630.format\_block\(block, length\) +#### MFRC630.format\_block(block, length) Prints `block` with `length`. -#### MFRC630.mfrc630\_format\_block\(data, len\) +#### MFRC630.mfrc630\_format\_block(data, len) Converts `data` to hexadecimal format. * `data` The array to be formatted * `len` The number of bytes to format -#### MFRC630.mfrc630\_print\_block\(data, len\) +#### MFRC630.mfrc630\_print\_block(data, len) Prints the bytes in `data` array in hexadecimal format, separated by spaces using the `mfrc630_format_block` method. * `data` The array to be printed * `len` The number of bytes to print -{% hint style="info" %} +{{{% hint style="info" %}}} Please note that more functionality is being added weekly to these libraries. If a required feature is not available, feel free to contribute with a pull request at the [Libraries GitHub repository](https://github.com/pycom/pycom-libraries) -{% endhint %} +{{< /hint >}} diff --git a/pytrackpysense/apireference/pysense.md b/content/pytrackpysense/apireference/pysense.md similarity index 68% rename from pytrackpysense/apireference/pysense.md rename to content/pytrackpysense/apireference/pysense.md index 66345ba..4500aa2 100644 --- a/pytrackpysense/apireference/pysense.md +++ b/content/pytrackpysense/apireference/pysense.md @@ -1,44 +1,49 @@ -# Pysense +--- +title: "Pysense" +aliases: + - pytrackpysense/apireference/pysense.html + - pytrackpysense/apireference/pysense.md + - chapter/pytrackpysense/apireference/pysense +--- +This chapter describes the various libraries which are designed for the Pysense board. This includes details about the various methods and classes available for each of the Pysense's sensors. -This chapter describes the various libraries which are designed for the Pysense board. This includes details about the various methods and classes available for each of the Pysense’s sensors. - -## 3-Axis Accelerometer \(LIS2HH12\) +## 3-Axis Accelerometer (LIS2HH12) Pysense has a 3-Axis Accelerometer that provides outputs for acceleration as well as roll, pitch and yaw. ### Constructors -#### class LIS2HH12\(pysense = None, sda = 'P22', scl = 'P21'\) +#### class LIS2HH12(pysense = None, sda = 'P22', scl = 'P21') Creates a `LIS2HH12` object, that will return values for acceleration, roll, pitch and yaw. Constructor must be passed a Pysense or I2C object to successfully construct. ### Methods -#### LIS2HH12.acceleration\(\) +#### LIS2HH12.acceleration() -Read the acceleration from the `LIS2HH12`. Returns a **tuple** with the 3 values of acceleration \(G\). +Read the acceleration from the `LIS2HH12`. Returns a **tuple** with the 3 values of acceleration (G). -#### LIS2HH12.roll\(\) +#### LIS2HH12.roll() Read the current roll from the `LIS2HH12`. Returns a **float** in degrees in the range -180 to 180. -#### LIS2HH12.pitch\(\) +#### LIS2HH12.pitch() Read the current pitch from the `LIS2HH12`. Returns a **float** in degrees in the range -90 to 90. Once the board tilts beyond this range the values will repeat. This is due to a lack of yaw measurement, making it not possible to know the exact orientation of the board. -## Digital Ambient Light Sensor \(LTR-329ALS-01\) +## Digital Ambient Light Sensor (LTR-329ALS-01) Pysense has a dual light sensor that provides outputs for external light levels in lux. See the datasheet for more information about the wavelengths of the two sensors. ### Constructors -#### class LTR329ALS01\(pysense = None, sda = 'P22', scl = 'P21', gain = ALS\_GAIN\_1X, integration = ALS\_INT\_100, rate = ALS\_RATE\_500\) +#### class LTR329ALS01(pysense = None, sda = 'P22', scl = 'P21', gain = ALS\_GAIN\_1X, integration = ALS\_INT\_100, rate = ALS\_RATE\_500) Creates a `LTR329ALS01` object, that will return values for light in lux. Constructor must be passed a Pysense or I2C object to successfully construct. ### Methods -#### LTR329ALS01.light\(\) +#### LTR329ALS01.light() Read the light levels of both `LTR329ALS01` sensors. Returns a **tuple** with two values for light levels in lux. @@ -50,49 +55,49 @@ The following arguments may be passed into the constructor. * integration: `ALS_INT_50`, `ALS_INT_100`, `ALS_INT_150`, `ALS_INT_200`, `ALS_INT_250`, `ALS_INT_300`, `ALS_INT_350`, `ALS_INT_400` * rate: `ALS_RATE_50`, `ALS_RATE_100`, `ALS_RATE_200`, `ALS_RATE_500`, `ALS_RATE_1000`, `ALS_RATE_2000` -## Humidity and Temperature Sensor \(SI7006A20\) +## Humidity and Temperature Sensor (SI7006A20) Pysense has a Humidity and Temperature sensor that provides values of relative humidity and external temperature. ### Constructors -#### class SI7006A20\(pysense = None, sda = 'P22', scl = 'P21'\) +#### class SI7006A20(pysense = None, sda = 'P22', scl = 'P21') -Creates a `SI7006A20` object, that will return values for humidity \(%\) and temperature \('C\). Constructor must be passed a Pysense or I2C object to successfully construct. +Creates a `SI7006A20` object, that will return values for humidity (%) and temperature ('C). Constructor must be passed a Pysense or I2C object to successfully construct. ### Methods -#### SI7006A20.humidity\(\) +#### SI7006A20.humidity() Read the relative humidity of the `SI7006A20`. Returns a **float** with the percentage relative humidity. -#### SI7006A20.temperature\(\) +#### SI7006A20.temperature() Read the external temperature of the `SI7006A20`. Returns a **float** with the temperature. -## Barometric Pressure Sensor with Altimeter \(MPL3115A2\) +## Barometric Pressure Sensor with Altimeter (MPL3115A2) Pysense has a Barometric Pressure sensor that provides readings for pressure, altitude as well as an additional temperature sensor. ### Constructors -#### class MPL3115A2\(pysense = None, sda = 'P22', scl = 'P21', mode = PRESSURE\) +#### class MPL3115A2(pysense = None, sda = 'P22', scl = 'P21', mode = PRESSURE) -Creates a `MPL3115A2` object, that will return values for pressure \(Pa\), altitude \(m\) and temperature \('C\). Constructor must be passed a Pysense or I2C object to successfully construct. +Creates a `MPL3115A2` object, that will return values for pressure (Pa), altitude (m) and temperature ('C). Constructor must be passed a Pysense or I2C object to successfully construct. ### Methods -#### MPL3115A2.pressure\(\) +#### MPL3115A2.pressure() -Read the atmospheric pressure of the `MPL3115A2`. Returns a **float** with the pressure in \(Pa\). +Read the atmospheric pressure of the `MPL3115A2`. Returns a **float** with the pressure in (Pa). -#### MPL3115A2.altitude\(\) +#### MPL3115A2.altitude() -Read the altitude of the `MPL3115A2`. Returns a **float** with the altitude in \(m\). +Read the altitude of the `MPL3115A2`. Returns a **float** with the altitude in (m). -#### MPL3115A2.temperature\(\) +#### MPL3115A2.temperature() -Read the temperature of the `MPL3115A2`. Returns a **float** with the temperature in \('C\). +Read the temperature of the `MPL3115A2`. Returns a **float** with the temperature in ('C). ### Arguments @@ -100,7 +105,7 @@ The following arguments may be passed into the constructor. * mode: `PRESSURE`, `ALTITUDE` -{% hint style="info" %} +{{{% hint style="info" %}}} Please note that more functionality is being added weekly to these libraries. If a required feature is not available, feel free to contribute with a pull request at the [Libraries GitHub repository](https://github.com/pycom/pycom-libraries) -{% endhint %} +{{< /hint >}} diff --git a/pytrackpysense/apireference/pytrack.md b/content/pytrackpysense/apireference/pytrack.md similarity index 61% rename from pytrackpysense/apireference/pytrack.md rename to content/pytrackpysense/apireference/pytrack.md index 0ff52a1..604f834 100644 --- a/pytrackpysense/apireference/pytrack.md +++ b/content/pytrackpysense/apireference/pytrack.md @@ -1,48 +1,53 @@ -# Pytrack +--- +title: "Pytrack" +aliases: + - pytrackpysense/apireference/pytrack.html + - pytrackpysense/apireference/pytrack.md + - chapter/pytrackpysense/apireference/pytrack +--- +This chapter describes the various libraries which are designed for the Pytrack board. This includes details about the various methods and classes available for each of the Pytrack's sensors. -This chapter describes the various libraries which are designed for the Pytrack board. This includes details about the various methods and classes available for each of the Pytrack’s sensors. - -## 3-Axis Accelerometer \(LIS2HH12\) +## 3-Axis Accelerometer (LIS2HH12) Pytrack has a 3-Axis Accelerometer that provides outputs for acceleration as well as roll, pitch and yaw. ### Constructors -#### class LIS2HH12\(pytrack = None, sda = 'P22', scl = 'P21'\) +#### class LIS2HH12(pytrack = None, sda = 'P22', scl = 'P21') Creates a `LIS2HH12` object, that will return values for acceleration, roll, pitch and yaw. Constructor must be passed a Pytrack or I2C object to successfully construct. ### Methods -#### LIS2HH12.acceleration\(\) +#### LIS2HH12.acceleration() -Read the acceleration from the `LIS2HH12`. Returns a **tuple** with the 3 values of acceleration \(G\). +Read the acceleration from the `LIS2HH12`. Returns a **tuple** with the 3 values of acceleration (G). -#### LIS2HH12.roll\(\) +#### LIS2HH12.roll() Read the current roll from the `LIS2HH12`. Returns a **float** in degrees in the range -180 to 180. -#### LIS2HH12.pitch\(\) +#### LIS2HH12.pitch() Read the current pitch from the `LIS2HH12`. Returns a **float** in degrees in the range -90 to 90. Once the board tilts beyond this range the values will repeat. This is due to a lack of yaw measurement, making it not possible to know the exact orientation of the board. -## GPS with GLONASS \(Quectel L76-L GNSS\) +## GPS with GLONASS (Quectel L76-L GNSS) -Pytrack has a GPS \(with GLONASS\) that provides outputs longitude/latitude, speed and other information about the Pytrack's location. +Pytrack has a GPS (with GLONASS) that provides outputs longitude/latitude, speed and other information about the Pytrack's location. ### Constructors -#### class L76GNSS\(pytrack = None, sda = 'P22', scl = 'P21', timeout = None\) +#### class L76GNSS(pytrack = None, sda = 'P22', scl = 'P21', timeout = None) -Creates a `L76GNSS` object, that will return values for longitude and latitude. Constructor must be passed a Pytrack or I2C object to successfully construct. Set the `timeout` to a time period \(in seconds\) for the GPS to search for a lock. If a lock is not found by the time the `timeout` has expired, the `coordinates` method will return `(None, None)`. +Creates a `L76GNSS` object, that will return values for longitude and latitude. Constructor must be passed a Pytrack or I2C object to successfully construct. Set the `timeout` to a time period (in seconds) for the GPS to search for a lock. If a lock is not found by the time the `timeout` has expired, the `coordinates` method will return `(None, None)`. ### Methods -#### L76GNSS.coordinates\(debug = False\) +#### L76GNSS.coordinates(debug = False) Read the longitude and latitude from the `L76GNSS`. Returns a **tuple** with the longitude and latitude. With `debug` set to `True` the output from the GPS is verbose. -{% hint style="info" %} +{{{% hint style="info" %}}} Please note that more functionality is being added weekly to these libraries. If a required feature is not available, feel free to contribute with a pull request at the [Libraries GitHub repository](https://github.com/pycom/pycom-libraries) -{% endhint %} +{{< /hint >}} diff --git a/pytrackpysense/apireference/sleep.md b/content/pytrackpysense/apireference/sleep.md similarity index 69% rename from pytrackpysense/apireference/sleep.md rename to content/pytrackpysense/apireference/sleep.md index 9b19b4c..765f9e2 100644 --- a/pytrackpysense/apireference/sleep.md +++ b/content/pytrackpysense/apireference/sleep.md @@ -1,5 +1,10 @@ -# Sleep - +--- +title: "Sleep" +aliases: + - pytrackpysense/apireference/sleep.html + - pytrackpysense/apireference/sleep.md + - chapter/pytrackpysense/apireference/sleep +--- This chapter describes the various methods for sleep and wakeup which are embedded in Pytrack and Pysense libraries. Both Pytrack and Pysense have the same methods, although the appropriate class, either `pytrack` or `pysense`, has to be instantiated. ## Quick Usage Example @@ -44,11 +49,11 @@ py.go_to_sleep() ## Methods -#### pytrack.get\_sleep\_remaining\(\) +#### pytrack.get\_sleep\_remaining() -In the event of a sleep session that was awoken by an asynchronous event \(Accelerometer, INT pin or Reset button\) the approximate sleep remaining interval \(expressed in **seconds**\) can be found out. The user has to manually use `setup_sleep()` to configure the next sleep interval. +In the event of a sleep session that was awoken by an asynchronous event (Accelerometer, INT pin or Reset button) the approximate sleep remaining interval (expressed in **seconds**) can be found out. The user has to manually use `setup_sleep()` to configure the next sleep interval. -#### pytrack.get\_wake\_reason\(\) +#### pytrack.get\_wake\_reason() Returns the last wakeup reason. Possible values are: @@ -59,21 +64,21 @@ Returns the last wakeup reason. Possible values are: # WAKE_REASON_INT_PIN = 8 # INT pin ``` -_Note: the_ `WAKE_REASON_INT_PIN` _can be used if the_ `PIC_RC1` _pin \(pin\#6 on External IO Header\) is toggled._ +_Note: the_ `WAKE_REASON_INT_PIN` _can be used if the_ `PIC_RC1` _pin (pin\#6 on External IO Header) is toggled._ -As in the above example, this method should be called at the beginning of the script, to find out the reset \(wakeup\) reason. +As in the above example, this method should be called at the beginning of the script, to find out the reset (wakeup) reason. -#### pytrack.go\_to\_sleep\(\[gps=True\]\) +#### pytrack.go\_to\_sleep(\[gps=True\]) Puts the board in sleep mode, for the duration, which has to be set previously with `pytrack.setup_sleep(timout_sec)`. The optional boolean parameter sets the GPS state during sleep. MicroPython code, which is after this function, is not executed, as wakeup will restart MicroPython. -#### pytrack.setup\_int\_wake\_up\(rising, falling\]\) +#### pytrack.setup\_int\_wake\_up(rising, falling\]) -Enables as wakeup source, the accelerometer INT pin \(PIC - RA5\). The boolean parameters will indicate rising edge \(activity detection\) and/or falling edge \(inactivity detection\) is configured. +Enables as wakeup source, the accelerometer INT pin (PIC - RA5). The boolean parameters will indicate rising edge (activity detection) and/or falling edge (inactivity detection) is configured. -**The accelerometer \(class** `LIS2HH12`**\)** has to be also configured for a certain acceleration threshold and duration. Code snippet: +**The accelerometer (class** `LIS2HH12`**)** has to be also configured for a certain acceleration threshold and duration. Code snippet: ```python from pytrack import Pytrack @@ -89,15 +94,15 @@ py.setup_int_wake_up(True, True) acc.enable_activity_interrupt(2000, 200) ``` -#### pytrack.setup\_int\_pin\_wake\_up\(\[rising\_edge = True\]\) +#### pytrack.setup\_int\_pin\_wake\_up(\[rising\_edge = True\]) -Enables as wakeup source, the INT pic \(PIC - RC1, pin\#6 on External IO Header\). Either rising or falling edge has to be set, by default it's rising edge. +Enables as wakeup source, the INT pic (PIC - RC1, pin\#6 on External IO Header). Either rising or falling edge has to be set, by default it's rising edge. -#### pytrack.setup\_sleep\(time\_seconds\) +#### pytrack.setup\_sleep(time\_seconds) Sets the sleep interval, specified in seconds. The actual sleep will be started by calling `go_to_sleep()` method. -{% hint style="info" %} +{{{% hint style="info" %}}} Please note that more functionality is being added weekly to these libraries. If a required feature is not available, feel free to contribute with a pull request at the [Libraries GitHub repository](https://github.com/pycom/pycom-libraries) -{% endhint %} +{{< /hint >}} diff --git a/content/pytrackpysense/installation/README.md b/content/pytrackpysense/installation/README.md new file mode 100644 index 0000000..d65c350 --- /dev/null +++ b/content/pytrackpysense/installation/README.md @@ -0,0 +1,7 @@ +--- +title: "Installing Software" +aliases: + - chapter/pytrackpysense/installation +--- +As the development for these devices are on going with additional features being added, every week, it is essential to ensure you frequently check for updates on the Pytrack/Pysense/Pyscan. As well as updating the device firmware, it is important to check the [GitHub repository](https://github.com/pycom/pycom-libraries) for the respective library files as they as also being updated, to include additional features/functionality. + diff --git a/pytrackpysense/installation/README.md b/content/pytrackpysense/installation/_index.md similarity index 90% rename from pytrackpysense/installation/README.md rename to content/pytrackpysense/installation/_index.md index 841cde4..7587fb8 100644 --- a/pytrackpysense/installation/README.md +++ b/content/pytrackpysense/installation/_index.md @@ -1,4 +1,6 @@ -# Installing Software - +--- +title: "Installing Software" +aliases: +--- As the development for these devices are on going with additional features being added, every week, it is essential to ensure you frequently check for updates on the Pytrack/Pysense/Pyscan. As well as updating the device firmware, it is important to check the [GitHub repository](https://github.com/pycom/pycom-libraries) for the respective library files as they as also being updated, to include additional features/functionality. diff --git a/pytrackpysense/installation/drivers.md b/content/pytrackpysense/installation/drivers.md similarity index 73% rename from pytrackpysense/installation/drivers.md rename to content/pytrackpysense/installation/drivers.md index e1bfbfe..8bf3f87 100644 --- a/pytrackpysense/installation/drivers.md +++ b/content/pytrackpysense/installation/drivers.md @@ -1,5 +1,10 @@ -# Installing Drivers - Windows 7 - +--- +title: "Installing Drivers - Windows 7" +aliases: + - pytrackpysense/installation/drivers.html + - pytrackpysense/installation/drivers.md + - chapter/pytrackpysense/installation/drivers +--- Pytrack and Pysense will work out of the box for Windows 8/10/+, macOS as well as Linux. If using Windows 7, drivers to support the boards will need to be installed. Please follow the instructions below to install the required drivers. @@ -14,33 +19,33 @@ Please download the driver software from the link below. First navigate open the Windows start menu and search/navigate to `Device Manager`. You should see your Pytrack/Pysense in the dropdown under **other devices**. -![](../../.gitbook/assets/win7-1.png) +![](/gitbook/assets/win7-1.png) Right click the device and select `Update Driver Software`. -![](../../.gitbook/assets/win7-2%20%281%29.png) +![](/gitbook/assets/win7-2%20%281%29.png) Select the option to **Browse my computer for driver software**. -![](../../.gitbook/assets/win7-3.png) +![](/gitbook/assets/win7-3.png) -Next you will need to navigate to where you downloaded the driver to \(e.g. **Downloads** Folder\). +Next you will need to navigate to where you downloaded the driver to (e.g. **Downloads** Folder). -![](../../.gitbook/assets/win7-4%20%281%29.png) +![](/gitbook/assets/win7-4%20%281%29.png) Specify the folder in which the drivers are contained. If you haven't extracted the `.zip` file, please do this before selecting the folder. -![](../../.gitbook/assets/win7-5%20%281%29.png) +![](/gitbook/assets/win7-5%20%281%29.png) You may receive a warning, suggesting that windows can't verify the publisher of this driver. Click `Install this driver software anyway` as this link points to our official driver. -![](../../.gitbook/assets/win7-6%20%281%29.png) +![](/gitbook/assets/win7-6%20%281%29.png) If the installation was successful, you should now see a window specifying that the driver was correctly installed. -![](../../.gitbook/assets/win7-7.png) +![](/gitbook/assets/win7-7.png) To confirm that the installation was correct, navigate back to the `Device Manager` and click the dropdown for other devices. The warning label should now be gone and Pytrack/Pysense should be installed. -![](../../.gitbook/assets/win7-8.png) +![](/gitbook/assets/win7-8.png) diff --git a/pytrackpysense/installation/firmware.md b/content/pytrackpysense/installation/firmware.md similarity index 73% rename from pytrackpysense/installation/firmware.md rename to content/pytrackpysense/installation/firmware.md index 1e354c1..5d3d3b3 100644 --- a/pytrackpysense/installation/firmware.md +++ b/content/pytrackpysense/installation/firmware.md @@ -1,5 +1,10 @@ -# Updating Firmware - +--- +title: "Updating Firmware" +aliases: + - pytrackpysense/installation/firmware.html + - pytrackpysense/installation/firmware.md + - chapter/pytrackpysense/installation/firmware +--- To update the firmware on the Pysense/Pytrack/Pyscan/Expansion Board v3, please see the following instructions. The firmware of Pysense/Pytrack/Pyscan/Expansion Board v3 can be updated via the USB port using the terminal tool, `DFU-util`. The latest firmware DFU file can be downloaded from the links below: @@ -10,7 +15,7 @@ The latest firmware DFU file can be downloaded from the links below: While in the normal, application mode, the Pysense/Pytrack/Pyscan/Expansion Board v3 require a Serial USB CDC driver, in DFU, bootloader mode, the DFU driver is required. Below, the USB Product ID is depicted for each case. -| Board | DFU bootloader \(update mode\) | Application firmware \(normal mode\) | +| Board | DFU bootloader (update mode) | Application firmware (normal mode) | | :--- | :--- | :--- | | Pytrack | `0xF014` | `0xF013` | | Pysense | `0xF011` | `0xF012` | @@ -70,12 +75,12 @@ To install the drivers, the Pytrack/Pysense board must be in DFU-mode: 4. Keep the button pressed for at least one second 5. Release the button. When the board is connected in DFU-mode, it will be in this state for 7 seconds. 6. Click the`“Install Driver` button immediately. If the driver was unsuccessful, repeat from step 1. - * _Here the USB ID has to be the DFU-bootloader one \(_`0xF014`_for Pytrack or_ `0xF011` _for Pysense\)._ + * _Here the USB ID has to be the DFU-bootloader one (_`0xF014`_for Pytrack or_ `0xF011` _for Pysense)._ * _This is a successful DFU driver installation for Pytrack:_ -![](../../.gitbook/assets/pytrack_dfu_mode_zadig.png) +![](/gitbook/assets/pytrack_dfu_mode_zadig.png) -Open the command prompt and navigate to the directory where the DFU-util and the firmware was downloaded \(must be in same directory\). Repeat the procedure to get the board in DFU-mode and run the command below but replace `X.X.X` with the firmware version and replace Pysense with Pytrack if it is the Pytrack that is to be updated \(e.g: `pytrack_0.0.8.dfu`\): +Open the command prompt and navigate to the directory where the DFU-util and the firmware was downloaded (must be in same directory). Repeat the procedure to get the board in DFU-mode and run the command below but replace `X.X.X` with the firmware version and replace Pysense with Pytrack if it is the Pytrack that is to be updated (e.g: `pytrack_0.0.8.dfu`): ```bash dfu-util-static.exe -D pysense_X.X.X.dfu @@ -83,16 +88,16 @@ dfu-util-static.exe -D pysense_X.X.X.dfu If the update was successful, a message,"Done!" should appear in the bottom of the command prompt. -**Double-check Serial USB \(CDC\) driver is installed in Application mode:** if, by mistake, the `libusbk` driver was installed while the USB ID is the Application mode \(`0xF013` for Pytrack or `0xF012` for Pysense\), then the `Serial USB (CDC)` driver has to be installed for application mode. This will allow Windows to allocate a COM port, which is required for REPL console. +**Double-check Serial USB (CDC) driver is installed in Application mode:** if, by mistake, the `libusbk` driver was installed while the USB ID is the Application mode (`0xF013` for Pytrack or `0xF012` for Pysense), then the `Serial USB (CDC)` driver has to be installed for application mode. This will allow Windows to allocate a COM port, which is required for REPL console. -![](../../.gitbook/assets/pytrack_app_mode_zadig.png) +![](/gitbook/assets/pytrack_app_mode_zadig.png) ## Using DFU-util with Pytrack, Pysense and Expansion Board v3 To enter update mode follow these steps: 1. Unplug the device -2. Press the button and keep it held \(on the Expansion Board the `S1` button\) +2. Press the button and keep it held (on the Expansion Board the `S1` button) 3. Plug in the USB cable to the host computer and wait 1 second before releasing the button 4. After this you will have approximately 7 seconds to run the DFU-util tool @@ -102,9 +107,9 @@ To enter update mode follow these steps: $ dfu-util -D pytrack_0.0.8.dfu ``` -{% hint style="info" %} +{{{% hint style="info" %}}} You might need to run `dfu-util` as `sudo`. In that case, you will need to enter your password. -{% endhint %} +{{< /hint >}} An output, similar to the one below, will appear upon successful installation: @@ -144,7 +149,7 @@ Using `lsusb` command, the Pytrack/Pysense device should be visible in both norm For exemple, a Pytrack board is visible as either: * `Bus 020 Device 004: ID 04d8:f014 Microchip Technology Inc. Application Specific Device` - * this is bootloader mode \(`f014` is USB PID\), active just for 7-8 seconds, if the reset button was just pressed before plugging USB connector. + * this is bootloader mode (`f014` is USB PID), active just for 7-8 seconds, if the reset button was just pressed before plugging USB connector. * `Bus 020 Device 005: ID 04d8:f013 Microchip Technology Inc. Pytrack Serial: Pyabcde0` - * this is normal, application mode \(`f013` is USB PID\), this means the bootloader verified application partition and it boot-up correctly. + * this is normal, application mode (`f013` is USB PID), this means the bootloader verified application partition and it boot-up correctly. diff --git a/pytrackpysense/installation/libraries.md b/content/pytrackpysense/installation/libraries.md similarity index 62% rename from pytrackpysense/installation/libraries.md rename to content/pytrackpysense/installation/libraries.md index 235a667..8fb534e 100644 --- a/pytrackpysense/installation/libraries.md +++ b/content/pytrackpysense/installation/libraries.md @@ -1,14 +1,19 @@ -# Installing Libraries - +--- +title: "Installing Libraries" +aliases: + - pytrackpysense/installation/libraries.html + - pytrackpysense/installation/libraries.md + - chapter/pytrackpysense/installation/libraries +--- To utilise the sensors on the Pytrack and Pysense, Pycom has written libraries to make reading to/from the various sensors accessible via an API. These libraries reside at the Pycom GitHub repository and the latest versions can be found under the releases page. [GitHub Repository](https://github.com/pycom/pycom-libraries) -Download the repository as a `.zip` file, navigate to the correct device \(Pysense/Pytrack\), extract the files and then upload the desired files to the device in the instructions below. +Download the repository as a `.zip` file, navigate to the correct device (Pysense/Pytrack), extract the files and then upload the desired files to the device in the instructions below. ## Uploading the Libraries to a Device -These libraries should be uploaded to a device \(LoPy, SiPy, WiPy 2.0, etc.\) in the same process as a standard MicroPython library. The various `.py` files should be placed into the `/lib` folder on the device. For example, if using the Pysense and the user wishes to enable the only Accelerometer and the Light Sensor, they should place the following `.py` files into the device's `/lib` folder: +These libraries should be uploaded to a device (LoPy, SiPy, WiPy 2.0, etc.) in the same process as a standard MicroPython library. The various `.py` files should be placed into the `/lib` folder on the device. For example, if using the Pysense and the user wishes to enable the only Accelerometer and the Light Sensor, they should place the following `.py` files into the device's `/lib` folder: ```text - pysense.py @@ -20,9 +25,9 @@ Add as many or as few of the libraries that are required. In addition to the Pysense or Pytrack specific libraries, you also need to upload the `pycoproc.py` file from the `_lib/pycoproc_` folder inside the libraries archive. -{% hint style="info" %} +{{{% hint style="info" %}}} The Pytrack and Pysense boards behave the same as the Expansion Board. `Upload`, `Run` and upload code to Pycom modules via the Pymakr Plugin, in exactly the same process. -{% endhint %} +{{< /hint >}} ## Importing/Using the Libraries diff --git a/content/pytrackpysense/introduction.md b/content/pytrackpysense/introduction.md new file mode 100644 index 0000000..cab73c3 --- /dev/null +++ b/content/pytrackpysense/introduction.md @@ -0,0 +1,67 @@ +--- +title: "Introduction" +aliases: + - pytrackpysense/introduction.html + - pytrackpysense/introduction.md + - chapter/pytrackpysense +--- +In addition to the Expansion Board, Pycom also offers three additional sensor boards, which are ideal for quickly building a fully functioning IoT solution! Whether the application is environment sensing or asset tracking, these additional boards support a variety of sensors. + +## Pytrack + +Pytrack is a location enabled version of the Expansion Board, intended for use in GPS applications such as asset tracking or monitoring. + +![](/gitbook/assets/pytrack%20%281%29.png) + +### Features & Hardware + +The Pytrack is has a number of features including GPS, 3-Axis Accelerometer and Battery Charger. See the list below for detailed specifics about each sensor, including datasheets. + +* Serial USB +* 3-Axis Accelerometer ([LIS2HH12](apireference/pytrack.md#3-axis-accelerometer-lis-2-hh-12)) +* Battery Charger (BQ24040 with JST connector) +* GPS and GLONASS ([L76-L](apireference/pytrack.md#gps-with-glonass-quectel-l-76-l-gnss)) +* MicroSD Card Reader + +All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `P22` (SDA) and `P21` (SCL). + +## Pysense + +Pysense is a sensor packed version of the Expansion Board, intended for use in environment sensing applications such as temperature, humidity monitoring, and light sensing. + +![](/gitbook/assets/pysense%20%281%29.png) + +### Features & Hardware + +The Pysense is packed with a number of sensors and hardware, see the list below for detailed specifics about each sensor, including datasheets. + +* Serial USB +* 3-Axis Accelerometer ([LIS2HH12](apireference/pysense.md#3-axis-accelerometer-lis-2-hh-12)) +* Battery Charger (BQ24040 with JST connector) +* Digital Ambient Light Sensor ([LTR-329ALS-01](apireference/pysense.md#digital-ambient-light-sensor-ltr-329-als-01)) +* Humidity and Temperature Sensor ([SI7006-A20](apireference/pysense.md#humidity-and-temperature-sensor-si-7006-a20)) +* Barometric Pressure Sensor with Altimeter ([MPL3115A2](apireference/pysense.md#barometric-pressure-sensor-with-altimeter-mpl-3115-a2)) +* MicroSD Card Reader + +All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `GPI09` (SDA) and `GPI08` (SCL). + +## Pyscan + +Pyscan is a RFID-NFC enabled version of the Expansion Board, intended for use in scanning applications, such as RFID/NFC readers. + +![](/gitbook/assets/pyscan-new%20%281%29.png) + +### Features & Hardware + +The Pyscan is packed with a number of sensors and hardware, see the list below for detailed specifics about each sensor, including datasheets. + +* 3-Axis Accelerometer ([LIS2HH12](apireference/pyscan.md#3-axis-accelerometer-lis-2-hh-12)) +* Digital Ambient Light Sensor ([LTR-329ALS-01](apireference/pyscan.md#digital-ambient-light-sensor-ltr-329-als-01)) +* RFID-NFC Chip ([MFRC63002HN](apireference/pyscan.md#pyscan-nfc-library-mfrc-6300)) +* Serial USB +* Battery Charger (BQ24040 with JST connector) +* MicroSD Card Reader +* Ultra low power operation (~1uA in deep sleep) + +All of the included sensors are connected to the Pycom device via the I2C interface. These pins are located at `P22` (SDA) and `P21` (SCL). + diff --git a/tutorials/introduction.md b/content/tutorials/_index.md similarity index 80% rename from tutorials/introduction.md rename to content/tutorials/_index.md index 752925d..33f0ee9 100644 --- a/tutorials/introduction.md +++ b/content/tutorials/_index.md @@ -1,6 +1,8 @@ -# Introduction - -![](../.gitbook/assets/tutorialsicon%20%281%29.png) +--- +title: "" +aliases: +--- +![](/gitbook/assets/tutorialsicon%20%281%29.png) ## Tutorials and Examples @@ -8,7 +10,7 @@ This section contains tutorials and examples for use with Pycom modules and Expa General Pycom tutorials contains tutorials that may be run on any Pycom device, such as connecting to a WiFi network, Bluetooth, controlling I/O pins etc. Later sections are specific to the LoPy and SiPy devices such as setting up a LoRa node or connecting to the Sigfox network. The final sections are related to examples using the Pytrack and Pysense. -Before starting, ensure that any Pycom devices are running the latest firmware; for instructions see [Firmware Updates](../gettingstarted/installation/firmwaretool.md). +Before starting, ensure that any Pycom devices are running the latest firmware; for instructions see [Firmware Updates](/gettingstarted/installation/firmwaretool). The source code for these tutorials, along with the required libraries can be found in in the [pycom-libraries](https://github.com/pycom/pycom-libraries) repository. diff --git a/content/tutorials/all/README.md b/content/tutorials/all/README.md new file mode 100644 index 0000000..18096ea --- /dev/null +++ b/content/tutorials/all/README.md @@ -0,0 +1,7 @@ +--- +title: "All Pycom Device Examples" +aliases: + - chapter/tutorials/all +--- +This section contains generic examples that will work across all Pycom devices and Expansion Boards. + diff --git a/tutorials/all/README.md b/content/tutorials/all/_index.md similarity index 66% rename from tutorials/all/README.md rename to content/tutorials/all/_index.md index 5a8d26a..bc594d1 100644 --- a/tutorials/all/README.md +++ b/content/tutorials/all/_index.md @@ -1,4 +1,6 @@ -# All Pycom Device Examples - +--- +title: "All Pycom Device Examples" +aliases: +--- This section contains generic examples that will work across all Pycom devices and Expansion Boards. diff --git a/tutorials/all/adc.md b/content/tutorials/all/adc.md similarity index 87% rename from tutorials/all/adc.md rename to content/tutorials/all/adc.md index acbc3a8..ed79a23 100644 --- a/tutorials/all/adc.md +++ b/content/tutorials/all/adc.md @@ -1,6 +1,11 @@ -# ADC - -This example is a simple ADC sample. For more information please see [`ADC`](../../firmwareapi/pycom/machine/adc.md). +--- +title: "ADC" +aliases: + - tutorials/all/adc.html + - tutorials/all/adc.md + - chapter/tutorials/all/adc +--- +This example is a simple ADC sample. For more information please see [`ADC`](/../firmwareapi/pycom/machine/adc). ```python from machine import ADC diff --git a/tutorials/all/aws.md b/content/tutorials/all/aws.md similarity index 94% rename from tutorials/all/aws.md rename to content/tutorials/all/aws.md index 21b96fe..9d391e3 100644 --- a/tutorials/all/aws.md +++ b/content/tutorials/all/aws.md @@ -1,12 +1,17 @@ -# AWS - +--- +title: "AWS" +aliases: + - tutorials/all/aws.html + - tutorials/all/aws.md + - chapter/tutorials/all/aws +--- The AWS IoT platform enables devices to connect to the Amazon cloud and lets applications in the cloud interact with Internet-connected things. Common IoT applications either collect and process telemetry from devices or enable users to control a device remotely. Things report their state by publishing messages, in JSON format, on MQTT topics. For more information see this [PDF File](http://docs.aws.amazon.com/iot/latest/developerguide/iot-dg.pdf). ## Getting Started with AWS IoT -### Creating the message broker \(Amazon website\): +### Creating the message broker (Amazon website): * Sign in to the [AWS Management Console](https://aws.amazon.com/console/) * Navigate to the IoT Console by clicking on the [AWS IoT link](https://github.com/pycom/pycom-docs/tree/37661883902849b1a931ee273a23ae8e0f3d773e/img/aws-1.png) @@ -20,14 +25,14 @@ For more information see this [PDF File](http://docs.aws.amazon.com/iot/latest/d * On the [Create Policy](https://github.com/pycom/pycom-docs/tree/37661883902849b1a931ee273a23ae8e0f3d773e/img/aws-6.png) page, choose a policy name and the actions to authorise. * Go to the certificates page, click on the three dots of your certificate and attach the policy to the certificate as shown in the [diagram](https://github.com/pycom/pycom-docs/tree/37661883902849b1a931ee273a23ae8e0f3d773e/img/aws-7.png) -### Setting up the device \(Pycom device\): +### Setting up the device (Pycom device): * Download the latest sample code from the Pycom [GitHub Repository](https://github.com/pycom/aws-pycom). -* Connect to the device via FTP and put the root CA certificate, the client certificate \(`*.pem.crt`\) and the private key \(`*.private.pem.key`\) in the `/flash/cert` folder. +* Connect to the device via FTP and put the root CA certificate, the client certificate (`*.pem.crt`) and the private key (`*.private.pem.key`) in the `/flash/cert` folder. * Update the config file with your WiFi settings, the [AWS Host](https://github.com/pycom/pycom-docs/tree/37661883902849b1a931ee273a23ae8e0f3d773e/img/aws-8.png) and the certificate paths. * Put the `config.py` and the `main.py` in the device flash -### Configuration \(`config.py`\): +### Configuration (`config.py`): This file contains the WiFi, certificate paths and application specific settings that need to be updated by the user. @@ -72,7 +77,7 @@ LAST_WILL_MSG = 'To All: Last will message' #MQTT_OPER_TIMEOUT = 5 ``` -### Subscibe / Publish \(`main.py`\) +### Subscibe / Publish (`main.py`) To subscribe to a topic: @@ -117,7 +122,7 @@ while loopCount < 8: time.sleep(5.0) ``` -### Shadow updater \(`main.py`\) +### Shadow updater (`main.py`) ```python # user specified callback functions @@ -165,7 +170,7 @@ while True: time.sleep(5) ``` -### Delta Listener \(`main.py`\) +### Delta Listener (`main.py`) ```python # Custom Shadow callback diff --git a/tutorials/all/ble.md b/content/tutorials/all/ble.md similarity index 91% rename from tutorials/all/ble.md rename to content/tutorials/all/ble.md index 26f4cea..5646cc4 100644 --- a/tutorials/all/ble.md +++ b/content/tutorials/all/ble.md @@ -1,8 +1,13 @@ -# Bluetooth - +--- +title: "Bluetooth" +aliases: + - tutorials/all/ble.html + - tutorials/all/ble.md + - chapter/tutorials/all/ble +--- At present, basic BLE functionality is available. More features will be implemented in the near future, such as pairing. This page will be updated in line with these features. -Full info on `bluetooth` can be found within [Bluetooth page](../../firmwareapi/pycom/network/bluetooth/) of the Firmware API Reference. +Full info on `bluetooth` can be found within [Bluetooth page](/../firmwareapi/pycom/network/bluetooth/) of the Firmware API Reference. ## Scan for BLE Devices @@ -54,7 +59,7 @@ print("Connected to device with addr = {}".format(ubinascii.hexlify(adv.mac))) ## Connect to a BLE Device and Retrieve Data -Connecting to a device named 'Heart Rate' and receiving data from it’s services. +Connecting to a device named 'Heart Rate' and receiving data from it's services. ```python from network import Bluetooth diff --git a/tutorials/all/https.md b/content/tutorials/all/https.md similarity index 73% rename from tutorials/all/https.md rename to content/tutorials/all/https.md index 417a3ed..36d46e5 100644 --- a/tutorials/all/https.md +++ b/content/tutorials/all/https.md @@ -1,5 +1,10 @@ -# HTTPS - +--- +title: "HTTPS" +aliases: + - tutorials/all/https.html + - tutorials/all/https.md + - chapter/tutorials/all/https +--- Basic connection using `ssl.wrap_socket()`. ```python @@ -24,5 +29,5 @@ ss = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs='/flash/cert/ca.pe ss.connect(socket.getaddrinfo('cloud.blynk.cc', 8441)[0][-1]) ``` -For more info, check the [`ssl`](../../firmwareapi/micropython/ussl.md) module in the API reference. +For more info, check the [`ssl`](/../firmwareapi/micropython/ussl) module in the API reference. diff --git a/tutorials/all/i2c.md b/content/tutorials/all/i2c.md similarity index 95% rename from tutorials/all/i2c.md rename to content/tutorials/all/i2c.md index ce1e665..023871b 100644 --- a/tutorials/all/i2c.md +++ b/content/tutorials/all/i2c.md @@ -1,5 +1,10 @@ -# I2C - +--- +title: "I2C" +aliases: + - tutorials/all/i2c.html + - tutorials/all/i2c.md + - chapter/tutorials/all/i2c +--- The following example receives data from a light sensor using I2C. Sensor used is the BH1750FVI Digital Light Sensor. ```python diff --git a/tutorials/all/modbus.md b/content/tutorials/all/modbus.md similarity index 82% rename from tutorials/all/modbus.md rename to content/tutorials/all/modbus.md index 56c3829..8d80e9e 100644 --- a/tutorials/all/modbus.md +++ b/content/tutorials/all/modbus.md @@ -1,6 +1,11 @@ -# Modbus - -Modbus is a messaging protocol that defines the packet structure for transferring data between devices in a master/slave architecture. The protocol is independent of the transmission medium and is usually transmitted over TCP \(MODBUS TCP\) or serial communication \(MODBUS RTU\). Modbus is intended as a request/reply protocol and delivers services specified by function codes. The function code in the request tells the addressed slave what kind of action to perform. The function codes most commonly supported by devices are listed below. +--- +title: "Modbus" +aliases: + - tutorials/all/modbus.html + - tutorials/all/modbus.md + - chapter/tutorials/all/modbus +--- +Modbus is a messaging protocol that defines the packet structure for transferring data between devices in a master/slave architecture. The protocol is independent of the transmission medium and is usually transmitted over TCP (MODBUS TCP) or serial communication (MODBUS RTU). Modbus is intended as a request/reply protocol and delivers services specified by function codes. The function code in the request tells the addressed slave what kind of action to perform. The function codes most commonly supported by devices are listed below. | Function Name | Function Code | | :--- | :--- | @@ -21,7 +26,7 @@ Python libraries and sample code that support Modbus TCP and Modbus RTU are avai ### Read Coils -This function code requests the status \(ON/OFF\) of discrete coils on a remote device. The slave device address, the address of the first coil and the number of coils must be specified in the request. The address of the first coil is 0 and a maximum of 2000 contiguous coils can be read. Python sample code is shown below. +This function code requests the status (ON/OFF) of discrete coils on a remote device. The slave device address, the address of the first coil and the number of coils must be specified in the request. The address of the first coil is 0 and a maximum of 2000 contiguous coils can be read. Python sample code is shown below. ```python slave_addr=0x0A @@ -34,7 +39,7 @@ print('Coil status: ' + ' '.join('{:d}'.format(x) for x in coil_status)) ### Read Discrete Inputs -This command is used to read the status \(ON/OFF\) of discrete inputs on a remote device. The slave address, the address of the first input, and the quantity of inputs to be read must be specified. The address of the first input is 0 and a maximum of 2000 continuous inputs can be read. The Python sample code is shown below. +This command is used to read the status (ON/OFF) of discrete inputs on a remote device. The slave address, the address of the first input, and the quantity of inputs to be read must be specified. The address of the first input is 0 and a maximum of 2000 continuous inputs can be read. The Python sample code is shown below. ```python slave_addr=0x0A diff --git a/tutorials/all/mqtt.md b/content/tutorials/all/mqtt.md similarity index 92% rename from tutorials/all/mqtt.md rename to content/tutorials/all/mqtt.md index c031536..04e77d6 100644 --- a/tutorials/all/mqtt.md +++ b/content/tutorials/all/mqtt.md @@ -1,5 +1,10 @@ -# MQTT - +--- +title: "MQTT" +aliases: + - tutorials/all/mqtt.html + - tutorials/all/mqtt.md + - chapter/tutorials/all/mqtt +--- MQTT is a lightweight messaging protocol that is ideal for sending small packets of data to and from IoT devices via WiFi. The broker used in this example is the [IO Adafruit](https://io.adafruit.com) platform, which is free and allows for tinkering with MQTT. diff --git a/tutorials/all/ota.md b/content/tutorials/all/ota.md similarity index 77% rename from tutorials/all/ota.md rename to content/tutorials/all/ota.md index 9ee71c7..b22571a 100644 --- a/tutorials/all/ota.md +++ b/content/tutorials/all/ota.md @@ -1,20 +1,25 @@ -# OTA update - +--- +title: "OTA update" +aliases: + - tutorials/all/ota.html + - tutorials/all/ota.md + - chapter/tutorials/all/ota +--- ## Overview -Pycom modules come with the ability to update the devices firmware, while it is still running, we call this an "over the air" \(OTA\) update. The [`pycom`](../../firmwareapi/pycom/pycom.md) library provides several functions to achieve this. This example will demonstrate how you could potentially use this functionality to update deployed devices. The full source code of this example can be found [here](https://github.com/pycom/pycom-libraries/tree/master/examples/OTA). +Pycom modules come with the ability to update the devices firmware, while it is still running, we call this an "over the air" (OTA) update. The [`pycom`](/../firmwareapi/pycom/pycom) library provides several functions to achieve this. This example will demonstrate how you could potentially use this functionality to update deployed devices. The full source code of this example can be found [here](https://github.com/pycom/pycom-libraries/tree/master/examples/OTA). ## Method Here we will describe one possible update methodology you could use that is implemented by this example. -Imagine you a smart metering company and you wish to roll out an update for your Pycom based smart meter. These meters usually send data back via LoRa. Unfortunately LoRa downlink messages have a very limited size and several hundred if not thousand would be required to upload a complete firmware image. To get around this you can have your devices sending their regular data via LoRa and when they receive a special command via a downlink message, the devices will connect to a WiFi network. It is unfeasible to ask customers to allow your device to connect to their home network so instead this network could be provided by a vehicle. This vehicle will travel around a certain geographic area in which the devices have been sent the special downlink message to initiate the update. The devices will look for the WiFi network being broadcast by the vehicle and connect. The devices will then connect to a server running on this WiFi network. This server \(also shown in this example\) will generate manifest files that instruct the device on what it should update, and where to get the update data from. +Imagine you a smart metering company and you wish to roll out an update for your Pycom based smart meter. These meters usually send data back via LoRa. Unfortunately LoRa downlink messages have a very limited size and several hundred if not thousand would be required to upload a complete firmware image. To get around this you can have your devices sending their regular data via LoRa and when they receive a special command via a downlink message, the devices will connect to a WiFi network. It is unfeasible to ask customers to allow your device to connect to their home network so instead this network could be provided by a vehicle. This vehicle will travel around a certain geographic area in which the devices have been sent the special downlink message to initiate the update. The devices will look for the WiFi network being broadcast by the vehicle and connect. The devices will then connect to a server running on this WiFi network. This server (also shown in this example) will generate manifest files that instruct the device on what it should update, and where to get the update data from. ## Server Code available [here](https://github.com/pycom/pycom-libraries/blob/master/examples/OTA/OTA_server.py). -This script runs a HTTP server on port `8000` that provisions over the air \(OTA\) update manifests in JSON format as well as serving the update content. This script should be run in a directory that contains every version of the end devices code, in the following structure: +This script runs a HTTP server on port `8000` that provisions over the air (OTA) update manifests in JSON format as well as serving the update content. This script should be run in a directory that contains every version of the end devices code, in the following structure: ```text - server directory @@ -47,13 +52,13 @@ The top level directory that contains this script can contain one of two things: with the python LooseVersion versioning scheme - \([http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html](http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html)\). + ([http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html](http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html)). They should contain the entire file system of the end device for the corresponding version number. -* Firmware: These files should be named in the format `firmare_VERSION.bin`, where VERSION is a a version number compatible with the python LooseVersion versioning scheme \([http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html](http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html)\). +* Firmware: These files should be named in the format `firmare_VERSION.bin`, where VERSION is a a version number compatible with the python LooseVersion versioning scheme ([http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html](http://epydoc.sourceforge.net/stdlib/distutils.version.LooseVersion-class.html)). This file should be in the format of the `appimg.bin` created by the Pycom @@ -61,7 +66,7 @@ The top level directory that contains this script can contain one of two things: ### How to use -Once the directory has been setup as described above you simply need to start this script using python3. Once started this script will run a HTTP server on port `8000` \(this can be changed by changing the PORT variable\). This server will serve all the files in directory as expected along with one additional special file, `manifest.json`. This file does not exist on the file system but is instead generated when requested and contains the required changes to bring the end device from its current version to the latest available version. You can see an example of this by pointing your web browser at: +Once the directory has been setup as described above you simply need to start this script using python3. Once started this script will run a HTTP server on port `8000` (this can be changed by changing the PORT variable). This server will serve all the files in directory as expected along with one additional special file, `manifest.json`. This file does not exist on the file system but is instead generated when requested and contains the required changes to bring the end device from its current version to the latest available version. You can see an example of this by pointing your web browser at: `http://127.0.0.1:8000/manifest.json?current_ver=1.0.0` @@ -121,19 +126,19 @@ GET /manifest.json?current_ver=1.0.0 HTTP/1.0\r\nHost: 192.168.1.144:8000\r\n\r\ A MicroPyton library for interfacing with the server described above is available [here](https://github.com/pycom/pycom-libraries/blob/master/examples/OTA/1.0.0/flash/lib/OTA.py). -This library is split into two layers. The top level `OTA` class implements all the high level functionality such as parsing the JSON file, making back copies of files being updated incase the update fails, etc. The layer of the library is agnostic to your chosen transport method. Below this is the `WiFiOTA` class. This class implements the actual transport mechanism of how the device fetches the files and update manifest \(via WiFi as the class name suggests\). The reason for this split is so that the high level functionality can be reused regardless of what transport mechanism you end up using. This could be implemented on top of Bluetooth for example, or the sever changed from HTTP to FTP. +This library is split into two layers. The top level `OTA` class implements all the high level functionality such as parsing the JSON file, making back copies of files being updated incase the update fails, etc. The layer of the library is agnostic to your chosen transport method. Below this is the `WiFiOTA` class. This class implements the actual transport mechanism of how the device fetches the files and update manifest (via WiFi as the class name suggests). The reason for this split is so that the high level functionality can be reused regardless of what transport mechanism you end up using. This could be implemented on top of Bluetooth for example, or the sever changed from HTTP to FTP. -{% hint style="danger" %} +{{{% hint style="danger" %}}} Although the above code is functional, it is provided only as an example of how an end user might implement a OTA update mechanism. It is not 100% feature complete e.g. even though it does backup previous versions of files, the roll back procedure is not implemented. This is left of the end user to do. -{% endhint %} +{{< /hint >}} ## Example Below is am example implementing the methodology previously explained in this tutorial to initiate an OTA update. -{% hint style="info" %} +{{{% hint style="info" %}}} The example below will only work on a Pycom device with LoRa capabilities. If want to test it out on a device without LoRa functionality then simply comment out any code relating to LoRa. Leaving just the `WiFiOTA` initialisation and they `ota.connect()` and `ota.update()` -{% endhint %} +{{< /hint >}} ```python from network import LoRa, WLAN diff --git a/tutorials/all/owd.md b/content/tutorials/all/owd.md similarity index 98% rename from tutorials/all/owd.md rename to content/tutorials/all/owd.md index 5f89d21..e40343f 100644 --- a/tutorials/all/owd.md +++ b/content/tutorials/all/owd.md @@ -1,5 +1,10 @@ -# Onewire Driver - +--- +title: "Onewire Driver" +aliases: + - tutorials/all/owd.html + - tutorials/all/owd.md + - chapter/tutorials/all/owd +--- This tutorial explains how to connect and read data from a DS18x20 temperature sensor. The onewire library is also available at the [pycom-libraries](https://github.com/pycom/pycom-libraries/tree/master/lib/onewire) GitHub Repository. ## Basic usage diff --git a/tutorials/all/pir.md b/content/tutorials/all/pir.md similarity index 92% rename from tutorials/all/pir.md rename to content/tutorials/all/pir.md index 4dc7d88..d7524b0 100644 --- a/tutorials/all/pir.md +++ b/content/tutorials/all/pir.md @@ -1,8 +1,13 @@ -# PIR Sensor +--- +title: "PIR Sensor" +aliases: + - tutorials/all/pir.html + - tutorials/all/pir.md + - chapter/tutorials/all/pir +--- +This code reads PIR sensor triggers from this simple [PIR sensor](https://www.kiwi-electronics.nl/PIR-Motion-Sensor) and sends an HTTP request for every trigger, in this case to a [Domoticz](https://domoticz.com/) installation. When motion is constantly detected, this PIR sensor keeps the pin high, in which case this code will keep sending HTTP requests every 10 seconds (configurable with the hold\_time variable). -This code reads PIR sensor triggers from this simple [PIR sensor](https://www.kiwi-electronics.nl/PIR-Motion-Sensor) and sends an HTTP request for every trigger, in this case to a [Domoticz](https://domoticz.com/) installation. When motion is constantly detected, this PIR sensor keeps the pin high, in which case this code will keep sending HTTP requests every 10 seconds \(configurable with the hold\_time variable\). - -## Main \(`main.py`\) +## Main (`main.py`) ```python import time @@ -43,7 +48,7 @@ while True: print("Exited main loop") ``` -## Boot \(`boot.py`\) +## Boot (`boot.py`) For more WiFi scripts, see the wlan step by step tutorial. @@ -91,7 +96,7 @@ if machine.reset_cause() != machine.SOFT_RESET: wl.init(mode=WLAN.AP, ssid=original_ssid, auth=original_auth, channel=6, antenna=WLAN.INT_ANT) ``` -## Domoticz Wrapper \(`domoticz.py`\) +## Domoticz Wrapper (`domoticz.py`) ```python import socket diff --git a/tutorials/all/repl.md b/content/tutorials/all/repl.md similarity index 65% rename from tutorials/all/repl.md rename to content/tutorials/all/repl.md index 75ec25d..e2ab3e0 100644 --- a/tutorials/all/repl.md +++ b/content/tutorials/all/repl.md @@ -1,6 +1,11 @@ -# REPL - -Using the Pymakr Plugin, open and connect a device or use serial terminal \(PuTTY, screen, picocom, etc\). Upon connecting, there should be a blank screen with a flashing cursor. Press Enter and a MicroPython prompt should appear, i.e. `>>>`. Let’s make sure it is working with the obligatory test: +--- +title: "REPL" +aliases: + - tutorials/all/repl.html + - tutorials/all/repl.md + - chapter/tutorials/all/repl +--- +Using the Pymakr Plugin, open and connect a device or use serial terminal (PuTTY, screen, picocom, etc). Upon connecting, there should be a blank screen with a flashing cursor. Press Enter and a MicroPython prompt should appear, i.e. `>>>`. Let's make sure it is working with the obligatory test: ```python >>> print("Hello LoPy!") @@ -41,5 +46,5 @@ Type "help()" for more information. >>> ``` -If that still isn’t working a hard reset can be performed \(power-off/on\) by pressing the `RST` switch \(the small black button next to the RGB LED\). Using telnet, this will end the session, disconnecting the program that was used to connect to the Pycom Device. +If that still isn't working a hard reset can be performed (power-off/on) by pressing the `RST` switch (the small black button next to the RGB LED). Using telnet, this will end the session, disconnecting the program that was used to connect to the Pycom Device. diff --git a/tutorials/all/rgbled.md b/content/tutorials/all/rgbled.md similarity index 81% rename from tutorials/all/rgbled.md rename to content/tutorials/all/rgbled.md index 12f934b..ed5a67a 100644 --- a/tutorials/all/rgbled.md +++ b/content/tutorials/all/rgbled.md @@ -1,5 +1,10 @@ -# RGB LED - +--- +title: "RGB LED" +aliases: + - tutorials/all/rgbled.html + - tutorials/all/rgbled.md + - chapter/tutorials/all/rgbled +--- By default the heartbeat LED flashes in blue colour once every 4s to signal that the system is alive. This can be overridden through the `pycom` module. ```python @@ -29,5 +34,5 @@ for cycles in range(10): # stop after 10 cycles Here is the expected result: -![](../../.gitbook/assets/traffic.gif) +![](/gitbook/assets/traffic.gif) diff --git a/tutorials/all/rmt.md b/content/tutorials/all/rmt.md similarity index 84% rename from tutorials/all/rmt.md rename to content/tutorials/all/rmt.md index 3f09559..61c6d58 100644 --- a/tutorials/all/rmt.md +++ b/content/tutorials/all/rmt.md @@ -1,10 +1,15 @@ -# RMT +--- +title: "RMT" +aliases: + - tutorials/all/rmt.html + - tutorials/all/rmt.md + - chapter/tutorials/all/rmt +--- +Detailed information about this class can be found in [`RMT`](/../firmwareapi/pycom/machine/rmt). -Detailed information about this class can be found in [`RMT`](../../firmwareapi/pycom/machine/rmt.md). +The RMT (Remote Control) peripheral of the ESP32 is primarily designed to send and receive infrared remote control signals that use on-off-keying of a carrier frequency, but due to its design it can be used to generate various types of signals, this class will allow you to do this. -The RMT \(Remote Control\) peripheral of the ESP32 is primarily designed to send and receive infrared remote control signals that use on-off-keying of a carrier frequency, but due to its design it can be used to generate various types of signals, this class will allow you to do this. - -The RMT has 7 channels, of which 5 are available and can be mapped to any GPIO pin \(_Note:_ Pins `P13` -`P18` can only be used as inputs\). +The RMT has 7 channels, of which 5 are available and can be mapped to any GPIO pin (_Note:_ Pins `P13` -`P18` can only be used as inputs). | Channel | Resolution | Maximum Pulse Width | | :--- | :--- | :--- | @@ -35,7 +40,7 @@ duration = 10000 rmt.pulses_send(duration, data) ``` -![Waveform of example 1](../../.gitbook/assets/rmt_ex_1%20%281%29.png) +![Waveform of example 1](/gitbook/assets/rmt_ex_1%20%281%29.png) In this example we define the signal by a tuple of durations and what state the signal starts in. @@ -54,7 +59,7 @@ duration = (8000,11000,8000,11000,6000,13000,6000,3000,8000) rmt.pulses_send(duration, start_level=RMT.HIGH) ``` -![Waveform of example 2](../../.gitbook/assets/rmt_ex_2.png) +![Waveform of example 2](/gitbook/assets/rmt_ex_2.png) This third example, is a combination of the above two styles of defining a signal. Each pulse has a defined duration as well as a state. This is useful if you don't always want the signal to toggle state. @@ -70,7 +75,7 @@ duration = (400,200,100,300,200,400) rmt.pulses_send(duration, data) ``` -![Waveform of example 3](../../.gitbook/assets/rmt_ex_3%20%281%29.png) +![Waveform of example 3](/gitbook/assets/rmt_ex_3%20%281%29.png) The following example creates an RMT object on channel 4 and configures it for transmission with carrier modulation. @@ -86,7 +91,7 @@ duration = 10000 rmt.pulses_send(duration, data) ``` -![Waveform of example 4](../../.gitbook/assets/rmt_ex_4.png) +![Waveform of example 4](/gitbook/assets/rmt_ex_4.png) The following example creates an RMT object on channel 2, configures it for receiving, then waits for the first, undefined number of pulses without timeout @@ -98,9 +103,9 @@ rmt.init(gpio="P21", rx_idle_threshold=1000) data = rmt.pulses_get() ``` -{% hint style="danger" %} +{{{% hint style="danger" %}}} If `tx_idle_level` is not set to the opposite of the third value in the `tx_carrier` tuple, the carrier wave will continue to be generated when the RMT channel is idle. -{% endhint %} +{{< /hint >}} ## Receiving diff --git a/tutorials/all/socket.md b/content/tutorials/all/socket.md similarity index 98% rename from tutorials/all/socket.md rename to content/tutorials/all/socket.md index 257fa66..9e6dfe2 100644 --- a/tutorials/all/socket.md +++ b/content/tutorials/all/socket.md @@ -1,5 +1,10 @@ -# Socket - +--- +title: "Socket" +aliases: + - tutorials/all/socket.html + - tutorials/all/socket.md + - chapter/tutorials/all/socket +--- Detailed information about this class can be found in [usocket](). ### Setting up a server with blocking sockets diff --git a/tutorials/all/threading.md b/content/tutorials/all/threading.md similarity index 82% rename from tutorials/all/threading.md rename to content/tutorials/all/threading.md index ccf249b..ef24997 100644 --- a/tutorials/all/threading.md +++ b/content/tutorials/all/threading.md @@ -1,5 +1,10 @@ -# Threading - +--- +title: "Threading" +aliases: + - tutorials/all/threading.html + - tutorials/all/threading.md + - chapter/tutorials/all/threading +--- MicroPython supports spawning threads by the `_thread` module. The following example demonstrates the use of this module. A thread is simply defined as a function that can receive any number of parameters. Below 3 threads are started, each one perform a print at a different interval. ```python diff --git a/tutorials/all/timers.md b/content/tutorials/all/timers.md similarity index 78% rename from tutorials/all/timers.md rename to content/tutorials/all/timers.md index ae1378e..6a5f69b 100644 --- a/tutorials/all/timers.md +++ b/content/tutorials/all/timers.md @@ -1,6 +1,11 @@ -# Timers - -Detailed information about this class can be found in [`Timer`](../../firmwareapi/pycom/machine/timer.md). +--- +title: "Timers" +aliases: + - tutorials/all/timers.html + - tutorials/all/timers.md + - chapter/tutorials/all/timers +--- +Detailed information about this class can be found in [`Timer`](/../firmwareapi/pycom/machine/timer). ## Chronometer @@ -47,7 +52,7 @@ class Clock: clock = Clock() ``` -{% hint style="info" %} -There are no restrictions to what can be done in an interrupt. For example, it is possible to even do network requests with an interrupt. However, it is important to keep in mind that interrupts are handled sequentially, so it’s good practice to keep them short. More information can be found in [`Interrupt Handling`](../../firmwareapi/notes.md#interrupt-handling). -{% endhint %} +{{{% hint style="info" %}}} +There are no restrictions to what can be done in an interrupt. For example, it is possible to even do network requests with an interrupt. However, it is important to keep in mind that interrupts are handled sequentially, so it's good practice to keep them short. More information can be found in [`Interrupt Handling`](/../firmwareapi/notes.md#interrupt-handling). +{{< /hint >}} diff --git a/tutorials/all/touch.md b/content/tutorials/all/touch.md similarity index 96% rename from tutorials/all/touch.md rename to content/tutorials/all/touch.md index 7677c16..cc16021 100644 --- a/tutorials/all/touch.md +++ b/content/tutorials/all/touch.md @@ -1,5 +1,9 @@ -# Touch - +--- +title: "Touch" +aliases: + - tutorials/all/touch.html + - tutorials/all/touch.md +--- Example of how to use the Touch class of the Machine module: ```python diff --git a/tutorials/all/wlan.md b/content/tutorials/all/wlan.md similarity index 88% rename from tutorials/all/wlan.md rename to content/tutorials/all/wlan.md index f3ab22f..33c5247 100644 --- a/tutorials/all/wlan.md +++ b/content/tutorials/all/wlan.md @@ -1,5 +1,10 @@ -# WLAN - +--- +title: "WLAN" +aliases: + - tutorials/all/wlan.html + - tutorials/all/wlan.md + - chapter/tutorials/all/wlan +--- The WLAN is a system feature of all Pycom devices, therefore it is enabled by default. In order to retrieve the current WLAN instance, run: @@ -9,13 +14,13 @@ In order to retrieve the current WLAN instance, run: >>> wlan = WLAN() # we call the constructor without params ``` -The current mode \(`WLAN.AP` after power up\) may be checked by running: +The current mode (`WLAN.AP` after power up) may be checked by running: ```python >>> wlan.mode() ``` -{% hint style="danger" %} +{{{% hint style="danger" %}}} When changing the WLAN mode, if following the instructions below, the WLAN connection to the Pycom device will be broken. This means commands will not run interactively over WiFi. @@ -68,9 +73,9 @@ if not wlan.isconnected(): machine.idle() # save power while waiting ``` -{% hint style="info" %} +{{{% hint style="info" %}}} Notice how we check for the reset cause and the connection status, this is crucial in order to be able to soft reset the LoPy during a telnet session without breaking the connection. -{% endhint %} +{{< /hint >}} ## Multiple Networks using a Static IP Address @@ -122,7 +127,7 @@ if machine.reset_cause() != machine.SOFT_RESET: ### Connecting with EAP-TLS: -Before connecting, obtain and copy the public and private keys to the device, e.g. under location `/flash/cert`. If it is required to validate the server’s public key, an appropriate CA certificate \(chain\) must also be provided. +Before connecting, obtain and copy the public and private keys to the device, e.g. under location `/flash/cert`. If it is required to validate the server's public key, an appropriate CA certificate (chain) must also be provided. ```python from network import WLAN @@ -133,7 +138,7 @@ wlan.connect(ssid='mywifi', auth=(WLAN.WPA2_ENT,), identity='myidentity', ca_cer ### Connecting with EAP-PEAP or EAP-TTLS: -In case of EAP-PEAP \(or EAP-TTLS\), the client key and certificate are not necessary, only a username and password pair. If it is required to validate the server’s public key, an appropriate CA certificate \(chain\) must also be provided. +In case of EAP-PEAP (or EAP-TTLS), the client key and certificate are not necessary, only a username and password pair. If it is required to validate the server's public key, an appropriate CA certificate (chain) must also be provided. ```python from network import WLAN diff --git a/content/tutorials/introduction.md b/content/tutorials/introduction.md new file mode 100644 index 0000000..1099eaf --- /dev/null +++ b/content/tutorials/introduction.md @@ -0,0 +1,19 @@ +--- +title: "Introduction" +aliases: + - tutorials/introduction.html + - tutorials/introduction.md + - chapter/tutorials +--- +![](/gitbook/assets/tutorialsicon%20%281%29.png) + +## Tutorials and Examples + +This section contains tutorials and examples for use with Pycom modules and Expansion boards. + +General Pycom tutorials contains tutorials that may be run on any Pycom device, such as connecting to a WiFi network, Bluetooth, controlling I/O pins etc. Later sections are specific to the LoPy and SiPy devices such as setting up a LoRa node or connecting to the Sigfox network. The final sections are related to examples using the Pytrack and Pysense. + +Before starting, ensure that any Pycom devices are running the latest firmware; for instructions see [Firmware Updates](/gettingstarted/installation/firmwaretool). + +The source code for these tutorials, along with the required libraries can be found in in the [pycom-libraries](https://github.com/pycom/pycom-libraries) repository. + diff --git a/content/tutorials/lora/README.md b/content/tutorials/lora/README.md new file mode 100644 index 0000000..3980785 --- /dev/null +++ b/content/tutorials/lora/README.md @@ -0,0 +1,11 @@ +--- +title: "LoRa Examples" +aliases: + - chapter/tutorials/lora +--- +The following tutorials demonstrate the use of the LoRa functionality on the LoPy. LoRa can work in 2 different modes; **LoRa-MAC** (which we also call Raw-LoRa) and **LoRaWAN** mode. + +LoRa-MAC mode basically accesses de radio directly and packets are sent using the LoRa modulation on the selected frequency without any headers, addressing information or encryption. Only a CRC is added at the tail of the packet and this is removed before the received frame is passed on to the application. This mode can be used to build any higher level protocol that can benefit from the long range features of the LoRa modulation. Typical uses cases include LoPy to LoPy direct communication and a LoRa packet forwarder. + +LoRaWAN mode implements the full LoRaWAN stack for a class A device. It supports both OTAA and ABP connection methods, as well as advanced features like adding and removing custom channels to support "special" frequencies plans like the those used in New Zealand. + diff --git a/tutorials/lora/README.md b/content/tutorials/lora/_index.md similarity index 90% rename from tutorials/lora/README.md rename to content/tutorials/lora/_index.md index 593f7a4..b6ce98a 100644 --- a/tutorials/lora/README.md +++ b/content/tutorials/lora/_index.md @@ -1,6 +1,8 @@ -# LoRa Examples - -The following tutorials demonstrate the use of the LoRa functionality on the LoPy. LoRa can work in 2 different modes; **LoRa-MAC** \(which we also call Raw-LoRa\) and **LoRaWAN** mode. +--- +title: "LoRa Examples" +aliases: +--- +The following tutorials demonstrate the use of the LoRa functionality on the LoPy. LoRa can work in 2 different modes; **LoRa-MAC** (which we also call Raw-LoRa) and **LoRaWAN** mode. LoRa-MAC mode basically accesses de radio directly and packets are sent using the LoRa modulation on the selected frequency without any headers, addressing information or encryption. Only a CRC is added at the tail of the packet and this is removed before the received frame is passed on to the application. This mode can be used to build any higher level protocol that can benefit from the long range features of the LoRa modulation. Typical uses cases include LoPy to LoPy direct communication and a LoRa packet forwarder. diff --git a/tutorials/lora/lora-mac-nano-gateway.md b/content/tutorials/lora/lora-mac-nano-gateway.md similarity index 85% rename from tutorials/lora/lora-mac-nano-gateway.md rename to content/tutorials/lora/lora-mac-nano-gateway.md index 58b935a..d3ddfe8 100644 --- a/tutorials/lora/lora-mac-nano-gateway.md +++ b/content/tutorials/lora/lora-mac-nano-gateway.md @@ -1,6 +1,11 @@ -# LoRa-MAC Nano-Gateway - -This example allows a raw LoRa connection between two LoPys \(nodes\) to a single LoPy acting as a Nano-Gateway. +--- +title: "LoRa-MAC Nano-Gateway" +aliases: + - tutorials/lora/lora-mac-nano-gateway.html + - tutorials/lora/lora-mac-nano-gateway.md + - chapter/tutorials/lora/lora-mac-nano-gateway +--- +This example allows a raw LoRa connection between two LoPys (nodes) to a single LoPy acting as a Nano-Gateway. For more information and discussions about this code, see this forum [post](https://forum.pycom.io/topic/236/lopy-nano-gateway). @@ -95,12 +100,12 @@ while(True): The node is always sending packages and waiting for the `ack` from the gateway. -{% hint style="info" %} +{{{% hint style="info" %}}} To adapt this code to user specific needs: * Put a max waiting time for the `ack` to arrive and resend the package or mark it as invalid -* Increase the package size changing the `_LORA_PKG_FORMAT` to `BH%ds`. The `H` will allow the keeping of 2 bytes for size \(for more information about [struct format](https://docs.python.org/2/library/struct.html#format-characters)\) +* Increase the package size changing the `_LORA_PKG_FORMAT` to `BH%ds`. The `H` will allow the keeping of 2 bytes for size (for more information about [struct format](https://docs.python.org/2/library/struct.html#format-characters)) * Reduce the package size with bitwise manipulation -* Reduce the message size \(for this demo, a string\) to something more useful for specific development -{% endhint %} +* Reduce the message size (for this demo, a string) to something more useful for specific development +{{< /hint >}} diff --git a/tutorials/lora/lora-mac.md b/content/tutorials/lora/lora-mac.md similarity index 78% rename from tutorials/lora/lora-mac.md rename to content/tutorials/lora/lora-mac.md index 3973f8d..45bf6e8 100644 --- a/tutorials/lora/lora-mac.md +++ b/content/tutorials/lora/lora-mac.md @@ -1,8 +1,13 @@ -# LoRa-MAC \(Raw LoRa\) - +--- +title: "LoRa-MAC (Raw LoRa)" +aliases: + - tutorials/lora/lora-mac.html + - tutorials/lora/lora-mac.md + - chapter/tutorials/lora/lora-mac +--- Basic LoRa connection example, sending and receiving data. In LoRa-MAC mode the LoRaWAN layer is bypassed and the radio is used directly. The data sent is not formatted or encrypted in any way, and no addressing information is added to the frame. -For the example below, you will need two LoPys. A `while` loop with a random delay time is used to minimise the chances of the 2 LoPy’s transmitting at the same time. Run the code below on the 2 LoPy modules and you will see the word 'Hello' being received on both sides. +For the example below, you will need two LoPys. A `while` loop with a random delay time is used to minimise the chances of the 2 LoPy's transmitting at the same time. Run the code below on the 2 LoPy modules and you will see the word 'Hello' being received on both sides. ```python from network import LoRa diff --git a/tutorials/lora/lora-mesh.md b/content/tutorials/lora/lora-mesh.md similarity index 88% rename from tutorials/lora/lora-mesh.md rename to content/tutorials/lora/lora-mesh.md index c357b01..acca3a5 100644 --- a/tutorials/lora/lora-mesh.md +++ b/content/tutorials/lora/lora-mesh.md @@ -1,7 +1,10 @@ -{% hint style="info" %} - These API's are currently only available in the latest RC builds. -{% endhint %} - +--- +title: "LoRa Mesh" +aliases: + - tutorials/lora/lora-mesh.html + - tutorials/lora/lora-mesh.md + - chapter/tutorials/lora/lora-mesh +--- # Pymesh - LoRa Mesh @@ -11,23 +14,23 @@ To understand the OpenThread terms and overall functionality, these guides are h * [What is Thread?](https://openthread.io/guides/thread-primer) * [Node Roles and Types](https://openthread.io/guides/thread-primer/node-roles-and-types) -* [IPv6 Addressing](https://openthread.io/guides/thread-primer/ipv6-addressing) \(especially, RLOC unicast address\) +* [IPv6 Addressing](https://openthread.io/guides/thread-primer/ipv6-addressing) (especially, RLOC unicast address) -Important, all the OpenThread CLI commands are accessible using `LoRa.cli("command")`, the complete list of commands is [here](https://github.com/openthread/openthread/blob/c482301ec73b80985445102e4d0a936346172ddb/src/cli/README.md). Please note some commands, can't execute, as some functionalities are not implemented \(ex: Commissioning Role, Joiner Role, DNS\). +Important, all the OpenThread CLI commands are accessible using `LoRa.cli("command")`, the complete list of commands is [here](https://github.com/openthread/openthread/blob/c482301ec73b80985445102e4d0a936346172ddb/src/cli/README). Please note some commands, can't execute, as some functionalities are not implemented (ex: Commissioning Role, Joiner Role, DNS). This example shows how to: * enable LoRa-Mesh network -* find neighbors \(parent, children, other router direct connections\) +* find neighbors (parent, children, other router direct connections) * send PING to neighbors * open UDP socket for: - * listening incoming UDP packets and answering back \(ACK\) + * listening incoming UDP packets and answering back (ACK) * sending packets to all neighbors * toggle LED as packet/ping is received. -{% hint style="info" %} +{{{% hint style="info" %}}} The LoRa-Mesh socket supports only the following socket methods: `close()`, `bind()`, `sendto()`, and `recvfrom()`. -{% endhint %} +{{< /hint >}} **Lora Mesh example** diff --git a/tutorials/lora/lorawan-abp.md b/content/tutorials/lora/lorawan-abp.md similarity index 87% rename from tutorials/lora/lorawan-abp.md rename to content/tutorials/lora/lorawan-abp.md index 15317e4..2b15d24 100644 --- a/tutorials/lora/lorawan-abp.md +++ b/content/tutorials/lora/lorawan-abp.md @@ -1,6 +1,11 @@ -# LoRaWAN with ABP - -ABP stands for Authentication By Personalisation. It means that the encryption keys are configured manually on the device and can start sending frames to the Gateway without needing a 'handshake' procedure to exchange the keys \(such as the one performed during an OTAA join procedure\). +--- +title: "LoRaWAN with ABP" +aliases: + - tutorials/lora/lorawan-abp.html + - tutorials/lora/lorawan-abp.md + - chapter/tutorials/lora/lorawan-abp +--- +ABP stands for Authentication By Personalisation. It means that the encryption keys are configured manually on the device and can start sending frames to the Gateway without needing a 'handshake' procedure to exchange the keys (such as the one performed during an OTAA join procedure). The example below attempts to get any data received after sending the frame. Keep in mind that the Gateway might not be sending any data back, therefore we make the socket non-blocking before attempting to receive, in order to prevent getting stuck waiting for a packet that will never arrive. diff --git a/tutorials/lora/lorawan-nano-gateway.md b/content/tutorials/lora/lorawan-nano-gateway.md similarity index 87% rename from tutorials/lora/lorawan-nano-gateway.md rename to content/tutorials/lora/lorawan-nano-gateway.md index e75aa16..feb4456 100644 --- a/tutorials/lora/lorawan-nano-gateway.md +++ b/content/tutorials/lora/lorawan-nano-gateway.md @@ -1,6 +1,11 @@ -# LoRaWAN Nano-Gateway - -This example allows to connect a LoPy to a LoRaWAN network such as The Things Network \(TTN\) or Loriot to be used as a nano-gateway. +--- +title: "LoRaWAN Nano-Gateway" +aliases: + - tutorials/lora/lorawan-nano-gateway.html + - tutorials/lora/lorawan-nano-gateway.md + - chapter/tutorials/lora/lorawan-nano-gateway +--- +This example allows to connect a LoPy to a LoRaWAN network such as The Things Network (TTN) or Loriot to be used as a nano-gateway. This example uses settings specifically for connecting to The Things Network within the European 868 MHz region. For another usage, please see the `config.py` file for relevant sections that need changing. @@ -12,7 +17,7 @@ The Nano-Gateway code is split into 3 files, `main.py`, `config.py` and `nanogat ### Gateway ID -Most LoRaWAN network servers expect a Gateway ID in the form of a unique 64-bit hexadecimal number \(called a EUI-64\). The recommended practice is to produce this ID from your board by expanding the WiFi MAC address \(a 48-bit number, called MAC-48\). You can obtain that by running this code prior to configuration: +Most LoRaWAN network servers expect a Gateway ID in the form of a unique 64-bit hexadecimal number (called a EUI-64). The recommended practice is to produce this ID from your board by expanding the WiFi MAC address (a 48-bit number, called MAC-48). You can obtain that by running this code prior to configuration: ```python from network import WLAN @@ -23,7 +28,7 @@ ubinascii.hexlify(wl.mac())[:6] + 'FFFE' + ubinascii.hexlify(wl.mac())[6:] The result will by something like `b'240ac4FFFE008d88'` where `240ac4FFFE008d88` is your Gateway ID to be used in your network provider configuration. -## Main \(`main.py`\) +## Main (`main.py`) This file runs at boot and calls the library and `config.py` files to initialise the nano-gateway. Once configuration is set, the nano-gateway is then started. @@ -51,9 +56,9 @@ if __name__ == '__main__': input() ``` -## Configuration \(`config.py`\) +## Configuration (`config.py`) -This file contains settings for the server and network it is connecting to. Depending on the nano-gateway region and provider \(TTN, Loriot, etc.\) these will vary. The provided example will work with The Things Network \(TTN\) in the European, 868Mhz, region. +This file contains settings for the server and network it is connecting to. Depending on the nano-gateway region and provider (TTN, Loriot, etc.) these will vary. The provided example will work with The Things Network (TTN) in the European, 868Mhz, region. The Gateway ID is generated in the script using the process described above. @@ -89,7 +94,7 @@ LORA_NODE_DR = 5 # LORA_NODE_DR = 3 ``` -## Library \(`nanogateway.py`\) +## Library (`nanogateway.py`) The nano-gateway library controls all of the packet generation and forwarding for the LoRa data. This does not require any user configuration and the latest version of this code should be downloaded from the Pycom [GitHub Repository](https://github.com/pycom/pycom-libraries/tree/master/examples/lorawan-nano-gateway). @@ -339,9 +344,9 @@ class NanoGateway: ## Registering with TTN -To set up the gateway with The Things Network \(TTN\), navigate to their website and create/register an account. Enter a username and an email address to verify with their platform. +To set up the gateway with The Things Network (TTN), navigate to their website and create/register an account. Enter a username and an email address to verify with their platform. -![](../../.gitbook/assets/ttn-1.png) +![](/gitbook/assets/ttn-1.png) Once an account has been registered, the nano-gateway can then be registered. To do this, navigate to the TTN Console web page. @@ -349,42 +354,42 @@ Once an account has been registered, the nano-gateway can then be registered. To Inside the TTN Console, there are two options, `applications` and `gateways`. Select `gateways` and then click on `register gateway`. This will allow for the set up and registration of a new nano-gateway. -![](../../.gitbook/assets/ttn-2%20%281%29.png) +![](/gitbook/assets/ttn-2%20%281%29.png) On the Register Gateway page, you will need to set the following settings: -![](../../.gitbook/assets/ttn-gatewayreg-11-2017-2.jpg) These are unique to each gateway, location and country specific frequency. Please verify that correct settings are selected otherwise the gateway will not connect to TTN. +![](/gitbook/assets/ttn-gatewayreg-11-2017-2.jpg) These are unique to each gateway, location and country specific frequency. Please verify that correct settings are selected otherwise the gateway will not connect to TTN. **You need to tick the "I'm using the legacy packet forwarder" to enable the right settings.** This is because the Nano-Gateway uses the 'de facto' standard Semtech UDP protocol. | Option | Value | | :--- | :--- | | Protocol | Packet Forwarder | -| Gateway EUI | User Defined \(must match `config.py`\) | +| Gateway EUI | User Defined (must match `config.py`) | | Description | User Defined | -| Frequency Plan | Select Country \(e.g. EU - 868 MHz\) | +| Frequency Plan | Select Country (e.g. EU - 868 MHz) | | Location | User Defined | | Antenna Placement | Indoor or Outdoor | The Gateway EUI should match your Gateway ID from the `config.py` file. We suggest you follow the procedure described near the top of this document to create your own unique Gateway ID. -Once these settings have been applied, click `Register Gateway`. A Gateway Overview page will appear, with the configuration settings showing. Next click on the `Gateway Settings` and configure the Router address to match that of the gateway \(default: `router.eu.thethings.network`\). +Once these settings have been applied, click `Register Gateway`. A Gateway Overview page will appear, with the configuration settings showing. Next click on the `Gateway Settings` and configure the Router address to match that of the gateway (default: `router.eu.thethings.network`). -![](../../.gitbook/assets/ttn-4%20%281%29.png) +![](/gitbook/assets/ttn-4%20%281%29.png) The `Gateway` should now be configured. Next, one or more nodes can now be configured to use the nano-gateway and TTN applications may be built. ## LoPy Node -There are two methods of connecting LoPy devices to the nano-gateway, Over the Air Activation \(OTAA\) and Activation By Personalisation \(ABP\). The code and instructions for registering these methods are shown below, followed by instruction for how to connect them to an application on TTN. +There are two methods of connecting LoPy devices to the nano-gateway, Over the Air Activation (OTAA) and Activation By Personalisation (ABP). The code and instructions for registering these methods are shown below, followed by instruction for how to connect them to an application on TTN. -{% hint style="info" %} -It’s important that the following code examples \(also on GitHub\) are used to connect to the nano-gateway as it only supports single channel connections. -{% endhint %} +{{{% hint style="info" %}}} +It's important that the following code examples (also on GitHub) are used to connect to the nano-gateway as it only supports single channel connections. +{{< /hint >}} -### OTAA \(Over The Air Activation\) +### OTAA (Over The Air Activation) -When the LoPy connects an application \(via TTN\) using OTAA, the network configuration is derived automatically during a handshake between the LoPy and network server. Note that the network keys derived using the OTAA methodology are specific to the device and are used to encrypt and verify transmissions at the network level. +When the LoPy connects an application (via TTN) using OTAA, the network configuration is derived automatically during a handshake between the LoPy and network server. Note that the network keys derived using the OTAA methodology are specific to the device and are used to encrypt and verify transmissions at the network level. ```python """ OTAA Node example compatible with the LoPy Nano Gateway """ @@ -442,7 +447,7 @@ for i in range (200): time.sleep(6) ``` -### ABP \(Activation By Personalisation\) +### ABP (Activation By Personalisation) Using ABP join mode requires the user to define the following values and input them into both the LoPy and the TTN Application: @@ -507,17 +512,17 @@ Now that the gateway & nodes have been setup, a TTN Application can be built; i. Selecting the `Applications` tab at the top of the TTN console, will bring up a screen for registering applications. Click register and a new page, similar to the one below, will open. -![](../../.gitbook/assets/ttn-5.png) +![](/gitbook/assets/ttn-5.png) Enter a unique `Application ID` as well as a Description & Handler Registration. Now the LoPy nodes must be registered to send data up to the new Application. -### Registering Devices \(LoPy\) +### Registering Devices (LoPy) To connect nodes to the nano-gateway, devices need to be added to the application. To do this, navigate to the `Devices` tab on the `Application` home page and click the `Register Device` button. -![](../../.gitbook/assets/ttn-6.png) +![](/gitbook/assets/ttn-6.png) In the `Register Device` panel, complete the forms for the `Device ID` and the `Device EUI`. The `Device ID` is user specified and is unique to the device in this application. The `Device EUI` is also user specified but must consist of exactly 8 bytes, given in hexadecimal. @@ -525,25 +530,25 @@ Once the device has been added, change the `Activation Method` between `OTAA` an ### Adding Application Integrations -Now that the data is arriving on the TTN Backend, TTN can be managed as to where data should be delivered to. To do this, use the `Integrations` tab within the new Application’s settings. +Now that the data is arriving on the TTN Backend, TTN can be managed as to where data should be delivered to. To do this, use the `Integrations` tab within the new Application's settings. -![](../../.gitbook/assets/ttn-7%20%281%29.png) +![](/gitbook/assets/ttn-7%20%281%29.png) Upon clicking `add integration`, a screen with 4 different options will appear. These have various functionality and more information about them can be found on the TTN website/documentation. For this example, use the `HTTP Integration` to forward the LoRaWAN Packets to a remote server/address. -![](../../.gitbook/assets/ttn-8%20%281%29.png) +![](/gitbook/assets/ttn-8%20%281%29.png) Click `HTTP Integration` to connect up an endpoint that can receive the data. -For testing, a website called [RequestBin](https://requestb.in/) may be used to receive the data that TTN forwards \(via POST Request\). To set this up, navigate to [RequestBin](https://requestb.in/) and click the `Create a RequestBin`. +For testing, a website called [RequestBin](https://requestb.in/) may be used to receive the data that TTN forwards (via POST Request). To set this up, navigate to [RequestBin](https://requestb.in/) and click the `Create a RequestBin`. -![](../../.gitbook/assets/ttn-9%20%281%29.png) +![](/gitbook/assets/ttn-9%20%281%29.png) Copy the URL that is generated and past this into the `URL` form under the `Application Settings`. -![](../../.gitbook/assets/ttn-10%20%281%29.png) +![](/gitbook/assets/ttn-10%20%281%29.png) This is the address that TTN will forward data onto. As soon as a LoPy starts sending messages, TTN will forward these onto `RequestBin` and they will appear at the unique `RequestBin URL`. diff --git a/tutorials/lora/lorawan-otaa.md b/content/tutorials/lora/lorawan-otaa.md similarity index 92% rename from tutorials/lora/lorawan-otaa.md rename to content/tutorials/lora/lorawan-otaa.md index 182d319..3da7847 100644 --- a/tutorials/lora/lorawan-otaa.md +++ b/content/tutorials/lora/lorawan-otaa.md @@ -1,5 +1,10 @@ -# LoRaWAN with OTAA - +--- +title: "LoRaWAN with OTAA" +aliases: + - tutorials/lora/lorawan-otaa.html + - tutorials/lora/lorawan-otaa.md + - chapter/tutorials/lora/lorawan-otaa +--- OTAA stands for Over The Air Authentication. With this method the LoPy sends a Join request to the LoRaWAN Gateway using the `APPEUI` and `APPKEY` provided. If the keys are correct the Gateway will reply to the LoPy with a join accept message and from that point on the LoPy is able to send and receive packets to/from the Gateway. If the keys are incorrect no response will be received and the `has_joined()` method will always return `False`. The example below attempts to get any data received after sending the frame. Keep in mind that the Gateway might not be sending any data back, therefore we make the socket non-blocking before attempting to receive, in order to prevent getting stuck waiting for a packet that will never arrive. diff --git a/tutorials/lora/module-module.md b/content/tutorials/lora/module-module.md similarity index 83% rename from tutorials/lora/module-module.md rename to content/tutorials/lora/module-module.md index a97e1de..52113b9 100644 --- a/tutorials/lora/module-module.md +++ b/content/tutorials/lora/module-module.md @@ -1,6 +1,11 @@ -# LoPy to LoPy - -This example shows how to connect two Pycode LoRa capable modules \(nodes\) via raw LoRa. +--- +title: "LoPy to LoPy" +aliases: + - tutorials/lora/module-module.html + - tutorials/lora/module-module.md + - chapter/tutorials/lora/module-module +--- +This example shows how to connect two Pycode LoRa capable modules (nodes) via raw LoRa. ## Node A diff --git a/tutorials/lora/pymesh-br.md b/content/tutorials/lora/pymesh-br.md similarity index 98% rename from tutorials/lora/pymesh-br.md rename to content/tutorials/lora/pymesh-br.md index 38ceccd..f071e2a 100644 --- a/tutorials/lora/pymesh-br.md +++ b/content/tutorials/lora/pymesh-br.md @@ -1,6 +1,10 @@ -{% hint style="info" %} - These API's are currently only available in the latest RC builds. -{% endhint %} +--- +title: "PyMesh Border Router" +aliases: + - tutorials/lora/pymesh-br.html + - tutorials/lora/pymesh-br.md +--- + # Pymesh - Border Router diff --git a/tutorials/lora/rn2483-to-lopy.md b/content/tutorials/lora/rn2483-to-lopy.md similarity index 76% rename from tutorials/lora/rn2483-to-lopy.md rename to content/tutorials/lora/rn2483-to-lopy.md index 6d14620..d7990d5 100644 --- a/tutorials/lora/rn2483-to-lopy.md +++ b/content/tutorials/lora/rn2483-to-lopy.md @@ -1,5 +1,10 @@ -# RN2483 to LoPy - +--- +title: "RN2483 to LoPy" +aliases: + - tutorials/lora/rn2483-to-lopy.html + - tutorials/lora/rn2483-to-lopy.md + - chapter/tutorials/lora/rn2483-to-lopy +--- This example shows how to send data between a Microchip RN2483 and a LoPy via raw LoRa. ## RN2483 @@ -17,7 +22,7 @@ radio set sync 12 radio set prlen 8 # Transmit via radio tx: -radio tx 48656c6C6F #(should send ‘Hello’) +radio tx 48656c6C6F #(should send ‘Hello') ``` ## LoPy diff --git a/content/tutorials/lte/README.md b/content/tutorials/lte/README.md new file mode 100644 index 0000000..a201e31 --- /dev/null +++ b/content/tutorials/lte/README.md @@ -0,0 +1,9 @@ +--- +title: "LTE Examples" +aliases: + - chapter/tutorials/lte +--- +The following tutorials demonstrate the use of the LTE CAT-M1 and NB-IoT functionality on cellular enabled Pycom modules. + +Our cellular modules support both LTE CAT-M1 and NB-IoT, these are new lower power, long range, cellular protocols. These are not the same as the full version of 2G/3G/LTE supported by cell phones, and require your local carriers to support them. At the time of writing, CAT-M1 and NB-IoT connectivity is not widely available so be sure to check with local carriers if support is available where you are. + diff --git a/tutorials/lte/README.md b/content/tutorials/lte/_index.md similarity index 93% rename from tutorials/lte/README.md rename to content/tutorials/lte/_index.md index c572242..7717396 100644 --- a/tutorials/lte/README.md +++ b/content/tutorials/lte/_index.md @@ -1,5 +1,7 @@ -# LTE Examples - +--- +title: "LTE Examples" +aliases: +--- The following tutorials demonstrate the use of the LTE CAT-M1 and NB-IoT functionality on cellular enabled Pycom modules. Our cellular modules support both LTE CAT-M1 and NB-IoT, these are new lower power, long range, cellular protocols. These are not the same as the full version of 2G/3G/LTE supported by cell phones, and require your local carriers to support them. At the time of writing, CAT-M1 and NB-IoT connectivity is not widely available so be sure to check with local carriers if support is available where you are. diff --git a/tutorials/lte/cat-m1.md b/content/tutorials/lte/cat-m1.md similarity index 88% rename from tutorials/lte/cat-m1.md rename to content/tutorials/lte/cat-m1.md index b56c677..2426be0 100644 --- a/tutorials/lte/cat-m1.md +++ b/content/tutorials/lte/cat-m1.md @@ -1,8 +1,13 @@ -# CAT-M1 - -{% hint style="info" %} -Please ensure you have the latest Sequans modem firmware for the best network compatibility. Instructions for this can be found [here](firmware.md). -{% endhint %} +--- +title: "CAT-M1" +aliases: + - tutorials/lte/cat-m1.html + - tutorials/lte/cat-m1.md + - chapter/tutorials/lte/cat-m1 +--- +{{{% hint style="info" %}}} +Please ensure you have the latest Sequans modem firmware for the best network compatibility. Instructions for this can be found [here](firmware). +{{< /hint >}} The LTE Cat M1 service gives full IP access through the cellular modem. @@ -37,7 +42,7 @@ lte.dettach() This also applies to our MQTT and AWS examples. -**IMPORTANT:** Once the LTE radio is initialised, it must be de-initialised before going to deepsleep in order to ensure minimum power consumption. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network \(data or SMS received for instance\). +**IMPORTANT:** Once the LTE radio is initialised, it must be de-initialised before going to deepsleep in order to ensure minimum power consumption. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network (data or SMS received for instance). When using the expansion board and the FiPy together, the RTS/CTS jumpers **MUST** be removed as those pins are being used by the LTE radio. Keeping those jumpers in place will lead to erratic operation and higher current consumption specially while in deepsleep. diff --git a/tutorials/lte/firmware.md b/content/tutorials/lte/firmware.md similarity index 89% rename from tutorials/lte/firmware.md rename to content/tutorials/lte/firmware.md index a8a3d8f..c22729e 100644 --- a/tutorials/lte/firmware.md +++ b/content/tutorials/lte/firmware.md @@ -1,16 +1,21 @@ -# Modem Firmware Update - -{% hint style="info" %} +--- +title: "Modem Firmware Update" +aliases: + - tutorials/lte/firmware.html + - tutorials/lte/firmware.md + - chapter/tutorials/lte/firmware +--- +{{{% hint style="info" %}}} This article is only related to GPy, FiPy, and G01 boards -{% endhint %} +{{< /hint >}} -{% hint style="danger" %} +{{{% hint style="danger" %}}} **Important**: When upgrading your modem for the first time, even if you have updated it in the past with the old firmware update method, you **MUST** use the "recovery" upgrade method described below. Otherwise you will risk breaking your module -{% endhint %} +{{< /hint >}} Please read the following instructions carefully as there are some significant changes compared to the previous updater version. -Most importantly, the updater is now integrated in the latest stable firmware release \(we will also publish a new development and pybytes firmware in the coming days\), so you no longer need to upload any scripts to your module. The built-in updater will take precedence over any scripts uploaded. +Most importantly, the updater is now integrated in the latest stable firmware release (we will also publish a new development and pybytes firmware in the coming days), so you no longer need to upload any scripts to your module. The built-in updater will take precedence over any scripts uploaded. Please start with the following steps: @@ -21,7 +26,7 @@ You can find the different versions of firmwares available here: [https://softwa There are two packages available, one for the latest CAT-M1 firmware, and another for the latest NB-IoT firmware. -After unpacking the zip archive, you will find each firmware packages contains two files, one being the firmware file \(`CATM1-38638.dup` or `NB1-37781.dup`\) and the `updater.elf` file, which is required when using the "recovery" firmware update method or if a previous upgrade failed and the modem is in recovery mode. +After unpacking the zip archive, you will find each firmware packages contains two files, one being the firmware file (`CATM1-38638.dup` or `NB1-37781.dup`) and the `updater.elf` file, which is required when using the "recovery" firmware update method or if a previous upgrade failed and the modem is in recovery mode. Please note that the `updater.elf` file is only around 300K so you can also store it inside the flash file system of the module. The firmware dup files will NOT fit into the available `/flash` file system on the module, so you either need to use an SD card or upload it directly from your computer. @@ -99,7 +104,7 @@ SYSTEM VERSION ZSP1 : 1.0.99-12341 ``` -{% hint style="info" %} +{{{% hint style="info" %}}} After you have updated your modem once using the recovery method, you can now flash your modem again using just the `CATM1-38638.dup` or `NB1-37781.dup` file without specifying the `updater.elf` file. However, should the upgrade fail, your modem may end up in recovery mode and you will need the `updater.elf` file again. The updater will check for this and prompt you if using the `updater.elf` file is necessary. @@ -175,5 +180,5 @@ Type "help", "copyright", "credits" or "license" for more information. ## Retrying process -In case of any failure or interruption to the process of LTE modem upgrade you can repeat the same steps **after doing a hard reset to the board \(i.e disconnecting and reconnecting power\), pressing the reset button is not enough.** +In case of any failure or interruption to the process of LTE modem upgrade you can repeat the same steps **after doing a hard reset to the board (i.e disconnecting and reconnecting power), pressing the reset button is not enough.** diff --git a/tutorials/lte/imei.md b/content/tutorials/lte/imei.md similarity index 70% rename from tutorials/lte/imei.md rename to content/tutorials/lte/imei.md index dff1d81..a8b3087 100644 --- a/tutorials/lte/imei.md +++ b/content/tutorials/lte/imei.md @@ -1,5 +1,10 @@ -# Module IMEI - +--- +title: "Module IMEI" +aliases: + - tutorials/lte/imei.html + - tutorials/lte/imei.md + - chapter/tutorials/lte/imei +--- In order to retrieve the IMEI of your cellular enabled Pycom module you will firstly need to make sure you are on firmware version `1.17.0.b1` or higher. You can check your firmware version by running the following code on you device via the interactive REPL. ```python @@ -16,5 +21,5 @@ lte = LTE() lte.send_at_cmd('AT+CGSN=1') ``` -You’ll get a return string like this `\r\n+CGSN: "354347xxxxxxxxx"\r\n\r\nOK`. The value between the double quotes is your IMEI. +You'll get a return string like this `\r\n+CGSN: "354347xxxxxxxxx"\r\n\r\nOK`. The value between the double quotes is your IMEI. diff --git a/tutorials/lte/nb-iot.md b/content/tutorials/lte/nb-iot.md similarity index 85% rename from tutorials/lte/nb-iot.md rename to content/tutorials/lte/nb-iot.md index e728968..f1e1499 100644 --- a/tutorials/lte/nb-iot.md +++ b/content/tutorials/lte/nb-iot.md @@ -1,10 +1,15 @@ -# NB-IoT - +--- +title: "NB-IoT" +aliases: + - tutorials/lte/nb-iot.html + - tutorials/lte/nb-iot.md + - chapter/tutorials/lte/nb-iot +--- ## LTE class for Narrow Band IoT -{% hint style="info" %} -As shipped, Pycom modules only support CAT-M1, in order to use NB-IoT you need to flash a different firmware to the Sequans modem. Instructions for this can be found [here](firmware.md). -{% endhint %} +{{{% hint style="info" %}}} +As shipped, Pycom modules only support CAT-M1, in order to use NB-IoT you need to flash a different firmware to the Sequans modem. Instructions for this can be found [here](firmware). +{{< /hint >}} ### Current NB-IoT limitations @@ -35,7 +40,7 @@ while not lte.isconnected(): # now use socket as usual... ``` -**IMPORTANT:** Once the LTE radio is initialised, it must be de-initialised before going to deepsleep in order to ensure minimum power consumption. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network \(data or SMS received for instance\). +**IMPORTANT:** Once the LTE radio is initialised, it must be de-initialised before going to deepsleep in order to ensure minimum power consumption. This is required due to the LTE radio being powered independently and allowing use cases which require the system to be taken out from deepsleep by an event from the LTE network (data or SMS received for instance). When using the expansion board and the FiPy together, the RTS/CTS jumpers **MUST** be removed as those pins are being used by the LTE radio. Keeping those jumpers in place will lead to erratic operation and higher current consumption specially while in deepsleep. diff --git a/tutorials/pyscan.md b/content/tutorials/pyscan.md similarity index 92% rename from tutorials/pyscan.md rename to content/tutorials/pyscan.md index b77f3dc..b8c7dcf 100644 --- a/tutorials/pyscan.md +++ b/content/tutorials/pyscan.md @@ -1,5 +1,10 @@ -# Pyscan Examples - +--- +title: "Pyscan Examples" +aliases: + - tutorials/pyscan.html + - tutorials/pyscan.md + - chapter/tutorials/pyscan +--- This basic example shows how to read an NFC card and authenticate it using a pre-defined access list. ```python diff --git a/tutorials/pysense.md b/content/tutorials/pysense.md similarity index 66% rename from tutorials/pysense.md rename to content/tutorials/pysense.md index 4d67d2f..7444d10 100644 --- a/tutorials/pysense.md +++ b/content/tutorials/pysense.md @@ -1,8 +1,13 @@ -# Pysense Examples - +--- +title: "Pysense Examples" +aliases: + - tutorials/pysense.html + - tutorials/pysense.md + - chapter/tutorials/pysense +--- ## Accelerometer -This basic example shows how to read pitch and roll from the on-board accelerometer and output it in comma separated value \(CSV\) format over serial. +This basic example shows how to read pitch and roll from the on-board accelerometer and output it in comma separated value (CSV) format over serial. ```python from LIS2HH12 import LIS2HH12 @@ -17,7 +22,7 @@ while True: time.sleep_ms(100) ``` -![](../.gitbook/assets/accelerometer_visualiser%20%281%29.png) +![](/gitbook/assets/accelerometer_visualiser%20%281%29.png) If you want to visualise the data output by this script a Processing sketch is available [here](https://github.com/pycom/pycom-libraries/tree/master/examples/pytrack_pysense_accelerometer) that will show the board orientation in 3D. diff --git a/content/tutorials/pytrack.md b/content/tutorials/pytrack.md new file mode 100644 index 0000000..986caca --- /dev/null +++ b/content/tutorials/pytrack.md @@ -0,0 +1,11 @@ +--- +title: "Pytrack Examples" +aliases: + - tutorials/pytrack.html + - tutorials/pytrack.md + - chapter/tutorials/pytrack +--- +Both the Pysense and Pytrack use the same accelerometer. Please see the [Pysense Examples](pysense) to see how to use the accelerometer. + +{{% refname "pysense.md" %}} + diff --git a/tutorials/sigfox.md b/content/tutorials/sigfox.md similarity index 71% rename from tutorials/sigfox.md rename to content/tutorials/sigfox.md index 4c789cb..86dfd46 100644 --- a/tutorials/sigfox.md +++ b/content/tutorials/sigfox.md @@ -1,8 +1,13 @@ -# Sigfox Examples +--- +title: "Sigfox Examples" +aliases: + - tutorials/sigfox.html + - tutorials/sigfox.md + - chapter/tutorials/sigfox +--- +Before you start, make sure that your device was registered with [Sigfox](/gettingstarted/registration/sigfox). -Before you start, make sure that your device was registered with [Sigfox](../gettingstarted/registration/sigfox.md). - -The following tutorials demonstrate how to register and get started with the SiPy. The SiPy can be configured for operation in various countries based upon specified RCZ zones \(see the `Sigfox` class for more info\). The SiPy supports both uplink and downlink `Sigfox` messages as well as device to device communication via its FSK Mode `Sigfox`. +The following tutorials demonstrate how to register and get started with the SiPy. The SiPy can be configured for operation in various countries based upon specified RCZ zones (see the `Sigfox` class for more info). The SiPy supports both uplink and downlink `Sigfox` messages as well as device to device communication via its FSK Mode `Sigfox`. ## Disengage Sequence Number @@ -14,13 +19,13 @@ Issues with the sequence number can occur when a lot of messages are sent when o Firstly you will need to log into the [Sigfox Backend](https://backend.sigfox.com), navigate to device, and click on the Sigfox ID of the affected SiPy. -![](../.gitbook/assets/seq_dis_1-1.png) +![](/gitbook/assets/seq_dis_1-1.png) You should now see the Information page with an entry `Device Type:` followed by a link. Please follow the link -![screenshot of sigfox ID](../.gitbook/assets/seq_dis_2%20%281%29.png) +![screenshot of sigfox ID](/gitbook/assets/seq_dis_2%20%281%29.png) Finally, on this page click on `Disengage sequence number` button in the upper right corner. -![screenshot of sigfox ID](../.gitbook/assets/seq_dis_3.png) +![screenshot of sigfox ID](/gitbook/assets/seq_dis_3.png) diff --git a/datasheets/boards/README.md b/datasheets/boards/README.md deleted file mode 100644 index 997138b..0000000 --- a/datasheets/boards/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Expansion Boards and Shields - -This section contains all of the datasheets for the Pycom Expansion Boards and Shields. This includes the Expansion Board, Pytrack, Pysense and Deep Sleep Shield. - -{% page-ref page="expansion3.md" %} - -{% page-ref page="pytrack.md" %} - -{% page-ref page="pysense.md" %} - -{% page-ref page="pyscan.md" %} - -{% page-ref page="expansion2.md" %} - -{% page-ref page="deepsleep/" %} - diff --git a/datasheets/boards/expansion2.md b/datasheets/boards/expansion2.md deleted file mode 100644 index 4aee1a6..0000000 --- a/datasheets/boards/expansion2.md +++ /dev/null @@ -1,26 +0,0 @@ -# Expansion Board 2.0 - -![](../../.gitbook/assets/expansion2.png) - -## Pinout - -The pinout of the Expansion Board is available as a PDF File - -{% file src="../../.gitbook/assets/expansion2-pinout.pdf" caption="Expansion Board 2 Pinout" %} - -![](../../.gitbook/assets/expansion2-pinout-1.png) - -{% hint style="danger" %} -Be gentle when plugging/unplugging from the USB connector. Whilst the USB connector is soldered and is relatively strong, if it breaks off it can be very difficult to fix. -{% endhint %} - -## Battery Charger - -The Expansion Board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, the Expansion Board will charge the battery \(if connected\). When the `CHG` jumper is present the battery will be charged at `450mA`. If this value is too high for your application, removing the jumper lowers the charge current to `100mA`. - -## Specsheets - -The specsheet of the Expansion Board is available as a PDF File. - -{% file src="../../.gitbook/assets/expansion2-specsheet.pdf" caption="Expansion Board 2 Datasheet" %} - diff --git a/datasheets/boards/pysense.md b/datasheets/boards/pysense.md deleted file mode 100644 index 14643b4..0000000 --- a/datasheets/boards/pysense.md +++ /dev/null @@ -1,22 +0,0 @@ -# Pysense - -![](../../.gitbook/assets/pysense%20%281%29.png) - -## Pinout - -The pinout of the Pysense is available as a PDF File - -{% file src="../../.gitbook/assets/pysense-pinout.pdf" caption="Pysense Pinout" %} - -![](../../.gitbook/assets/pysense-pinout-1.png) - -## Battery Charger - -The board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, it will charge the battery \(if connected\). - -## Specsheets - -The specsheet of the Pysense is available as a PDF File. - -{% file src="../../.gitbook/assets/pysense-specsheet.pdf" caption="Pysense Datasheet" %} - diff --git a/datasheets/boards/pytrack.md b/datasheets/boards/pytrack.md deleted file mode 100644 index 3430399..0000000 --- a/datasheets/boards/pytrack.md +++ /dev/null @@ -1,22 +0,0 @@ -# Pytrack - -![](../../.gitbook/assets/pytrack%20%282%29.png) - -## Pinout - -The pinout of the Pytrack is available as a PDF File - -{% file src="../../.gitbook/assets/pytrack-pinout.pdf" caption="Pytrack Pinout" %} - -![](../../.gitbook/assets/pytrack-pinout-1.png) - -## Battery Charger - -The board features a single cell Li-Ion/Li-Po charger. When the board is being powered via the micro USB connector, it will charge the battery \(if connected\). - -## Specsheets - -The specsheet of the Pytrack is available as a PDF File. - -{% file src="../../.gitbook/assets/pytrack-specsheet-1.pdf" caption="Pytrack Datasheet" %} - diff --git a/datasheets/development/README.md b/datasheets/development/README.md deleted file mode 100644 index fb11de1..0000000 --- a/datasheets/development/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Development Modules - -This section contains all of the datasheets for the Pycom Development Devices. This includes the WiPy 2.0 and 3.0, LoPy, LoPy 4, SiPy, GPy, and FiPy. - -{% page-ref page="wipy2.md" %} - -{% page-ref page="wipy3.md" %} - -{% page-ref page="lopy.md" %} - -{% page-ref page="lopy4.md" %} - -{% page-ref page="sipy.md" %} - -{% page-ref page="gpy.md" %} - -{% page-ref page="fipy.md" %} - diff --git a/datasheets/development/fipy.md b/datasheets/development/fipy.md deleted file mode 100644 index b8d3ecf..0000000 --- a/datasheets/development/fipy.md +++ /dev/null @@ -1,60 +0,0 @@ -# FiPy - -![](../../.gitbook/assets/fipy-1.png) - -**Store**: [Buy Here](http://www.pycom.io/fipy) - -**Getting Started:** [Click Here](../../gettingstarted/connection/fipy.md) - -## Pinout - -The pinout of the FiPy is available as a PDF File - -{% file src="../../.gitbook/assets/fipy-pinout.pdf" caption="FiPy Pinout" %} - -![](../../.gitbook/assets/fipy-pinout.png) - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## Datasheet - -The datasheet of the FiPy is available as a PDF File. - -{% file src="../../.gitbook/assets/fipy-specsheet-1.pdf" caption="FiPy Datasheet" %} - -The drawing of the LTE-M antenna is available as a PDF File. - -{% file src="../../.gitbook/assets/lte-m-antenna-drawing.pdf" caption="LTE-M Antenna Drawing" %} - -## Notes - -### WiFi - -By default, upon boot the FiPy will create a WiFi access point with the SSID `fipy-wlan-XXXX`, where `XXXX` is a random 4-digit number, and the password `www.pycom.io`. - -The RF switch that selects between the on-board and external antenna is connected to `P12`, for this reason using `P12` should be avoided unless WiFi is disabled in your application. - -### Power - -The `Vin` pin on the FiPy can be supplied with a voltage ranging from `3.5v` to `5.5v`. The `3.3v` pin on the other hand is output **only**, and must not be used to feed power into the FiPy, otherwise the on-board regulator will be damaged. - -### AT Commands - -The AT commands for the Sequans Monarch modem on the FiPy are available in a PDF file. - -{% file src="../../.gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential-2.pdf" caption="AT Commands for Sequans" %} - -## Tutorials - -Tutorials on how to the FiPy module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the FiPy: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [LoRaWAN node](../../tutorials/lora/lorawan-abp.md) -* [LoRaWAN nano gateway](../../tutorials/lora/lorawan-nano-gateway.md) -* [Sigfox](../../tutorials/sigfox.md) -* [LTE CAT-M1](../../tutorials/lte/cat-m1.md) -* [NB-IoT](../../tutorials/lte/nb-iot.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/datasheets/development/gpy.md b/datasheets/development/gpy.md deleted file mode 100644 index aa09c18..0000000 --- a/datasheets/development/gpy.md +++ /dev/null @@ -1,57 +0,0 @@ -# GPy - -![](../../.gitbook/assets/gpy-1.png) - -**Store**: [Buy Here](http://www.pycom.io/gpy) - -**Getting Started:** [Click Here](../../gettingstarted/connection/gpy.md) - -## Pinout - -The pinout of the GPy is available as a PDF File - -{% file src="../../.gitbook/assets/gpy-pinout.pdf" caption="GPy Pinout" %} - -![](../../.gitbook/assets/gpy-pinout.png) - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## Datasheet - -The datasheet of the GPy is available as a PDF File. - -{% file src="../../.gitbook/assets/gpy-specsheet.pdf" caption="GPy Datasheet" %} - -The drawing of the LTE-M antenna is available as a PDF File. - -{% file src="../../.gitbook/assets/lte-m-antenna-drawing.pdf" caption="LTE-M Antenna Drawing" %} - -## Notes - -### WiFi - -By default, upon boot the GPy will create a WiFi access point with the SSID `gpy-wlan-XXXX`, where `XXXX` is a random 4-digit number, and the password `www.pycom.io`. - -The RF switch that selects between the on-board and external antenna is connected to `P12`, for this reason using `P12` should be avoided unless WiFi is disabled in your application. - -### Power - -The `Vin` pin on the GPy can be supplied with a voltage ranging from `3.5v` to `5.5v`. The `3.3v` pin on the other hand is output **only**, and must not be used to feed power into the GPy, otherwise the on-board regulator will be damaged. - -### AT Commands - -The AT commands for the Sequans Monarch modem on the GPy are available in a PDF file. - -{% file src="../../.gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential-1.pdf" caption="AT Commands for Sequans" %} - -## Tutorials - -Tutorials on how to the GPy module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the GPy: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [LTE CAT-M1](../../tutorials/lte/cat-m1.md) -* [NB-IoT](../../tutorials/lte/nb-iot.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/datasheets/development/lopy4.md b/datasheets/development/lopy4.md deleted file mode 100644 index 46bfb7d..0000000 --- a/datasheets/development/lopy4.md +++ /dev/null @@ -1,48 +0,0 @@ -# LoPy 4 - -![](../../.gitbook/assets/lopy4-1.png) - -**Store**: [Buy Here](http://www.pycom.io/lopy4) - -**Getting Started:** [Click Here](../../gettingstarted/connection/lopy4.md) - -## Pinout - -The pinout of the LoPy4 is available as a PDF File - -{% file src="../../.gitbook/assets/lopy4-pinout.pdf" caption="LoPy4 Pinout" %} - -![](../../.gitbook/assets/lopy4-pinout.png) - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## Datasheet - -The datasheet of the LoPy4 is available as a PDF File. - -{% file src="../../.gitbook/assets/lopy4-specsheet-1.pdf" caption="LoPy4 Datasheet" %} - -## Notes - -### WiFi - -By default, upon boot the LoPy4 will create a WiFi access point with the SSID `lopy4-wlan-XXXX`, where `XXXX` is a random 4-digit number, and the password `www.pycom.io`. - -The RF switch that selects between the on-board and external antenna is connected to `P12`, for this reason using `P12` should be avoided unless WiFi is disabled in your application. - -### Power - -The `Vin` pin on the LoPy4 can be supplied with a voltage ranging from `3.5v` to `5.5v`. The `3.3v` pin on the other hand is output **only**, and must not be used to feed power into the LoPy4, otherwise the on-board regulator will be damaged. - -## Tutorials - -Tutorials on how to the LoPy4 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the LoPy4: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [LoRaWAN node](../../tutorials/lora/lorawan-abp.md) -* [LoRaWAN nano gateway](../../tutorials/lora/lorawan-nano-gateway.md) -* [Sigfox](../../tutorials/sigfox.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/datasheets/introduction.md b/datasheets/introduction.md deleted file mode 100644 index d274565..0000000 --- a/datasheets/introduction.md +++ /dev/null @@ -1,46 +0,0 @@ -# Introduction - -The follow pages contain all information relating to each product, for examples: pinouts, spec sheets, relevant examples and notes. - -## Development Modules - -{% page-ref page="development/wipy2.md" %} - -{% page-ref page="development/wipy3.md" %} - -{% page-ref page="development/lopy.md" %} - -{% page-ref page="development/lopy4.md" %} - -{% page-ref page="development/sipy.md" %} - -{% page-ref page="development/gpy.md" %} - -{% page-ref page="development/fipy.md" %} - -## OEM modules - -{% page-ref page="oem/w01.md" %} - -{% page-ref page="oem/l01.md" %} - -{% page-ref page="oem/g01.md" %} - -{% page-ref page="oem/l01\_reference.md" %} - -{% page-ref page="oem/universal\_reference.md" %} - -## Expansion Boards and Shields - -{% page-ref page="boards/expansion3.md" %} - -{% page-ref page="boards/pytrack.md" %} - -{% page-ref page="boards/pysense.md" %} - -{% page-ref page="boards/pyscan.md" %} - -{% page-ref page="boards/expansion2.md" %} - -{% page-ref page="boards/deepsleep/" %} - diff --git a/datasheets/oem/README.md b/datasheets/oem/README.md deleted file mode 100644 index 5d50d8e..0000000 --- a/datasheets/oem/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# OEM Modules - -This section contains all of the datasheets for the Pycom OEM Devices. This includes the W01, L01, L04, and G01. - -{% page-ref page="w01.md" %} - -{% page-ref page="l01.md" %} - -{% page-ref page="g01.md" %} - -{% page-ref page="l01\_reference.md" %} - -{% page-ref page="universal\_reference.md" %} - diff --git a/datasheets/oem/g01.md b/datasheets/oem/g01.md deleted file mode 100644 index e7b1154..0000000 --- a/datasheets/oem/g01.md +++ /dev/null @@ -1,43 +0,0 @@ -# G01 - -![](../../.gitbook/assets/g01-1.png) - -## Pinout - -The pinout of the G01 is available as a PDF File - -{% file src="../../.gitbook/assets/g01-pinout.pdf" caption="G01 Pinout" %} - -![](../../.gitbook/assets/g01-pinout.png) - -## Specsheets - -The specsheet of the G01 is available as a PDF File. - -{% file src="../../.gitbook/assets/g01-specsheet.pdf" caption="G01 Datasheet" %} - -## Drawings - -The drawings for the G01 is available as a PDF File. - -{% file src="../../.gitbook/assets/g01-drawing.pdf" caption="G01 Drawings" %} - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## AT Commands - -The AT commands for the Sequans Monarch modem on the G01 are available in a PDF file. - -{% file src="../../.gitbook/assets/monarch\_4g-ez\_lr5110\_atcommands\_referencemanual\_rev3\_noconfidential-3.pdf" caption="AT Commands for Sequans" %} - -## Tutorials - -Tutorials on how to the G01 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the G01: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [LTE CAT-M1](../../tutorials/lte/cat-m1.md) -* [NB-IoT](../../tutorials/lte/nb-iot.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/datasheets/oem/l01.md b/datasheets/oem/l01.md deleted file mode 100644 index b05797b..0000000 --- a/datasheets/oem/l01.md +++ /dev/null @@ -1,37 +0,0 @@ -# L01 - -![](../../.gitbook/assets/l01-1.png) - -## Pinout - -The pinout of the L01 is available as a PDF File - -{% file src="../../.gitbook/assets/l01-pinout.pdf" caption="L01 Pinout" %} - -![](../../.gitbook/assets/l01-pinout.png) - -## Specsheets - -The specsheet of the L01 is available as a PDF File. - -{% file src="../../.gitbook/assets/l01-specsheet-1.pdf" caption="L01 Datasheet" %} - -## Drawings - -The drawings for the L01 is available as a PDF File. - -{% file src="../../.gitbook/assets/l01-drawing.pdf" caption="L01 Drawing" %} - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## Tutorials - -Tutorials on how to the L01 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the L01: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [LoRaWAN node](../../tutorials/lora/lorawan-abp.md) -* [LoRaWAN nano gateway](../../tutorials/lora/lorawan-nano-gateway.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/datasheets/oem/l04.md b/datasheets/oem/l04.md deleted file mode 100644 index 6327180..0000000 --- a/datasheets/oem/l04.md +++ /dev/null @@ -1,38 +0,0 @@ -# L04 - -![](../../.gitbook/assets/l04-1.png) - -## Pinout - -The pinout of the L04 is available as a PDF File - -{% file src="../../.gitbook/assets/l04-pinout.pdf" caption="L04 Pinout" %} - -![](../../.gitbook/assets/l04-pinout.png) - -## Specsheets - -The specsheet of the L04 is available as a PDF File. - -{% file src="../../.gitbook/assets/l04-specsheet.pdf" caption="L04 Datasheet" %} - -## Drawings - -The drawings for the L04 is available as a PDF File. - -{% file src="../../.gitbook/assets/l04-drawing.pdf" caption="L04 Drawings" %} - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## Tutorials - -Tutorials on how to the L04 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the L04: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [LoRaWAN node](../../tutorials/lora/lorawan-abp.md) -* [LoRaWAN nano gateway](../../tutorials/lora/lorawan-nano-gateway.md) -* [Sigfox](../../tutorials/sigfox.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/datasheets/oem/w01.md b/datasheets/oem/w01.md deleted file mode 100644 index f83cb48..0000000 --- a/datasheets/oem/w01.md +++ /dev/null @@ -1,35 +0,0 @@ -# W01 - -![](../../.gitbook/assets/w01%20%281%29.png) - -## Pinout - -The pinout of the W01 is available as a PDF File - -{% file src="../../.gitbook/assets/w01-pinout.pdf" caption="W01 Pinout" %} - -![](../../.gitbook/assets/w01-pinout.png) - -## Specsheets - -The specsheet of the W01 is available as a PDF File. - -{% file src="../../.gitbook/assets/w01-specsheet-1.pdf" caption="W01 Datasheet" %} - -## Drawings - -The drawings for the W01 is available as a PDF File. - -{% file src="../../.gitbook/assets/w01-drawing.pdf" caption="W01 Drawings" %} - -{% hint style="info" %} -Please note that the PIN assignments for UART1 \(TX1/RX1\), SPI \(CLK, MOSI, MISO\) and I2C \(SDA, SCL\) are defaults and can be changed in Software. -{% endhint %} - -## Tutorials - -Tutorials on how to the W01 module can be found in the [examples](../../tutorials/introduction.md) section of this documentation. The following tutorials might be of specific interest for the W01: - -* [WiFi connection](../../tutorials/all/wlan.md) -* [BLE](../../tutorials/all/ble.md) - diff --git a/docnotes/mesh-networks.md b/docnotes/mesh-networks.md deleted file mode 100644 index 5b76ef6..0000000 --- a/docnotes/mesh-networks.md +++ /dev/null @@ -1,4 +0,0 @@ -# Mesh Networks - -Mesh Networking is currently under development. Please click [here](../tutorials/lora/lora-mesh.md) for the documentation. Please keep in mind that this document is still only informational. - diff --git a/firmwareapi/micropython/builtin.md b/firmwareapi/micropython/builtin.md deleted file mode 100644 index 9314075..0000000 --- a/firmwareapi/micropython/builtin.md +++ /dev/null @@ -1,126 +0,0 @@ -# Builtin - -All builtin functions are described here. They are also available via [builtins](builtin.md) module. - -abs\(\) - -all\(\) - -any\(\) - -bin\(\) - -class bool - -class bytearray - -class bytes - -callable\(\) - -chr\(\) - -class method\(\) - -compile\(\) - -class complex - -class dict - -dir\(\) - -divmod\(\) - -enumerate\(\) - -eval\(\) - -exec\(\) - -filter\(\) - -class float - -class frozenset - -getattr\(\) - -globals\(\) - -hasattr\(\) - -hash\(\) - -hex\(\) - -id\(\) - -input\(\) - -class int - -isinstance\(\) - -issubclass\(\) - -iter\(\) - -len\(\) - -class list - -locals\(\) - -map\(\) - -max\(\) - -class memoryview - -min\(\) - -next\(\) - -class object - -oct\(\) - -open\(\) - -ord\(\) - -pow\(\) - -print\(\) - -property\(\) - -range\(\) - -repr\(\) - -reversed\(\) - -round\(\) - -class set - -setattr\(\) - -sorted\(\) - -staticmethod\(\) - -class str - -sum\(\) - -super\(\) - -class tuple - -type\(\) - -zip\(\) - diff --git a/firmwareapi/micropython/ujson.md b/firmwareapi/micropython/ujson.md deleted file mode 100644 index baed2e5..0000000 --- a/firmwareapi/micropython/ujson.md +++ /dev/null @@ -1,18 +0,0 @@ -# ujson - -This modules allows to convert between Python objects and the JSON data format. - -## Methods - -#### ujson.dumps\(obj\) - -Return `obj` represented as a JSON string. - -#### ujson.loads\(str\) - -Parse the JSON `str` and return an object. Raises `ValueError` if the string is not correctly formed. - -#### ujson.load\(fp\) - -Parse contents of `fp` \(a `.read()`-supporting file-like object containing a JSON document\). Raises `ValueError` if the content is not correctly formed. - diff --git a/firmwareapi/micropython/utime.md b/firmwareapi/micropython/utime.md deleted file mode 100644 index 7735c0a..0000000 --- a/firmwareapi/micropython/utime.md +++ /dev/null @@ -1,87 +0,0 @@ -# utime - -The `utime` module provides functions for getting the current time and date, measuring time intervals, and for delays. - -**Time Epoch**: Pycom’s ESP32 port uses standard for POSIX systems epoch of `1970-01-01 00:00:00 UTC`. - -## Maintaining actual calendar date/time - -This requires a Real Time Clock \(RTC\). On systems with underlying OS \(including some RTOS\), an RTC may be implicit. Setting and maintaining actual calendar time is responsibility of OS/RTOS and is done outside of MicroPython, it just uses OS API to query date/time. On baremetal ports however system time depends on `machine.RTC()` object. The current calendar time may be set using `machine.RTC().datetime(tuple)` function, and maintained by following means: - -* By a backup battery \(which may be an additional, optional component for a particular board\). -* Using networked time protocol \(requires setup by a port/user\). -* Set manually by a user on each power-up \(many boards then maintain RTC time across hard resets, though some may require setting it again in such case\). - -If actual calendar time is not maintained with a system/MicroPython RTC, functions below which require reference to current absolute time may behave not as expected. - -## Methods - -#### utime.gmtime\(\[secs\]\) - -Convert a time expressed in seconds since the Epoch \(see above\) into an 8-tuple which contains: `(year, month, mday, hour, minute, second, weekday, yearday)` If `secs` is not provided or `None`, then the current time from the RTC is used. - -* `year` includes the century \(for example 2014\). -* `month` is 1-12 -* `mday` is 1-31 -* `hour` is 0-23 -* `minute` is 0-59 -* `second` is 0-59 -* `weekday` is 0-6 for Mon-Sun -* `yearday` is 1-366 - -#### utime.localtime\(\[secs\]\) - -Like `gmtime()` but converts to local time. If `secs` is not provided or `None`, the current time from the RTC is used. - -#### utime.mktime\(\) - -This is inverse function of `localtime`. It’s argument is a full 8-tuple which expresses a time as per `localtime`. It returns an integer which is the number of seconds since `Jan 1, 2000`. - -#### utime.sleep\(seconds\) - -Sleep for the given number of `seconds`. `seconds` can be a floating-point number to sleep for a fractional number of seconds. Note that other MicroPython ports may not accept floating-point argument, for compatibility with them use `sleep_ms()` and `sleep_us()` functions. - -#### utime.sleep\_ms\(ms\) - -Delay for given number of milliseconds, should be positive or 0. - -#### utime.sleep\_us\(us\) - -Delay for given number of microseconds, should be positive or 0 - -#### utime.ticks\_ms\(\) - -Returns uptime, in milliseconds. - -#### utime.ticks\_us\(\) - -Just like `ticks_ms` above, but in microseconds. - -#### utime.ticks\_cpu\(\) - -Same as `ticks_us`, but faster. - -#### utime.ticks\_diff\(end, start\) - -Measure period between consecutive calls to `ticks_ms()`, `ticks_us()`, or `ticks_cpu()`. The value returned by these functions may wrap around at any time, so directly subtracting them is not supported. `ticks_diff()` should be used instead. "start" value should actually precede "end" value in time, or result is undefined. This function should not be used to measure arbitrarily long periods of time \(because `ticks_*()` functions wrap around and usually would have short period\). The expected usage pattern is implementing event polling with timeout: - -```python -# Wait for GPIO pin to be asserted, but at most 500us -start = time.ticks_us() -while pin.value() == 0: - if time.ticks_diff(time.ticks_us(), start) > 500: - raise TimeoutError -``` - -#### utime.time\(\) - -Returns the number of seconds, as an integer, since the Epoch, assuming that underlying RTC is set. If an RTC is not set, this function returns number of seconds since power up or reset\). If you want to develop portable MicroPython application, you should not rely on this function to provide higher than second precision. If you need higher precision, use `ticks_ms()` and `ticks_us()` functions, if you need calendar time, `localtime()` without an argument is a better choice. - -#### utime.timezone\(\[secs\]\) - -Set or get the timezone offset, in seconds. If `secs` is not provided, it returns the current value. - -{% hint style="info" %} -In MicroPython, `time.timezone` works the opposite way to Python. In [Python](https://docs.python.org/3/library/time.html#time.timezone), to get the local time, you write `local_time = utc - timezone`, while in MicroPython it is `local_time = utc + timezone`. -{% endhint %} - diff --git a/firmwareapi/micropython/uzlib.md b/firmwareapi/micropython/uzlib.md deleted file mode 100644 index d063886..0000000 --- a/firmwareapi/micropython/uzlib.md +++ /dev/null @@ -1,22 +0,0 @@ -# uzlib - -_This module implements a subset of the corresponding_ `CPython` _module, as described below. For more information, refer to the original CPython documentation:_ `zlib`. - -This module allows to decompress binary data compressed with [DEFLATE algorithm](https://en.wikipedia.org/wiki/DEFLATE) \(commonly used in zlib library and gzip archiver\). Compression is not yet implemented. - -## **Methods** - -**uzlib.decompress\(data, wbits=0, bufsize=0\)** - -Return decompressed data as bytes. wbits is DEFLATE dictionary window size used during compression \(8-15, the dictionary size is power of 2 of that value\). Additionally, if value is positive, data is assumed to be zlib stream \(with zlib header\). Otherwise, if it’s negative, it’s assumed to be raw DEFLATE stream. bufsize parameter is for compatibility with CPython and is ignored. - -**class uzlib.DecompIO\(stream, wbits=0\)** - -Create a `stream` wrapper which allows transparent decompression of compressed data in another stream. This allows to process compressed streams with data larger than available heap size. In addition to values described in `decompress()`, wbits may take values 24..31 \(16 + 8..15\), meaning that input stream has gzip header. - -{% hint style="info" %} -**Difference to CPython** - -This class is MicroPython extension. It’s included on provisional basis and may be changed considerably or removed in later versions. -{% endhint %} - diff --git a/firmwareapi/pycom/README.md b/firmwareapi/pycom/README.md deleted file mode 100644 index 25d7137..0000000 --- a/firmwareapi/pycom/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Pycom Modules - -These modules are specific to the Pycom devices and may have slightly different implementations to other variations of MicroPython \(i.e. for Non-Pycom devices\). Modules include those which support access to underlying hardware, e.g. I2C, SPI, WLAN, Bluetooth, etc. - diff --git a/firmwareapi/pycom/network/bluetooth/gatt.md b/firmwareapi/pycom/network/bluetooth/gatt.md deleted file mode 100644 index c93fee7..0000000 --- a/firmwareapi/pycom/network/bluetooth/gatt.md +++ /dev/null @@ -1,8 +0,0 @@ -# GATT - -GATT stands for the Generic Attribute Profile and it defines the way that two Bluetooth Low Energy devices communicate between each other using concepts called Services and Characteristics. GATT uses a data protocol known as the Attribute Protocol \(ATT\), which is used to store/manage Services, Characteristics and related data in a lookup table. - -GATT comes into use once a connection is established between two devices, meaning that the device will have already gone through the advertising process managed by GAP. It’s important to remember that this connection is exclusive; i.e. that only one client is connected to one server at a time. This means that the client will stop advertising once a connection has been made. This remains the case, until the connection is broken or disconnected. - -The GATT Server, which holds the ATT lookup data and service and characteristic definitions, and the GATT Client \(the phone/tablet\), which sends requests to this server. - diff --git a/gettingstarted/installation/README.md b/gettingstarted/installation/README.md deleted file mode 100644 index 918a459..0000000 --- a/gettingstarted/installation/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Software - -To get you up and running, Pycom provides a suite of tools to assist with developing and programming your Pycom Devices: - -1. [**Drivers:**](drivers.md) If you are using Microsoft Windows, you might be required to install drivers for our products to function correctly. -2. [**Pycom firmware update utility:**](firmwaretool.md) This tool automates the process of upgrading the firmware of your Pycom device. It is important that you use this tool before you attempt to use your device. Not only to ensure you have the most stable and feature packed firmware, but also to ensure all the functionality of your device is enable. E.g. this tool also activates your two year free sigfox connectivity. -3. [**Development Environment:**](pymakr.md) Pymakr is a plug-in for Atom and Visual Studio Code developed by Pycom to make development for Pycom modules super easy. It allows you to use your favourite text editor while simplifying the process of uploading code to the device. - diff --git a/gettingstarted/programming/README.md b/gettingstarted/programming/README.md deleted file mode 100644 index 2ca30f5..0000000 --- a/gettingstarted/programming/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Programming the modules - -Now that you have connected and updated your pycom module and installed all the required software on your computer, we can begin programming your Pycom module. - -If this is your first time using a Pycom module we highly recommend you read through the following pages: - -* [**Introduction to MicroPython:**](micropython.md) This page will explain what Micropython is and its relation to Python. -* [**MicroPython Examples:**](examples.md) We also recommend you browse these short MicroPython examples to familiarise yourself with its syntax. This is not meant as a comprehensive guide to MicroPython programming but rather a reference to those who already know programming. If you are new to python, or programming all together, we highly recommend searching the internet for Python tutorials. There are many very good tutorials available for free and the skills you learn will be easily transferable to our platform. -* [**Your first Pymakr project:**](first-project.md) Once you understand what MicroPython is, this guide will take you through setting up your first Pymakr project to blink the on-board RGB LED. This guide will explain the structure of a MicroPython project as well as how to upload it to your module. - -Once you are familiar with MicroPython and Pymakr, the recommended way of uploading code to your module, you can explore the pages below. These will discuss in greater detail the various mechanisms for running code on your device as well as how to recover it if something goes wrong. - -* [**REPL:**](repl/) The REPL \(Read Evaluate Print Loop\) is an interactive terminal that allows you to type in and test your code directly on the device, just like interactive python interpreter. It can be accessed via [UART](repl/serial.md) or [Telnet](repl/telnet.md). This is accessed easiest by using Pymakr but if you wish to use other tools, this page will explain how. -* [**FTP:**](ftp.md) All Pycom modules start up with a WiFi access point enabled, and a simple FTP server running on it. Once connected to the WiFi network, you can use FTP to transfer files over to your device wirelessly. This can be very useful if you do not have physical access to your device. -* [**Safe Boot:**](safeboot.md) It is possible that some code you upload to your module will prevent you accessing the REPL or FTP server, preventing you from updating your scripts. This guide will detail how to safe boot your module and how to remove the offending scripts from it. - diff --git a/layouts/.DS_Store b/layouts/.DS_Store new file mode 100644 index 0000000..09a5da0 Binary files /dev/null and b/layouts/.DS_Store differ diff --git a/layouts/404.html b/layouts/404.html new file mode 100644 index 0000000..015faec --- /dev/null +++ b/layouts/404.html @@ -0,0 +1,7 @@ +{{ define "main"}} +
+
+

404 - Page not found

+
+
+{{ end }} diff --git a/layouts/_default/404.html b/layouts/_default/404.html new file mode 100644 index 0000000..65387aa --- /dev/null +++ b/layouts/_default/404.html @@ -0,0 +1,7 @@ +{{ define "main"}} +
+
+

Go Home

+
+
+{{ end }} diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 0000000..eaa7021 --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,153 @@ + + + + + + + + {{ if .Title }}{{ .Title }} {{ else }}{{ .Site.Title }}{{ end }} + + + + + + + + + {{ partial "menu.html" . }} + {{- partial "toolbar.html" . -}} + + + + + + + + + {{- partial "menu-contextual.html" . -}} + {{- block "main" . }}{{- end }} + + + + + + + + + {{- partial "footer.html" . -}} + + + + + + + +{{- partial "alexia.html" . -}} +{{- partial "google_analitycs.html" . -}} + + diff --git a/layouts/_default/list.html b/layouts/_default/list.html new file mode 100644 index 0000000..e87d193 --- /dev/null +++ b/layouts/_default/list.html @@ -0,0 +1,19 @@ +{{ define "main" }} + + + {{ partial "breadcrumb_recursive.html" (dict "menu" .Site.Menus.main "page" . ) }} +

{{- .Title -}}

+ {{- .Content -}} + +
+
+

 

+{{ partial "prev_next.html" (dict "menu" .Site.Menus.main "page" . ) }}{{ end }} diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..bc685ea --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,13 @@ +{{ define "main" }} + + + {{ partial "breadcrumb_recursive.html" (dict "menu" .Site.Menus.main "page" . ) }} +

{{- .Title -}}

+ {{- .Content -}} +
+
+

 

+ {{ partial "prev_next.html" (dict "menu" .Site.Menus.main "page" . ) }} + + +{{ end }} diff --git a/layouts/shortcodes/hint.html b/layouts/shortcodes/hint.html new file mode 100644 index 0000000..28cb6f7 --- /dev/null +++ b/layouts/shortcodes/hint.html @@ -0,0 +1,5 @@ + + + {{ .Inner }} + + diff --git a/layouts/shortcodes/refname.html b/layouts/shortcodes/refname.html new file mode 100644 index 0000000..528feb6 --- /dev/null +++ b/layouts/shortcodes/refname.html @@ -0,0 +1,4 @@ +{{ $p := .Get 0 }} +{{ with .Page.GetPage $p }} +
{{ .Title }} +{{ end }} diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..7ac2baf --- /dev/null +++ b/log.txt @@ -0,0 +1,3630 @@ +[[menu.main]] + name = "" + url = "/README" + identifier = "README" + weight = 20 + +[[menu.main]] + name = "Pycom Products" + url = "/products" + identifier = "products" + weight = 30 + +# *** Getting Started +[[menu.main]] + name = "Getting Started" + url = "/gettingstarted/introduction" + identifier = "gettingstarted@introduction" + parent = "gettingstarted" + weight = 10 + +[[menu.main]] + name = "Hardware Setup" + url = "/gettingstarted/connection/README" + identifier = "gettingstarted@connection@README" + parent = "gettingstarted@connection" + weight = 10 + +[[menu.main]] + name = "LoPy" + url = "/gettingstarted/connection/lopy" + identifier = "gettingstarted@connection@lopy" + parent = "gettingstarted@connection" + weight = 20 + +[[menu.main]] + name = "LoPy 4" + url = "/gettingstarted/connection/lopy4" + identifier = "gettingstarted@connection@lopy4" + parent = "gettingstarted@connection" + weight = 30 + +[[menu.main]] + name = "SiPy" + url = "/gettingstarted/connection/sipy" + identifier = "gettingstarted@connection@sipy" + parent = "gettingstarted@connection" + weight = 40 + +[[menu.main]] + name = "GPy" + url = "/gettingstarted/connection/gpy" + identifier = "gettingstarted@connection@gpy" + parent = "gettingstarted@connection" + weight = 50 + +[[menu.main]] + name = "FiPy" + url = "/gettingstarted/connection/fipy" + identifier = "gettingstarted@connection@fipy" + parent = "gettingstarted@connection" + weight = 60 + +[[menu.main]] + name = "WiPy" + url = "/gettingstarted/connection/wipy" + identifier = "gettingstarted@connection@wipy" + parent = "gettingstarted@connection" + weight = 70 + +[[menu.main]] + name = "Software" + url = "/gettingstarted/installation/README" + identifier = "gettingstarted@installation@README" + parent = "gettingstarted@installation" + weight = 10 + +[[menu.main]] + name = "Drivers" + url = "/gettingstarted/installation/drivers" + identifier = "gettingstarted@installation@drivers" + parent = "gettingstarted@installation" + weight = 20 + +[[menu.main]] + name = "Updating Firmware" + url = "/gettingstarted/installation/firmwaretool" + identifier = "gettingstarted@installation@firmwaretool" + parent = "gettingstarted@installation" + weight = 30 + +[[menu.main]] + name = "Pymakr" + url = "/gettingstarted/installation/pymakr" + identifier = "gettingstarted@installation@pymakr" + parent = "gettingstarted@installation" + weight = 40 + +[[menu.main]] + name = "Programming the modules" + url = "/gettingstarted/programming/README" + identifier = "gettingstarted@programming@README" + parent = "gettingstarted@programming" + weight = 10 + +[[menu.main]] + name = "Introduction to MicroPython" + url = "/gettingstarted/programming/micropython" + identifier = "gettingstarted@programming@micropython" + parent = "gettingstarted@programming" + weight = 20 + +[[menu.main]] + name = "MicroPython Examples" + url = "/gettingstarted/programming/examples" + identifier = "gettingstarted@programming@examples" + parent = "gettingstarted@programming" + weight = 30 + +[[menu.main]] + name = "Your first Pymakr project" + url = "/gettingstarted/programming/first-project" + identifier = "gettingstarted@programming@first-project" + parent = "gettingstarted@programming" + weight = 40 + +[[menu.main]] + name = "REPL" + url = "/gettingstarted/programming/repl/README" + identifier = "gettingstarted@programming@repl@README" + parent = "gettingstarted@programming@repl" + weight = 10 + +[[menu.main]] + name = "Serial USB (UART)" + url = "/gettingstarted/programming/repl/serial" + identifier = "gettingstarted@programming@repl@serial" + parent = "gettingstarted@programming@repl" + weight = 20 + +[[menu.main]] + name = "Telnet REPL" + url = "/gettingstarted/programming/repl/telnet" + identifier = "gettingstarted@programming@repl@telnet" + parent = "gettingstarted@programming@repl" + weight = 30 + +[[menu.main]] + name = "FTP" + url = "/gettingstarted/programming/ftp" + identifier = "gettingstarted@programming@ftp" + parent = "gettingstarted@programming" + weight = 50 + +[[menu.main]] + name = "Safe boot" + url = "/gettingstarted/programming/safeboot" + identifier = "gettingstarted@programming@safeboot" + parent = "gettingstarted@programming" + weight = 60 + +[[menu.main]] + name = "Device Registration" + url = "/gettingstarted/registration/README" + identifier = "gettingstarted@registration@README" + parent = "gettingstarted@registration" + weight = 10 + +[[menu.main]] + name = "Sigfox" + url = "/gettingstarted/registration/sigfox" + identifier = "gettingstarted@registration@sigfox" + parent = "gettingstarted@registration" + weight = 20 + +[[menu.main]] + name = "Cellular" + url = "/gettingstarted/registration/cellular" + identifier = "gettingstarted@registration@cellular" + parent = "gettingstarted@registration" + weight = 30 + +[[menu.main]] + name = "LoRaWAN" + url = "/gettingstarted/registration/lora/README" + identifier = "gettingstarted@registration@lora@README" + parent = "gettingstarted@registration@lora" + weight = 10 + +[[menu.main]] + name = "The Things Network" + url = "/gettingstarted/registration/lora/ttn" + identifier = "gettingstarted@registration@lora@ttn" + parent = "gettingstarted@registration@lora" + weight = 20 + +[[menu.main]] + name = "Objenious" + url = "/gettingstarted/registration/lora/objenious" + identifier = "gettingstarted@registration@lora@objenious" + parent = "gettingstarted@registration@lora" + weight = 30 + +# *** Pymakr Plugin +[[menu.main]] + name = "Installation" + url = "/pymakr/installation/README" + identifier = "pymakr@installation@README" + parent = "pymakr@installation" + weight = 10 + +[[menu.main]] + name = "Atom" + url = "/pymakr/installation/atom" + identifier = "pymakr@installation@atom" + parent = "pymakr@installation" + weight = 20 + +[[menu.main]] + name = "Visual Studio Code" + url = "/pymakr/installation/vscode" + identifier = "pymakr@installation@vscode" + parent = "pymakr@installation" + weight = 30 + +[[menu.main]] + name = "Tools/Features" + url = "/pymakr/toolsfeatures" + identifier = "pymakr@toolsfeatures" + parent = "pymakr" + weight = 10 + +[[menu.main]] + name = "Settings" + url = "/pymakr/settings" + identifier = "pymakr@settings" + parent = "pymakr" + weight = 20 + +# *** Pytrack, Pysense, Pyscan +[[menu.main]] + name = "Pytrack, Pysense, Pyscan" + url = "/pytrackpysense/introduction" + identifier = "pytrackpysense@introduction" + parent = "pytrackpysense" + weight = 10 + +[[menu.main]] + name = "Installing Software" + url = "/pytrackpysense/installation/README" + identifier = "pytrackpysense@installation@README" + parent = "pytrackpysense@installation" + weight = 10 + +[[menu.main]] + name = "Updating Firmware" + url = "/pytrackpysense/installation/firmware" + identifier = "pytrackpysense@installation@firmware" + parent = "pytrackpysense@installation" + weight = 20 + +[[menu.main]] + name = "Installing Drivers - Windows 7" + url = "/pytrackpysense/installation/drivers" + identifier = "pytrackpysense@installation@drivers" + parent = "pytrackpysense@installation" + weight = 30 + +[[menu.main]] + name = "Installing Libraries" + url = "/pytrackpysense/installation/libraries" + identifier = "pytrackpysense@installation@libraries" + parent = "pytrackpysense@installation" + weight = 40 + +[[menu.main]] + name = "API Reference" + url = "/pytrackpysense/apireference/README" + identifier = "pytrackpysense@apireference@README" + parent = "pytrackpysense@apireference" + weight = 10 + +[[menu.main]] + name = "Pytrack" + url = "/pytrackpysense/apireference/pytrack" + identifier = "pytrackpysense@apireference@pytrack" + parent = "pytrackpysense@apireference" + weight = 20 + +[[menu.main]] + name = "Pysense" + url = "/pytrackpysense/apireference/pysense" + identifier = "pytrackpysense@apireference@pysense" + parent = "pytrackpysense@apireference" + weight = 30 + +[[menu.main]] + name = "Pyscan" + url = "/pytrackpysense/apireference/pyscan" + identifier = "pytrackpysense@apireference@pyscan" + parent = "pytrackpysense@apireference" + weight = 40 + +[[menu.main]] + name = "Sleep" + url = "/pytrackpysense/apireference/sleep" + identifier = "pytrackpysense@apireference@sleep" + parent = "pytrackpysense@apireference" + weight = 50 + +# *** Tutorials & Examples +[[menu.main]] + name = "Tutorials & Examples" + url = "/tutorials/introduction" + identifier = "tutorials@introduction" + parent = "tutorials" + weight = 10 + +[[menu.main]] + name = "All Pycom Device Examples" + url = "/tutorials/all/README" + identifier = "tutorials@all@README" + parent = "tutorials@all" + weight = 10 + +[[menu.main]] + name = "REPL" + url = "/tutorials/all/repl" + identifier = "tutorials@all@repl" + parent = "tutorials@all" + weight = 20 + +[[menu.main]] + name = "WLAN" + url = "/tutorials/all/wlan" + identifier = "tutorials@all@wlan" + parent = "tutorials@all" + weight = 30 + +[[menu.main]] + name = "Bluetooth" + url = "/tutorials/all/ble" + identifier = "tutorials@all@ble" + parent = "tutorials@all" + weight = 40 + +[[menu.main]] + name = "HTTPS" + url = "/tutorials/all/https" + identifier = "tutorials@all@https" + parent = "tutorials@all" + weight = 50 + +[[menu.main]] + name = "MQTT" + url = "/tutorials/all/mqtt" + identifier = "tutorials@all@mqtt" + parent = "tutorials@all" + weight = 60 + +[[menu.main]] + name = "AWS" + url = "/tutorials/all/aws" + identifier = "tutorials@all@aws" + parent = "tutorials@all" + weight = 70 + +[[menu.main]] + name = "ADC" + url = "/tutorials/all/adc" + identifier = "tutorials@all@adc" + parent = "tutorials@all" + weight = 80 + +[[menu.main]] + name = "I2C" + url = "/tutorials/all/i2c" + identifier = "tutorials@all@i2c" + parent = "tutorials@all" + weight = 90 + +[[menu.main]] + name = "Onewire Driver" + url = "/tutorials/all/owd" + identifier = "tutorials@all@owd" + parent = "tutorials@all" + weight = 100 + +[[menu.main]] + name = "Threading" + url = "/tutorials/all/threading" + identifier = "tutorials@all@threading" + parent = "tutorials@all" + weight = 110 + +[[menu.main]] + name = "RGB LED" + url = "/tutorials/all/rgbled" + identifier = "tutorials@all@rgbled" + parent = "tutorials@all" + weight = 120 + +[[menu.main]] + name = "Timers" + url = "/tutorials/all/timers" + identifier = "tutorials@all@timers" + parent = "tutorials@all" + weight = 130 + +[[menu.main]] + name = "PIR Sensor" + url = "/tutorials/all/pir" + identifier = "tutorials@all@pir" + parent = "tutorials@all" + weight = 140 + +[[menu.main]] + name = "Modbus" + url = "/tutorials/all/modbus" + identifier = "tutorials@all@modbus" + parent = "tutorials@all" + weight = 150 + +[[menu.main]] + name = "OTA update" + url = "/tutorials/all/ota" + identifier = "tutorials@all@ota" + parent = "tutorials@all" + weight = 160 + +[[menu.main]] + name = "RMT" + url = "/tutorials/all/rmt" + identifier = "tutorials@all@rmt" + parent = "tutorials@all" + weight = 170 + +[[menu.main]] + name = "Socket" + url = "/tutorials/all/socket" + identifier = "tutorials@all@socket" + parent = "tutorials@all" + weight = 180 + +[[menu.main]] + name = "Touch" + url = "/tutorials/all/touch" + identifier = "tutorials@all@touch" + parent = "tutorials@all" + weight = 190 + +[[menu.main]] + name = "LoRa Examples" + url = "/tutorials/lora/README" + identifier = "tutorials@lora@README" + parent = "tutorials@lora" + weight = 10 + +[[menu.main]] + name = "LoRa-MAC (Raw LoRa)" + url = "/tutorials/lora/lora-mac" + identifier = "tutorials@lora@lora-mac" + parent = "tutorials@lora" + weight = 20 + +[[menu.main]] + name = "LoRaWAN with OTAA" + url = "/tutorials/lora/lorawan-otaa" + identifier = "tutorials@lora@lorawan-otaa" + parent = "tutorials@lora" + weight = 30 + +[[menu.main]] + name = "LoRaWAN with ABP" + url = "/tutorials/lora/lorawan-abp" + identifier = "tutorials@lora@lorawan-abp" + parent = "tutorials@lora" + weight = 40 + +[[menu.main]] + name = "LoRa-MAC Nano-Gateway" + url = "/tutorials/lora/lora-mac-nano-gateway" + identifier = "tutorials@lora@lora-mac-nano-gateway" + parent = "tutorials@lora" + weight = 50 + +[[menu.main]] + name = "LoPy to LoPy" + url = "/tutorials/lora/module-module" + identifier = "tutorials@lora@module-module" + parent = "tutorials@lora" + weight = 60 + +[[menu.main]] + name = "LoRaWAN Nano-Gateway" + url = "/tutorials/lora/lorawan-nano-gateway" + identifier = "tutorials@lora@lorawan-nano-gateway" + parent = "tutorials@lora" + weight = 70 + +[[menu.main]] + name = "RN2483 to LoPy" + url = "/tutorials/lora/rn2483-to-lopy" + identifier = "tutorials@lora@rn2483-to-lopy" + parent = "tutorials@lora" + weight = 80 + +[[menu.main]] + name = "LoRa Mesh" + url = "/tutorials/lora/lora-mesh" + identifier = "tutorials@lora@lora-mesh" + parent = "tutorials@lora" + weight = 90 + +[[menu.main]] + name = "PyMesh Border Router" + url = "/tutorials/lora/pymesh-br" + identifier = "tutorials@lora@pymesh-br" + parent = "tutorials@lora" + weight = 100 + +[[menu.main]] + name = "Sigfox Examples" + url = "/tutorials/sigfox" + identifier = "tutorials@sigfox" + parent = "tutorials" + weight = 20 + +[[menu.main]] + name = "LTE Examples" + url = "/tutorials/lte/README" + identifier = "tutorials@lte@README" + parent = "tutorials@lte" + weight = 10 + +[[menu.main]] + name = "CAT-M1" + url = "/tutorials/lte/cat-m1" + identifier = "tutorials@lte@cat-m1" + parent = "tutorials@lte" + weight = 20 + +[[menu.main]] + name = "NB-IoT" + url = "/tutorials/lte/nb-iot" + identifier = "tutorials@lte@nb-iot" + parent = "tutorials@lte" + weight = 30 + +[[menu.main]] + name = "Module IMEI" + url = "/tutorials/lte/imei" + identifier = "tutorials@lte@imei" + parent = "tutorials@lte" + weight = 40 + +[[menu.main]] + name = "Modem Firmware Update" + url = "/tutorials/lte/firmware" + identifier = "tutorials@lte@firmware" + parent = "tutorials@lte" + weight = 50 + +[[menu.main]] + name = "Pytrack Examples" + url = "/tutorials/pytrack" + identifier = "tutorials@pytrack" + parent = "tutorials" + weight = 30 + +[[menu.main]] + name = "Pysense Examples" + url = "/tutorials/pysense" + identifier = "tutorials@pysense" + parent = "tutorials" + weight = 40 + +[[menu.main]] + name = "Pyscan Examples" + url = "/tutorials/pyscan" + identifier = "tutorials@pyscan" + parent = "tutorials" + weight = 50 + +# *** Firmware & API Reference +[[menu.main]] + name = "Firmware & API Reference" + url = "/firmwareapi/introduction" + identifier = "firmwareapi@introduction" + parent = "firmwareapi" + weight = 10 + +[[menu.main]] + name = "Pycom Modules" + url = "/firmwareapi/pycom/README" + identifier = "firmwareapi@pycom@README" + parent = "firmwareapi@pycom" + weight = 10 + +[[menu.main]] + name = "machine" + url = "/firmwareapi/pycom/machine/README" + identifier = "firmwareapi@pycom@machine@README" + parent = "firmwareapi@pycom@machine" + weight = 10 + +[[menu.main]] + name = "ADC" + url = "/firmwareapi/pycom/machine/adc" + identifier = "firmwareapi@pycom@machine@adc" + parent = "firmwareapi@pycom@machine" + weight = 20 + +[[menu.main]] + name = "DAC" + url = "/firmwareapi/pycom/machine/dac" + identifier = "firmwareapi@pycom@machine@dac" + parent = "firmwareapi@pycom@machine" + weight = 30 + +[[menu.main]] + name = "I2C" + url = "/firmwareapi/pycom/machine/i2c" + identifier = "firmwareapi@pycom@machine@i2c" + parent = "firmwareapi@pycom@machine" + weight = 40 + +[[menu.main]] + name = "Pin" + url = "/firmwareapi/pycom/machine/pin" + identifier = "firmwareapi@pycom@machine@pin" + parent = "firmwareapi@pycom@machine" + weight = 50 + +[[menu.main]] + name = "PWM" + url = "/firmwareapi/pycom/machine/pwm" + identifier = "firmwareapi@pycom@machine@pwm" + parent = "firmwareapi@pycom@machine" + weight = 60 + +[[menu.main]] + name = "RTC" + url = "/firmwareapi/pycom/machine/rtc" + identifier = "firmwareapi@pycom@machine@rtc" + parent = "firmwareapi@pycom@machine" + weight = 70 + +[[menu.main]] + name = "SPI" + url = "/firmwareapi/pycom/machine/spi" + identifier = "firmwareapi@pycom@machine@spi" + parent = "firmwareapi@pycom@machine" + weight = 80 + +[[menu.main]] + name = "UART" + url = "/firmwareapi/pycom/machine/uart" + identifier = "firmwareapi@pycom@machine@uart" + parent = "firmwareapi@pycom@machine" + weight = 90 + +[[menu.main]] + name = "WDT" + url = "/firmwareapi/pycom/machine/wdt" + identifier = "firmwareapi@pycom@machine@wdt" + parent = "firmwareapi@pycom@machine" + weight = 100 + +[[menu.main]] + name = "Timer" + url = "/firmwareapi/pycom/machine/timer" + identifier = "firmwareapi@pycom@machine@timer" + parent = "firmwareapi@pycom@machine" + weight = 110 + +[[menu.main]] + name = "SD" + url = "/firmwareapi/pycom/machine/sd" + identifier = "firmwareapi@pycom@machine@sd" + parent = "firmwareapi@pycom@machine" + weight = 120 + +[[menu.main]] + name = "CAN" + url = "/firmwareapi/pycom/machine/can" + identifier = "firmwareapi@pycom@machine@can" + parent = "firmwareapi@pycom@machine" + weight = 130 + +[[menu.main]] + name = "RMT" + url = "/firmwareapi/pycom/machine/rmt" + identifier = "firmwareapi@pycom@machine@rmt" + parent = "firmwareapi@pycom@machine" + weight = 140 + +[[menu.main]] + name = "network" + url = "/firmwareapi/pycom/network/README" + identifier = "firmwareapi@pycom@network@README" + parent = "firmwareapi@pycom@network" + weight = 10 + +[[menu.main]] + name = "WLAN" + url = "/firmwareapi/pycom/network/wlan" + identifier = "firmwareapi@pycom@network@wlan" + parent = "firmwareapi@pycom@network" + weight = 20 + +[[menu.main]] + name = "Server" + url = "/firmwareapi/pycom/network/server" + identifier = "firmwareapi@pycom@network@server" + parent = "firmwareapi@pycom@network" + weight = 30 + +[[menu.main]] + name = "Bluetooth" + url = "/firmwareapi/pycom/network/bluetooth/README" + identifier = "firmwareapi@pycom@network@bluetooth@README" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 10 + +[[menu.main]] + name = "GATT" + url = "/firmwareapi/pycom/network/bluetooth/gatt" + identifier = "firmwareapi@pycom@network@bluetooth@gatt" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 20 + +[[menu.main]] + name = "GATTCConnection" + url = "/firmwareapi/pycom/network/bluetooth/gattcconnection" + identifier = "firmwareapi@pycom@network@bluetooth@gattcconnection" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 30 + +[[menu.main]] + name = "GATTCService" + url = "/firmwareapi/pycom/network/bluetooth/gattccservice" + identifier = "firmwareapi@pycom@network@bluetooth@gattccservice" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 40 + +[[menu.main]] + name = "GATTCCharacteristic" + url = "/firmwareapi/pycom/network/bluetooth/gattccharacteristic" + identifier = "firmwareapi@pycom@network@bluetooth@gattccharacteristic" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 50 + +[[menu.main]] + name = "GATTSService" + url = "/firmwareapi/pycom/network/bluetooth/gattsservice" + identifier = "firmwareapi@pycom@network@bluetooth@gattsservice" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 60 + +[[menu.main]] + name = "GATTSCharacteristic" + url = "/firmwareapi/pycom/network/bluetooth/gattscharacteristic" + identifier = "firmwareapi@pycom@network@bluetooth@gattscharacteristic" + parent = "firmwareapi@pycom@network@bluetooth" + weight = 70 + +[[menu.main]] + name = "LoRa" + url = "/firmwareapi/pycom/network/lora/README" + identifier = "firmwareapi@pycom@network@lora@README" + parent = "firmwareapi@pycom@network@lora" + weight = 10 + +[[menu.main]] + name = "Pymesh" + url = "/firmwareapi/pycom/network/lora/pymesh" + identifier = "firmwareapi@pycom@network@lora@pymesh" + parent = "firmwareapi@pycom@network@lora" + weight = 20 + +[[menu.main]] + name = "Sigfox" + url = "/firmwareapi/pycom/network/sigfox" + identifier = "firmwareapi@pycom@network@sigfox" + parent = "firmwareapi@pycom@network" + weight = 40 + +[[menu.main]] + name = "LTE" + url = "/firmwareapi/pycom/network/lte" + identifier = "firmwareapi@pycom@network@lte" + parent = "firmwareapi@pycom@network" + weight = 50 + +[[menu.main]] + name = "AES" + url = "/firmwareapi/pycom/aes" + identifier = "firmwareapi@pycom@aes" + parent = "firmwareapi@pycom" + weight = 20 + +[[menu.main]] + name = "pycom" + url = "/firmwareapi/pycom/pycom" + identifier = "firmwareapi@pycom@pycom" + parent = "firmwareapi@pycom" + weight = 30 + +[[menu.main]] + name = "MicroPython Modules" + url = "/firmwareapi/micropython/README" + identifier = "firmwareapi@micropython@README" + parent = "firmwareapi@micropython" + weight = 10 + +[[menu.main]] + name = "micropython" + url = "/firmwareapi/micropython/micropython" + identifier = "firmwareapi@micropython@micropython" + parent = "firmwareapi@micropython" + weight = 20 + +[[menu.main]] + name = "uctypes" + url = "/firmwareapi/micropython/uctypes" + identifier = "firmwareapi@micropython@uctypes" + parent = "firmwareapi@micropython" + weight = 30 + +[[menu.main]] + name = "sys" + url = "/firmwareapi/micropython/sys" + identifier = "firmwareapi@micropython@sys" + parent = "firmwareapi@micropython" + weight = 40 + +[[menu.main]] + name = "uos" + url = "/firmwareapi/micropython/uos" + identifier = "firmwareapi@micropython@uos" + parent = "firmwareapi@micropython" + weight = 50 + +[[menu.main]] + name = "array" + url = "/firmwareapi/micropython/array" + identifier = "firmwareapi@micropython@array" + parent = "firmwareapi@micropython" + weight = 60 + +[[menu.main]] + name = "cmath" + url = "/firmwareapi/micropython/cmath" + identifier = "firmwareapi@micropython@cmath" + parent = "firmwareapi@micropython" + weight = 70 + +[[menu.main]] + name = "math" + url = "/firmwareapi/micropython/math" + identifier = "firmwareapi@micropython@math" + parent = "firmwareapi@micropython" + weight = 80 + +[[menu.main]] + name = "gc" + url = "/firmwareapi/micropython/gc" + identifier = "firmwareapi@micropython@gc" + parent = "firmwareapi@micropython" + weight = 90 + +[[menu.main]] + name = "ubinascii" + url = "/firmwareapi/micropython/ubinascii" + identifier = "firmwareapi@micropython@ubinascii" + parent = "firmwareapi@micropython" + weight = 100 + +[[menu.main]] + name = "ujson" + url = "/firmwareapi/micropython/ujson" + identifier = "firmwareapi@micropython@ujson" + parent = "firmwareapi@micropython" + weight = 110 + +[[menu.main]] + name = "ure" + url = "/firmwareapi/micropython/ure" + identifier = "firmwareapi@micropython@ure" + parent = "firmwareapi@micropython" + weight = 120 + +[[menu.main]] + name = "usocket" + url = "/firmwareapi/micropython/usocket" + identifier = "firmwareapi@micropython@usocket" + parent = "firmwareapi@micropython" + weight = 130 + +[[menu.main]] + name = "select" + url = "/firmwareapi/micropython/select" + identifier = "firmwareapi@micropython@select" + parent = "firmwareapi@micropython" + weight = 140 + +[[menu.main]] + name = "utime" + url = "/firmwareapi/micropython/utime" + identifier = "firmwareapi@micropython@utime" + parent = "firmwareapi@micropython" + weight = 150 + +[[menu.main]] + name = "uhashlib" + url = "/firmwareapi/micropython/uhashlib" + identifier = "firmwareapi@micropython@uhashlib" + parent = "firmwareapi@micropython" + weight = 160 + +[[menu.main]] + name = "ussl" + url = "/firmwareapi/micropython/ussl" + identifier = "firmwareapi@micropython@ussl" + parent = "firmwareapi@micropython" + weight = 170 + +[[menu.main]] + name = "ucrypto" + url = "/firmwareapi/micropython/ucrypto" + identifier = "firmwareapi@micropython@ucrypto" + parent = "firmwareapi@micropython" + weight = 180 + +[[menu.main]] + name = "ustruct" + url = "/firmwareapi/micropython/ustruct/README" + identifier = "firmwareapi@micropython@ustruct@README" + parent = "firmwareapi@micropython@ustruct" + weight = 10 + +[[menu.main]] + name = "uzlib" + url = "/firmwareapi/micropython/ustruct/uzlib" + identifier = "firmwareapi@micropython@ustruct@uzlib" + parent = "firmwareapi@micropython@ustruct" + weight = 20 + +[[menu.main]] + name = "_thread" + url = "/firmwareapi/micropython/_thread" + identifier = "firmwareapi@micropython@_thread" + parent = "firmwareapi@micropython" + weight = 190 + +[[menu.main]] + name = "Builtin" + url = "/firmwareapi/micropython/builtin" + identifier = "firmwareapi@micropython@builtin" + parent = "firmwareapi@micropython" + weight = 200 + +[[menu.main]] + name = "Notes" + url = "/firmwareapi/notes" + identifier = "firmwareapi@notes" + parent = "firmwareapi" + weight = 20 + +# *** Product Info, Datasheets +[[menu.main]] + name = "Product Info, Datasheets" + url = "/datasheets/introduction" + identifier = "datasheets@introduction" + parent = "datasheets" + weight = 10 + +[[menu.main]] + name = "Development Modules" + url = "/datasheets/development/README" + identifier = "datasheets@development@README" + parent = "datasheets@development" + weight = 10 + +[[menu.main]] + name = "WiPy 2.0" + url = "/datasheets/development/wipy2" + identifier = "datasheets@development@wipy2" + parent = "datasheets@development" + weight = 20 + +[[menu.main]] + name = "WiPy 3.0" + url = "/datasheets/development/wipy3" + identifier = "datasheets@development@wipy3" + parent = "datasheets@development" + weight = 30 + +[[menu.main]] + name = "LoPy" + url = "/datasheets/development/lopy" + identifier = "datasheets@development@lopy" + parent = "datasheets@development" + weight = 40 + +[[menu.main]] + name = "LoPy 4" + url = "/datasheets/development/lopy4" + identifier = "datasheets@development@lopy4" + parent = "datasheets@development" + weight = 50 + +[[menu.main]] + name = "SiPy" + url = "/datasheets/development/sipy" + identifier = "datasheets@development@sipy" + parent = "datasheets@development" + weight = 60 + +[[menu.main]] + name = "GPy" + url = "/datasheets/development/gpy" + identifier = "datasheets@development@gpy" + parent = "datasheets@development" + weight = 70 + +[[menu.main]] + name = "FiPy" + url = "/datasheets/development/fipy" + identifier = "datasheets@development@fipy" + parent = "datasheets@development" + weight = 80 + +[[menu.main]] + name = "OEM Modules" + url = "/datasheets/oem/README" + identifier = "datasheets@oem@README" + parent = "datasheets@oem" + weight = 10 + +[[menu.main]] + name = "W01" + url = "/datasheets/oem/w01" + identifier = "datasheets@oem@w01" + parent = "datasheets@oem" + weight = 20 + +[[menu.main]] + name = "L01" + url = "/datasheets/oem/l01" + identifier = "datasheets@oem@l01" + parent = "datasheets@oem" + weight = 30 + +[[menu.main]] + name = "L04" + url = "/datasheets/oem/l04" + identifier = "datasheets@oem@l04" + parent = "datasheets@oem" + weight = 40 + +[[menu.main]] + name = "G01" + url = "/datasheets/oem/g01" + identifier = "datasheets@oem@g01" + parent = "datasheets@oem" + weight = 50 + +[[menu.main]] + name = "L01 OEM Baseboard Reference" + url = "/datasheets/oem/l01_reference" + identifier = "datasheets@oem@l01_reference" + parent = "datasheets@oem" + weight = 60 + +[[menu.main]] + name = "Universal OEM Baseboard Reference" + url = "/datasheets/oem/universal_reference" + identifier = "datasheets@oem@universal_reference" + parent = "datasheets@oem" + weight = 70 + +[[menu.main]] + name = "Expansion Boards and Shields" + url = "/datasheets/boards/README" + identifier = "datasheets@boards@README" + parent = "datasheets@boards" + weight = 10 + +[[menu.main]] + name = "Expansion Board 3.0" + url = "/datasheets/boards/expansion3" + identifier = "datasheets@boards@expansion3" + parent = "datasheets@boards" + weight = 20 + +[[menu.main]] + name = "Pytrack" + url = "/datasheets/boards/pytrack" + identifier = "datasheets@boards@pytrack" + parent = "datasheets@boards" + weight = 30 + +[[menu.main]] + name = "Pysense" + url = "/datasheets/boards/pysense" + identifier = "datasheets@boards@pysense" + parent = "datasheets@boards" + weight = 40 + +[[menu.main]] + name = "Pyscan" + url = "/datasheets/boards/pyscan" + identifier = "datasheets@boards@pyscan" + parent = "datasheets@boards" + weight = 50 + +[[menu.main]] + name = "Expansion Board 2.0" + url = "/datasheets/boards/expansion2" + identifier = "datasheets@boards@expansion2" + parent = "datasheets@boards" + weight = 60 + +[[menu.main]] + name = "Deep Sleep Shield" + url = "/datasheets/boards/deepsleep/README" + identifier = "datasheets@boards@deepsleep@README" + parent = "datasheets@boards@deepsleep" + weight = 10 + +[[menu.main]] + name = "Deep Sleep API" + url = "/datasheets/boards/deepsleep/api" + identifier = "datasheets@boards@deepsleep@api" + parent = "datasheets@boards@deepsleep" + weight = 20 + +[[menu.main]] + name = "Notes" + url = "/datasheets/notes" + identifier = "datasheets@notes" + parent = "datasheets" + weight = 20 + +# *** Pybytes +[[menu.main]] + name = "Pybytes" + url = "/pybytes/introduction" + identifier = "pybytes@introduction" + parent = "pybytes" + weight = 10 + +[[menu.main]] + name = "Getting Started with Pybytes" + url = "/pybytes/getstarted" + identifier = "pybytes@getstarted" + parent = "pybytes" + weight = 20 + +[[menu.main]] + name = "Add a device to Pybytes" + url = "/pybytes/connect/README" + identifier = "pybytes@connect@README" + parent = "pybytes@connect" + weight = 10 + +[[menu.main]] + name = "Connect to Pybytes: Quick Add" + url = "/pybytes/connect/quick" + identifier = "pybytes@connect@quick" + parent = "pybytes@connect" + weight = 20 + +[[menu.main]] + name = "Connect to Pybytes: Flash Pybytes library manually" + url = "/pybytes/connect/flash" + identifier = "pybytes@connect@flash" + parent = "pybytes@connect" + weight = 30 + +[[menu.main]] + name = "Add Sigfox device" + url = "/pybytes/connect/sigfox/README" + identifier = "pybytes@connect@sigfox@README" + parent = "pybytes@connect@sigfox" + weight = 10 + +[[menu.main]] + name = "DevKit contract" + url = "/pybytes/connect/sigfox/devkit" + identifier = "pybytes@connect@sigfox@devkit" + parent = "pybytes@connect@sigfox" + weight = 20 + +[[menu.main]] + name = "Custom contract" + url = "/pybytes/connect/sigfox/custom" + identifier = "pybytes@connect@sigfox@custom" + parent = "pybytes@connect@sigfox" + weight = 30 + +[[menu.main]] + name = "Visualise data from your device" + url = "/pybytes/dashboard" + identifier = "pybytes@dashboard" + parent = "pybytes" + weight = 30 + +[[menu.main]] + name = "Integrations" + url = "/pybytes/integrations/README" + identifier = "pybytes@integrations@README" + parent = "pybytes@integrations" + weight = 10 + +[[menu.main]] + name = "Amazon IoT" + url = "/pybytes/integrations/amazon-iot" + identifier = "pybytes@integrations@amazon-iot" + parent = "pybytes@integrations" + weight = 20 + +# *** Documentation Notes +[[menu.main]] + name = "Documentation Notes" + url = "/docnotes/introduction" + identifier = "docnotes@introduction" + parent = "docnotes" + weight = 10 + +[[menu.main]] + name = "Syntax" + url = "/docnotes/syntax" + identifier = "docnotes@syntax" + parent = "docnotes" + weight = 20 + +[[menu.main]] + name = "REPL vs Scripts" + url = "/docnotes/replscript" + identifier = "docnotes@replscript" + parent = "docnotes" + weight = 30 + +[[menu.main]] + name = "Mesh Networks" + url = "/docnotes/mesh-networks" + identifier = "docnotes@mesh-networks" + parent = "docnotes" + weight = 40 + +# *** Advanced Topics +[[menu.main]] + name = "Firmware Downgrade" + url = "/advance/downgrade" + identifier = "advance@downgrade" + parent = "advance" + weight = 10 + +[[menu.main]] + name = "CLI Updater" + url = "/advance/cli" + identifier = "advance@cli" + parent = "advance" + weight = 20 + +[[menu.main]] + name = "SecureBoot and Encryption" + url = "/advance/encryption" + identifier = "advance@encryption" + parent = "advance" + weight = 30 + +[[menu.main]] + name = "License" + url = "/advance/license" + identifier = "advance@license" + parent = "advance" + weight = 40 + +# *** Have a question? +[[menu.main]] + name = "Ask on the Forum" + url = "/https://forum.pycom.io" + identifier = "https:@@forum.pycom.io" + parent = "https:@" + weight = 10 + +content/SUMMARY.md +title not found for content/SUMMARY.md +no front matter in file +--- +title: "" +aliases: + - SUMMARY.html + - SUMMARY.md +--- + +content/README.md +no front matter in file +--- +title: "Introduction" +aliases: +--- + +compare ./products content/products +content/products.md +no front matter in file +--- +title: "Pycom Products" +aliases: + - products.html + - products.md + - chapter/products +--- + +content/_index.md +no front matter in file +--- +title: "Introduction" +aliases: +--- + +compare ./pymakr/settings content/pymakr/settings +content/pymakr/settings.md +no front matter in file +--- +title: "Settings" +aliases: + - pymakr/settings.html + - pymakr/settings.md + - chapter/pymakr/settings +--- + +compare ./pymakr/toolsfeatures content/pymakr/toolsfeatures +content/pymakr/toolsfeatures.md +no front matter in file +--- +title: "Tools/Features" +aliases: + - pymakr/toolsfeatures.html + - pymakr/toolsfeatures.md + - chapter/pymakr/toolsfeatures +--- + +compare ./pymakr/installation/atom content/pymakr/installation/atom +content/pymakr/installation/atom.md +no front matter in file +--- +title: "Atom" +aliases: + - pymakr/installation/atom.html + - pymakr/installation/atom.md + - chapter/pymakr/installation/atom +--- + +compare ./pymakr/installation/README content/pymakr/installation/README +content/pymakr/installation/README.md +no front matter in file +--- +title: "Installation" +aliases: + - chapter/pymakr/installation +--- + +compare ./pymakr/installation/vscode content/pymakr/installation/vscode +content/pymakr/installation/vscode.md +no front matter in file +--- +title: "Visual Studio Code" +aliases: + - pymakr/installation/vscode.html + - pymakr/installation/vscode.md + - chapter/pymakr/installation/vscode +--- + +content/pymakr/installation/_index.md +no front matter in file +--- +title: "Installation" +aliases: +--- + +compare ./datasheets/introduction content/datasheets/introduction +compare ./datasheets/introduction content/datasheets/introduction +content/datasheets/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - datasheets/introduction.html + - datasheets/introduction.md + - product-info + - chapter/datasheets +--- + +compare ./datasheets/notes content/datasheets/notes +compare ./datasheets/notes content/datasheets/notes +content/datasheets/notes.md +no front matter in file +--- +title: "Notes" +aliases: + - datasheets/notes.html + - datasheets/notes.md + - product-info/notes + - chapter/datasheets/notes +--- + +content/datasheets/_index.md +title not found for content/datasheets/README.md +no front matter in file +--- +title: "" +aliases: +--- + +compare ./datasheets/development/sipy content/datasheets/development/sipy +compare ./datasheets/development/sipy content/datasheets/development/sipy +content/datasheets/development/sipy.md +no front matter in file +--- +title: "SiPy" +aliases: + - datasheets/development/sipy.html + - datasheets/development/sipy.md + - product-info/development/sipy + - chapter/datasheets/development/sipy +--- + +compare ./datasheets/development/lopy4 content/datasheets/development/lopy4 +compare ./datasheets/development/lopy4 content/datasheets/development/lopy4 +content/datasheets/development/lopy4.md +no front matter in file +--- +title: "LoPy 4" +aliases: + - datasheets/development/lopy4.html + - datasheets/development/lopy4.md + - product-info/development/lopy4 + - chapter/datasheets/development/lopy4 +--- + +compare ./datasheets/development/wipy3 content/datasheets/development/wipy3 +compare ./datasheets/development/wipy3 content/datasheets/development/wipy3 +content/datasheets/development/wipy3.md +no front matter in file +--- +title: "WiPy 3.0" +aliases: + - datasheets/development/wipy3.html + - datasheets/development/wipy3.md + - product-info/development/wipy3 + - chapter/datasheets/development/wipy3 +--- + +compare ./datasheets/development/wipy2 content/datasheets/development/wipy2 +compare ./datasheets/development/wipy2 content/datasheets/development/wipy2 +content/datasheets/development/wipy2.md +no front matter in file +--- +title: "WiPy 2.0" +aliases: + - datasheets/development/wipy2.html + - datasheets/development/wipy2.md + - product-info/development/wipy2 + - chapter/datasheets/development/wipy2 +--- + +compare ./datasheets/development/lopy content/datasheets/development/lopy +compare ./datasheets/development/lopy content/datasheets/development/lopy +content/datasheets/development/lopy.md +no front matter in file +--- +title: "LoPy" +aliases: + - datasheets/development/lopy.html + - datasheets/development/lopy.md + - product-info/development/lopy + - chapter/datasheets/development/lopy +--- + +compare ./datasheets/development/README content/datasheets/development/README +compare ./datasheets/development/README content/datasheets/development/README +content/datasheets/development/README.md +no front matter in file +--- +title: "Development Modules" +aliases: + - product-info/development + - chapter/datasheets/development +--- + +compare ./datasheets/development/gpy content/datasheets/development/gpy +compare ./datasheets/development/gpy content/datasheets/development/gpy +content/datasheets/development/gpy.md +no front matter in file +--- +title: "GPy" +aliases: + - datasheets/development/gpy.html + - datasheets/development/gpy.md + - product-info/development/gpy + - chapter/datasheets/development/gpy +--- + +content/datasheets/development/_index.md +no front matter in file +--- +title: "Development Modules" +aliases: +--- + +compare ./datasheets/development/fipy content/datasheets/development/fipy +compare ./datasheets/development/fipy content/datasheets/development/fipy +content/datasheets/development/fipy.md +no front matter in file +--- +title: "FiPy" +aliases: + - datasheets/development/fipy.html + - datasheets/development/fipy.md + - product-info/development/fipy + - chapter/datasheets/development/fipy +--- + +compare ./datasheets/oem/g01 content/datasheets/oem/g01 +compare ./datasheets/oem/g01 content/datasheets/oem/g01 +content/datasheets/oem/g01.md +no front matter in file +--- +title: "G01" +aliases: + - datasheets/oem/g01.html + - datasheets/oem/g01.md + - product-info/oem/g01 + - chapter/datasheets/oem/g01 +--- + +compare ./datasheets/oem/l04 content/datasheets/oem/l04 +compare ./datasheets/oem/l04 content/datasheets/oem/l04 +content/datasheets/oem/l04.md +no front matter in file +--- +title: "L04" +aliases: + - datasheets/oem/l04.html + - datasheets/oem/l04.md + - product-info/oem/l04 + - chapter/datasheets/oem/l04 +--- + +compare ./datasheets/oem/universal_reference content/datasheets/oem/universal_reference +compare ./datasheets/oem/universal_reference content/datasheets/oem/universal_reference +content/datasheets/oem/universal_reference.md +no front matter in file +--- +title: "Universal OEM Baseboard Reference" +aliases: + - datasheets/oem/universal_reference.html + - datasheets/oem/universal_reference.md + - product-info/oem/universal_reference + - chapter/datasheets/oem/universal_reference +--- + +compare ./datasheets/oem/l01 content/datasheets/oem/l01 +compare ./datasheets/oem/l01 content/datasheets/oem/l01 +content/datasheets/oem/l01.md +no front matter in file +--- +title: "L01" +aliases: + - datasheets/oem/l01.html + - datasheets/oem/l01.md + - product-info/oem/l01 + - chapter/datasheets/oem/l01 +--- + +compare ./datasheets/oem/README content/datasheets/oem/README +compare ./datasheets/oem/README content/datasheets/oem/README +content/datasheets/oem/README.md +no front matter in file +--- +title: "OEM Modules" +aliases: + - product-info/oem + - chapter/datasheets/oem +--- + +compare ./datasheets/oem/w01 content/datasheets/oem/w01 +compare ./datasheets/oem/w01 content/datasheets/oem/w01 +content/datasheets/oem/w01.md +no front matter in file +--- +title: "W01" +aliases: + - datasheets/oem/w01.html + - datasheets/oem/w01.md + - product-info/oem/w01 + - chapter/datasheets/oem/w01 +--- + +content/datasheets/oem/_index.md +no front matter in file +--- +title: "OEM Modules" +aliases: +--- + +compare ./datasheets/oem/l01_reference content/datasheets/oem/l01_reference +compare ./datasheets/oem/l01_reference content/datasheets/oem/l01_reference +content/datasheets/oem/l01_reference.md +no front matter in file +--- +title: "L01 OEM Baseboard Reference" +aliases: + - datasheets/oem/l01_reference.html + - datasheets/oem/l01_reference.md + - product-info/oem/l01_reference + - chapter/datasheets/oem/l01_reference +--- + +compare ./datasheets/boards/pysense content/datasheets/boards/pysense +compare ./datasheets/boards/pysense content/datasheets/boards/pysense +content/datasheets/boards/pysense.md +no front matter in file +--- +title: "Pysense" +aliases: + - datasheets/boards/pysense.html + - datasheets/boards/pysense.md + - product-info/boards/pysense + - chapter/datasheets/boards/pysense +--- + +compare ./datasheets/boards/expansion2 content/datasheets/boards/expansion2 +compare ./datasheets/boards/expansion2 content/datasheets/boards/expansion2 +content/datasheets/boards/expansion2.md +no front matter in file +--- +title: "Expansion Board 2.0" +aliases: + - datasheets/boards/expansion2.html + - datasheets/boards/expansion2.md + - product-info/boards/expansion2 + - chapter/datasheets/boards/expansion2 +--- + +compare ./datasheets/boards/expansion3 content/datasheets/boards/expansion3 +compare ./datasheets/boards/expansion3 content/datasheets/boards/expansion3 +content/datasheets/boards/expansion3.md +no front matter in file +--- +title: "Expansion Board 3.0" +aliases: + - datasheets/boards/expansion3.html + - datasheets/boards/expansion3.md + - product-info/boards/expansion3 + - chapter/datasheets/boards/expansion3 +--- + +compare ./datasheets/boards/README content/datasheets/boards/README +compare ./datasheets/boards/README content/datasheets/boards/README +content/datasheets/boards/README.md +no front matter in file +--- +title: "Expansion Boards and Shields" +aliases: + - product-info/boards + - chapter/datasheets/boards +--- + +compare ./datasheets/boards/pytrack content/datasheets/boards/pytrack +compare ./datasheets/boards/pytrack content/datasheets/boards/pytrack +content/datasheets/boards/pytrack.md +no front matter in file +--- +title: "Pytrack" +aliases: + - datasheets/boards/pytrack.html + - datasheets/boards/pytrack.md + - product-info/boards/pytrack + - chapter/datasheets/boards/pytrack +--- + +content/datasheets/boards/_index.md +no front matter in file +--- +title: "Expansion Boards and Shields" +aliases: +--- + +compare ./datasheets/boards/pyscan content/datasheets/boards/pyscan +compare ./datasheets/boards/pyscan content/datasheets/boards/pyscan +content/datasheets/boards/pyscan.md +no front matter in file +--- +title: "Pyscan" +aliases: + - datasheets/boards/pyscan.html + - datasheets/boards/pyscan.md + - product-info/boards/pyscan + - chapter/datasheets/boards/pyscan +--- + +compare ./datasheets/boards/deepsleep/api content/datasheets/boards/deepsleep/api +compare ./datasheets/boards/deepsleep/api content/datasheets/boards/deepsleep/api +content/datasheets/boards/deepsleep/api.md +no front matter in file +--- +title: "Deep Sleep API" +aliases: + - datasheets/boards/deepsleep/api.html + - datasheets/boards/deepsleep/api.md + - product-info/boards/deepsleep/api + - chapter/datasheets/boards/deepsleep/api +--- + +compare ./datasheets/boards/deepsleep/README content/datasheets/boards/deepsleep/README +compare ./datasheets/boards/deepsleep/README content/datasheets/boards/deepsleep/README +content/datasheets/boards/deepsleep/README.md +no front matter in file +--- +title: "Deep Sleep Shield" +aliases: + - product-info/boards/deepsleep + - chapter/datasheets/boards/deepsleep +--- + +content/datasheets/boards/deepsleep/_index.md +no front matter in file +--- +title: "Deep Sleep Shield" +aliases: +--- + +content/advance/license.md +no front matter in file +--- +title: "License" +aliases: + - advance/license.html + - advance/license.md +--- + +compare ./advance/cli content/advance/cli +content/advance/cli.md +no front matter in file +--- +title: "CLI Updater" +aliases: + - advance/cli.html + - advance/cli.md + - chapter/advance/cli +--- + +compare ./advance/downgrade content/advance/downgrade +content/advance/downgrade.md +no front matter in file +--- +title: "Firmware Downgrade" +aliases: + - advance/downgrade.html + - advance/downgrade.md + - chapter/advance/downgrade +--- + +compare ./advance/encryption content/advance/encryption +content/advance/encryption.md +no front matter in file +--- +title: "SecureBoot and Encryption" +aliases: + - advance/encryption.html + - advance/encryption.md + - chapter/advance/encryption +--- + +compare ./pybytes/getstarted content/pybytes/getstarted +content/pybytes/getstarted.md +no front matter in file +--- +title: "Getting Started with Pybytes" +aliases: + - pybytes/getstarted.html + - pybytes/getstarted.md + - chapter/pybytes/getstarted/intro +--- + +compare ./pybytes/dashboard content/pybytes/dashboard +content/pybytes/dashboard.md +no front matter in file +--- +title: "Visualise data from your device" +aliases: + - pybytes/dashboard.html + - pybytes/dashboard.md + - chapter/pybytes/dashboard/intro +--- + +compare ./pybytes/introduction content/pybytes/introduction +content/pybytes/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - pybytes/introduction.html + - pybytes/introduction.md + - chapter/pybytes +--- + +content/pybytes/_index.md +title not found for content/pybytes/README.md +no front matter in file +--- +title: "" +aliases: +--- + +content/pybytes/integrations/amazon-iot.md +no front matter in file +--- +title: "Amazon IoT" +aliases: + - pybytes/integrations/amazon-iot.html + - pybytes/integrations/amazon-iot.md +--- + +content/pybytes/integrations/webhooks.md +title not found for content/pybytes/integrations/webhooks.md +no front matter in file +--- +title: "" +aliases: + - pybytes/integrations/webhooks.html + - pybytes/integrations/webhooks.md +--- + +content/pybytes/integrations/README.md +no front matter in file +--- +title: "Integrations" +aliases: +--- + +content/pybytes/integrations/google.md +title not found for content/pybytes/integrations/google.md +no front matter in file +--- +title: "" +aliases: + - pybytes/integrations/google.html + - pybytes/integrations/google.md +--- + +content/pybytes/integrations/_index.md +no front matter in file +--- +title: "Integrations" +aliases: +--- + +content/pybytes/integrations/azure.md +title not found for content/pybytes/integrations/azure.md +no front matter in file +--- +title: "" +aliases: + - pybytes/integrations/azure.html + - pybytes/integrations/azure.md +--- + +compare ./pybytes/connect/flash content/pybytes/connect/flash +content/pybytes/connect/flash.md +no front matter in file +--- +title: "Connect to Pybytes: Flash Pybytes library manually" +aliases: + - pybytes/connect/flash.html + - pybytes/connect/flash.md + - chapter/pybytes/connect/flash +--- + +compare ./pybytes/connect/README content/pybytes/connect/README +content/pybytes/connect/README.md +no front matter in file +--- +title: "Add a device to Pybytes" +aliases: + - chapter/pybytes/connect/intro +--- + +compare ./pybytes/connect/quick content/pybytes/connect/quick +content/pybytes/connect/quick.md +no front matter in file +--- +title: "Connect to Pybytes: Quick Add" +aliases: + - pybytes/connect/quick.html + - pybytes/connect/quick.md + - chapter/pybytes/connect/quick +--- + +content/pybytes/connect/_index.md +no front matter in file +--- +title: "Add a device to Pybytes" +aliases: +--- + +compare ./pybytes/connect/sigfox/devkit content/pybytes/connect/sigfox/devkit +content/pybytes/connect/sigfox/devkit.md +no front matter in file +--- +title: "DevKit contract" +aliases: + - pybytes/connect/sigfox/devkit.html + - pybytes/connect/sigfox/devkit.md + - chapter/pybytes/connect/sigfox/sigfoxDevKit +--- + +compare ./pybytes/connect/sigfox/README content/pybytes/connect/sigfox/README +content/pybytes/connect/sigfox/README.md +no front matter in file +--- +title: "Add Sigfox device" +aliases: + - chapter/pybytes/connect/sigfox/sigfox +--- + +compare ./pybytes/connect/sigfox/custom content/pybytes/connect/sigfox/custom +content/pybytes/connect/sigfox/custom.md +no front matter in file +--- +title: "Custom contract" +aliases: + - pybytes/connect/sigfox/custom.html + - pybytes/connect/sigfox/custom.md + - chapter/pybytes/connect/sigfox/sigfoxCustomContract +--- + +content/pybytes/connect/sigfox/_index.md +no front matter in file +--- +title: "Add Sigfox device" +aliases: +--- + +content/getting-started/hardwaresetup/sipy.md +title not found for content/getting-started/hardwaresetup/sipy.md +no front matter in file +--- +title: "" +aliases: + - getting-started/hardwaresetup/sipy.html + - getting-started/hardwaresetup/sipy.md +--- + +content/getting-started/hardwaresetup/wipy.md +title not found for content/getting-started/hardwaresetup/wipy.md +no front matter in file +--- +title: "" +aliases: + - getting-started/hardwaresetup/wipy.html + - getting-started/hardwaresetup/wipy.md +--- + +content/getting-started/hardwaresetup/lopy4.md +title not found for content/getting-started/hardwaresetup/lopy4.md +no front matter in file +--- +title: "" +aliases: + - getting-started/hardwaresetup/lopy4.html + - getting-started/hardwaresetup/lopy4.md +--- + +content/getting-started/hardwaresetup/lopy.md +title not found for content/getting-started/hardwaresetup/lopy.md +no front matter in file +--- +title: "" +aliases: + - getting-started/hardwaresetup/lopy.html + - getting-started/hardwaresetup/lopy.md +--- + +content/getting-started/hardwaresetup/README.md +title not found for content/getting-started/hardwaresetup/README.md +no front matter in file +--- +title: "" +aliases: +--- + +content/getting-started/hardwaresetup/gpy.md +title not found for content/getting-started/hardwaresetup/gpy.md +no front matter in file +--- +title: "" +aliases: + - getting-started/hardwaresetup/gpy.html + - getting-started/hardwaresetup/gpy.md +--- + +content/getting-started/hardwaresetup/fipy.md +title not found for content/getting-started/hardwaresetup/fipy.md +no front matter in file +--- +title: "" +aliases: + - getting-started/hardwaresetup/fipy.html + - getting-started/hardwaresetup/fipy.md +--- + +compare ./gettingstarted/introduction content/gettingstarted/introduction +compare ./gettingstarted/introduction content/gettingstarted/introduction +compare ./gettingstarted/introduction content/gettingstarted/introduction +compare ./gettingstarted/introduction content/gettingstarted/introduction +content/gettingstarted/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - gettingstarted/introduction.html + - gettingstarted/introduction.md + - chapter/gettingstarted + - getting-started + - getting-started/introduction + - chapter/gettingstarted/introduction +--- + +content/gettingstarted/_index.md +title not found for content/gettingstarted/README.md +no front matter in file +--- +title: "" +aliases: +--- + +compare ./gettingstarted/registration/sigfox content/gettingstarted/registration/sigfox +content/gettingstarted/registration/sigfox.md +no front matter in file +--- +title: "Sigfox" +aliases: + - gettingstarted/registration/sigfox.html + - gettingstarted/registration/sigfox.md + - chapter/gettingstarted/registration/sigfox +--- + +compare ./gettingstarted/registration/README content/gettingstarted/registration/README +content/gettingstarted/registration/README.md +no front matter in file +--- +title: "Device Registration" +aliases: + - chapter/gettingstarted/registration/README +--- + +compare ./gettingstarted/registration/cellular content/gettingstarted/registration/cellular +content/gettingstarted/registration/cellular.md +no front matter in file +--- +title: "Cellular" +aliases: + - gettingstarted/registration/cellular.html + - gettingstarted/registration/cellular.md + - chapter/gettingstarted/registration/cellular +--- + +content/gettingstarted/registration/_index.md +no front matter in file +--- +title: "Device Registration" +aliases: +--- + +compare ./gettingstarted/registration/lora/objenious content/gettingstarted/registration/lora/objenious +content/gettingstarted/registration/lora/objenious.md +no front matter in file +--- +title: "Objenious" +aliases: + - gettingstarted/registration/lora/objenious.html + - gettingstarted/registration/lora/objenious.md + - chapter/gettingstarted/registration/lora/objenious +--- + +compare ./gettingstarted/registration/lora/README content/gettingstarted/registration/lora/README +content/gettingstarted/registration/lora/README.md +no front matter in file +--- +title: "LoRaWAN" +aliases: + - chapter/gettingstarted/registration/lora +--- + +compare ./gettingstarted/registration/lora/ttn content/gettingstarted/registration/lora/ttn +content/gettingstarted/registration/lora/ttn.md +no front matter in file +--- +title: "The Things Network" +aliases: + - gettingstarted/registration/lora/ttn.html + - gettingstarted/registration/lora/ttn.md + - chapter/gettingstarted/registration/lora/ttn +--- + +content/gettingstarted/registration/lora/_index.md +no front matter in file +--- +title: "LoRaWAN" +aliases: +--- + +compare ./gettingstarted/connection/sipy content/gettingstarted/connection/sipy +compare ./gettingstarted/connection/sipy content/gettingstarted/connection/sipy +content/gettingstarted/connection/sipy.md +no front matter in file +--- +title: "SiPy" +aliases: + - gettingstarted/connection/sipy.html + - gettingstarted/connection/sipy.md + - chapter/gettingstarted/connection/sipy + - gettingstarted/sipy.html +--- + +compare ./gettingstarted/connection/wipy content/gettingstarted/connection/wipy +compare ./gettingstarted/connection/wipy content/gettingstarted/connection/wipy +content/gettingstarted/connection/wipy.md +no front matter in file +--- +title: "WiPy" +aliases: + - gettingstarted/connection/wipy.html + - gettingstarted/connection/wipy.md + - chapter/gettingstarted/connection/wipy + - gettingstarted/wipy.html +--- + +compare ./gettingstarted/connection/lopy4 content/gettingstarted/connection/lopy4 +compare ./gettingstarted/connection/lopy4 content/gettingstarted/connection/lopy4 +content/gettingstarted/connection/lopy4.md +no front matter in file +--- +title: "LoPy 4" +aliases: + - gettingstarted/connection/lopy4.html + - gettingstarted/connection/lopy4.md + - chapter/gettingstarted/connection/lopy4 + - gettingstarted/lopy4.html +--- + +compare ./gettingstarted/connection/lopy content/gettingstarted/connection/lopy +compare ./gettingstarted/connection/lopy content/gettingstarted/connection/lopy +content/gettingstarted/connection/lopy.md +no front matter in file +--- +title: "LoPy" +aliases: + - gettingstarted/connection/lopy.html + - gettingstarted/connection/lopy.md + - chapter/gettingstarted/connection/lopy + - gettingstarted/lopy.html +--- + +compare ./gettingstarted/connection/README content/gettingstarted/connection/README +content/gettingstarted/connection/README.md +no front matter in file +--- +title: "Hardware Setup" +aliases: + - chapter/gettingstarted/hardwaresetup +--- + +compare ./gettingstarted/connection/gpy content/gettingstarted/connection/gpy +compare ./gettingstarted/connection/gpy content/gettingstarted/connection/gpy +content/gettingstarted/connection/gpy.md +no front matter in file +--- +title: "GPy" +aliases: + - gettingstarted/connection/gpy.html + - gettingstarted/connection/gpy.md + - chapter/gettingstarted/connection/gpy + - gettingstarted/gpy.html +--- + +content/gettingstarted/connection/_index.md +no front matter in file +--- +title: "Hardware Setup" +aliases: +--- + +compare ./gettingstarted/connection/fipy content/gettingstarted/connection/fipy +compare ./gettingstarted/connection/fipy content/gettingstarted/connection/fipy +content/gettingstarted/connection/fipy.md +no front matter in file +--- +title: "FiPy" +aliases: + - gettingstarted/connection/fipy.html + - gettingstarted/connection/fipy.md + - chapter/gettingstarted/connection/fipy + - gettingstarted/fipy.html +--- + +compare ./gettingstarted/installation/README content/gettingstarted/installation/README +content/gettingstarted/installation/README.md +no front matter in file +--- +title: "Software" +aliases: + - chapter/gettingstarted/installation/installingsoftware +--- + +compare ./gettingstarted/installation/drivers content/gettingstarted/installation/drivers +content/gettingstarted/installation/drivers.md +no front matter in file +--- +title: "Drivers" +aliases: + - gettingstarted/installation/drivers.html + - gettingstarted/installation/drivers.md + - chapter/gettingstarted/installation/drivers +--- + +compare ./gettingstarted/installation/pymakr content/gettingstarted/installation/pymakr +content/gettingstarted/installation/pymakr.md +no front matter in file +--- +title: "Pymakr" +aliases: + - gettingstarted/installation/pymakr.html + - gettingstarted/installation/pymakr.md + - chapter/gettingstarted/installation/pymakr +--- + +compare ./gettingstarted/installation/firmwaretool content/gettingstarted/installation/firmwaretool +content/gettingstarted/installation/firmwaretool.md +no front matter in file +--- +title: "Updating Firmware" +aliases: + - gettingstarted/installation/firmwaretool.html + - gettingstarted/installation/firmwaretool.md + - chapter/gettingstarted/installation/firmwaretool +--- + +content/gettingstarted/installation/_index.md +no front matter in file +--- +title: "Software" +aliases: +--- + +compare ./gettingstarted/programming/examples content/gettingstarted/programming/examples +content/gettingstarted/programming/examples.md +no front matter in file +--- +title: "MicroPython Examples" +aliases: + - gettingstarted/programming/examples.html + - gettingstarted/programming/examples.md + - chapter/gettingstarted/programming/examples +--- + +compare ./gettingstarted/programming/safeboot content/gettingstarted/programming/safeboot +content/gettingstarted/programming/safeboot.md +no front matter in file +--- +title: "Safe boot" +aliases: + - gettingstarted/programming/safeboot.html + - gettingstarted/programming/safeboot.md + - chapter/gettingstarted/programming/safeboot +--- + +compare ./gettingstarted/programming/first-project content/gettingstarted/programming/first-project +content/gettingstarted/programming/first-project.md +no front matter in file +--- +title: "Your first Pymakr project" +aliases: + - gettingstarted/programming/first-project.html + - gettingstarted/programming/first-project.md + - chapter/gettingstarted/programming/first-project +--- + +compare ./gettingstarted/programming/ftp content/gettingstarted/programming/ftp +content/gettingstarted/programming/ftp.md +no front matter in file +--- +title: "FTP" +aliases: + - gettingstarted/programming/ftp.html + - gettingstarted/programming/ftp.md + - chapter/gettingstarted/programming/ftp +--- + +compare ./gettingstarted/programming/README content/gettingstarted/programming/README +content/gettingstarted/programming/README.md +no front matter in file +--- +title: "Programming the modules" +aliases: + - chapter/gettingstarted/programming +--- + +compare ./gettingstarted/programming/micropython content/gettingstarted/programming/micropython +content/gettingstarted/programming/micropython.md +no front matter in file +--- +title: "Introduction to MicroPython" +aliases: + - gettingstarted/programming/micropython.html + - gettingstarted/programming/micropython.md + - chapter/gettingstarted/programming/micropython +--- + +content/gettingstarted/programming/_index.md +no front matter in file +--- +title: "Programming the modules" +aliases: +--- + +compare ./gettingstarted/programming/repl/serial content/gettingstarted/programming/repl/serial +content/gettingstarted/programming/repl/serial.md +no front matter in file +--- +title: "Serial USB (UART)" +aliases: + - gettingstarted/programming/repl/serial.html + - gettingstarted/programming/repl/serial.md + - chapter/gettingstarted/programming/repl/serial +--- + +compare ./gettingstarted/programming/repl/README content/gettingstarted/programming/repl/README +content/gettingstarted/programming/repl/README.md +no front matter in file +--- +title: "REPL" +aliases: + - chapter/gettingstarted/programming/repl +--- + +compare ./gettingstarted/programming/repl/telnet content/gettingstarted/programming/repl/telnet +content/gettingstarted/programming/repl/telnet.md +no front matter in file +--- +title: "Telnet REPL" +aliases: + - gettingstarted/programming/repl/telnet.html + - gettingstarted/programming/repl/telnet.md + - chapter/gettingstarted/programming/repl/telnet +--- + +content/gettingstarted/programming/repl/_index.md +no front matter in file +--- +title: "REPL" +aliases: +--- + +compare ./tutorials/pysense content/tutorials/pysense +content/tutorials/pysense.md +no front matter in file +--- +title: "Pysense Examples" +aliases: + - tutorials/pysense.html + - tutorials/pysense.md + - chapter/tutorials/pysense +--- + +compare ./tutorials/introduction content/tutorials/introduction +content/tutorials/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - tutorials/introduction.html + - tutorials/introduction.md + - chapter/tutorials +--- + +compare ./tutorials/sigfox content/tutorials/sigfox +content/tutorials/sigfox.md +no front matter in file +--- +title: "Sigfox Examples" +aliases: + - tutorials/sigfox.html + - tutorials/sigfox.md + - chapter/tutorials/sigfox +--- + +compare ./tutorials/pytrack content/tutorials/pytrack +content/tutorials/pytrack.md +no front matter in file +--- +title: "Pytrack Examples" +aliases: + - tutorials/pytrack.html + - tutorials/pytrack.md + - chapter/tutorials/pytrack +--- + +content/tutorials/_index.md +title not found for content/tutorials/README.md +no front matter in file +--- +title: "" +aliases: +--- + +compare ./tutorials/pyscan content/tutorials/pyscan +content/tutorials/pyscan.md +no front matter in file +--- +title: "Pyscan Examples" +aliases: + - tutorials/pyscan.html + - tutorials/pyscan.md + - chapter/tutorials/pyscan +--- + +compare ./tutorials/lte/nb-iot content/tutorials/lte/nb-iot +content/tutorials/lte/nb-iot.md +no front matter in file +--- +title: "NB-IoT" +aliases: + - tutorials/lte/nb-iot.html + - tutorials/lte/nb-iot.md + - chapter/tutorials/lte/nb-iot +--- + +compare ./tutorials/lte/cat-m1 content/tutorials/lte/cat-m1 +content/tutorials/lte/cat-m1.md +no front matter in file +--- +title: "CAT-M1" +aliases: + - tutorials/lte/cat-m1.html + - tutorials/lte/cat-m1.md + - chapter/tutorials/lte/cat-m1 +--- + +compare ./tutorials/lte/imei content/tutorials/lte/imei +content/tutorials/lte/imei.md +no front matter in file +--- +title: "Module IMEI" +aliases: + - tutorials/lte/imei.html + - tutorials/lte/imei.md + - chapter/tutorials/lte/imei +--- + +compare ./tutorials/lte/README content/tutorials/lte/README +content/tutorials/lte/README.md +no front matter in file +--- +title: "LTE Examples" +aliases: + - chapter/tutorials/lte +--- + +compare ./tutorials/lte/firmware content/tutorials/lte/firmware +content/tutorials/lte/firmware.md +no front matter in file +--- +title: "Modem Firmware Update" +aliases: + - tutorials/lte/firmware.html + - tutorials/lte/firmware.md + - chapter/tutorials/lte/firmware +--- + +content/tutorials/lte/_index.md +no front matter in file +--- +title: "LTE Examples" +aliases: +--- + +content/tutorials/all/touch.md +no front matter in file +--- +title: "Touch" +aliases: + - tutorials/all/touch.html + - tutorials/all/touch.md +--- + +compare ./tutorials/all/modbus content/tutorials/all/modbus +content/tutorials/all/modbus.md +no front matter in file +--- +title: "Modbus" +aliases: + - tutorials/all/modbus.html + - tutorials/all/modbus.md + - chapter/tutorials/all/modbus +--- + +compare ./tutorials/all/threading content/tutorials/all/threading +content/tutorials/all/threading.md +no front matter in file +--- +title: "Threading" +aliases: + - tutorials/all/threading.html + - tutorials/all/threading.md + - chapter/tutorials/all/threading +--- + +compare ./tutorials/all/ota content/tutorials/all/ota +content/tutorials/all/ota.md +no front matter in file +--- +title: "OTA update" +aliases: + - tutorials/all/ota.html + - tutorials/all/ota.md + - chapter/tutorials/all/ota +--- + +compare ./tutorials/all/owd content/tutorials/all/owd +content/tutorials/all/owd.md +no front matter in file +--- +title: "Onewire Driver" +aliases: + - tutorials/all/owd.html + - tutorials/all/owd.md + - chapter/tutorials/all/owd +--- + +compare ./tutorials/all/adc content/tutorials/all/adc +content/tutorials/all/adc.md +no front matter in file +--- +title: "ADC" +aliases: + - tutorials/all/adc.html + - tutorials/all/adc.md + - chapter/tutorials/all/adc +--- + +compare ./tutorials/all/socket content/tutorials/all/socket +content/tutorials/all/socket.md +no front matter in file +--- +title: "Socket" +aliases: + - tutorials/all/socket.html + - tutorials/all/socket.md + - chapter/tutorials/all/socket +--- + +compare ./tutorials/all/timers content/tutorials/all/timers +content/tutorials/all/timers.md +no front matter in file +--- +title: "Timers" +aliases: + - tutorials/all/timers.html + - tutorials/all/timers.md + - chapter/tutorials/all/timers +--- + +compare ./tutorials/all/README content/tutorials/all/README +content/tutorials/all/README.md +no front matter in file +--- +title: "All Pycom Device Examples" +aliases: + - chapter/tutorials/all +--- + +compare ./tutorials/all/rmt content/tutorials/all/rmt +content/tutorials/all/rmt.md +no front matter in file +--- +title: "RMT" +aliases: + - tutorials/all/rmt.html + - tutorials/all/rmt.md + - chapter/tutorials/all/rmt +--- + +compare ./tutorials/all/ble content/tutorials/all/ble +content/tutorials/all/ble.md +no front matter in file +--- +title: "Bluetooth" +aliases: + - tutorials/all/ble.html + - tutorials/all/ble.md + - chapter/tutorials/all/ble +--- + +compare ./tutorials/all/rgbled content/tutorials/all/rgbled +content/tutorials/all/rgbled.md +no front matter in file +--- +title: "RGB LED" +aliases: + - tutorials/all/rgbled.html + - tutorials/all/rgbled.md + - chapter/tutorials/all/rgbled +--- + +compare ./tutorials/all/https content/tutorials/all/https +content/tutorials/all/https.md +no front matter in file +--- +title: "HTTPS" +aliases: + - tutorials/all/https.html + - tutorials/all/https.md + - chapter/tutorials/all/https +--- + +compare ./tutorials/all/pir content/tutorials/all/pir +content/tutorials/all/pir.md +no front matter in file +--- +title: "PIR Sensor" +aliases: + - tutorials/all/pir.html + - tutorials/all/pir.md + - chapter/tutorials/all/pir +--- + +compare ./tutorials/all/wlan content/tutorials/all/wlan +content/tutorials/all/wlan.md +no front matter in file +--- +title: "WLAN" +aliases: + - tutorials/all/wlan.html + - tutorials/all/wlan.md + - chapter/tutorials/all/wlan +--- + +compare ./tutorials/all/aws content/tutorials/all/aws +content/tutorials/all/aws.md +no front matter in file +--- +title: "AWS" +aliases: + - tutorials/all/aws.html + - tutorials/all/aws.md + - chapter/tutorials/all/aws +--- + +compare ./tutorials/all/mqtt content/tutorials/all/mqtt +content/tutorials/all/mqtt.md +no front matter in file +--- +title: "MQTT" +aliases: + - tutorials/all/mqtt.html + - tutorials/all/mqtt.md + - chapter/tutorials/all/mqtt +--- + +compare ./tutorials/all/repl content/tutorials/all/repl +content/tutorials/all/repl.md +no front matter in file +--- +title: "REPL" +aliases: + - tutorials/all/repl.html + - tutorials/all/repl.md + - chapter/tutorials/all/repl +--- + +content/tutorials/all/_index.md +no front matter in file +--- +title: "All Pycom Device Examples" +aliases: +--- + +compare ./tutorials/all/i2c content/tutorials/all/i2c +content/tutorials/all/i2c.md +no front matter in file +--- +title: "I2C" +aliases: + - tutorials/all/i2c.html + - tutorials/all/i2c.md + - chapter/tutorials/all/i2c +--- + +compare ./tutorials/lora/lora-mac content/tutorials/lora/lora-mac +content/tutorials/lora/lora-mac.md +no front matter in file +--- +title: "LoRa-MAC (Raw LoRa)" +aliases: + - tutorials/lora/lora-mac.html + - tutorials/lora/lora-mac.md + - chapter/tutorials/lora/lora-mac +--- + +compare ./tutorials/lora/lora-mesh content/tutorials/lora/lora-mesh +content/tutorials/lora/lora-mesh.md +no front matter in file +--- +title: "LoRa Mesh" +aliases: + - tutorials/lora/lora-mesh.html + - tutorials/lora/lora-mesh.md + - chapter/tutorials/lora/lora-mesh +--- + +compare ./tutorials/lora/module-module content/tutorials/lora/module-module +content/tutorials/lora/module-module.md +no front matter in file +--- +title: "LoPy to LoPy" +aliases: + - tutorials/lora/module-module.html + - tutorials/lora/module-module.md + - chapter/tutorials/lora/module-module +--- + +compare ./tutorials/lora/lorawan-abp content/tutorials/lora/lorawan-abp +content/tutorials/lora/lorawan-abp.md +no front matter in file +--- +title: "LoRaWAN with ABP" +aliases: + - tutorials/lora/lorawan-abp.html + - tutorials/lora/lorawan-abp.md + - chapter/tutorials/lora/lorawan-abp +--- + +compare ./tutorials/lora/lorawan-nano-gateway content/tutorials/lora/lorawan-nano-gateway +content/tutorials/lora/lorawan-nano-gateway.md +no front matter in file +--- +title: "LoRaWAN Nano-Gateway" +aliases: + - tutorials/lora/lorawan-nano-gateway.html + - tutorials/lora/lorawan-nano-gateway.md + - chapter/tutorials/lora/lorawan-nano-gateway +--- + +compare ./tutorials/lora/README content/tutorials/lora/README +content/tutorials/lora/README.md +no front matter in file +--- +title: "LoRa Examples" +aliases: + - chapter/tutorials/lora +--- + +content/tutorials/lora/pymesh-br.md +no front matter in file +--- +title: "PyMesh Border Router" +aliases: + - tutorials/lora/pymesh-br.html + - tutorials/lora/pymesh-br.md +--- + +compare ./tutorials/lora/rn2483-to-lopy content/tutorials/lora/rn2483-to-lopy +content/tutorials/lora/rn2483-to-lopy.md +no front matter in file +--- +title: "RN2483 to LoPy" +aliases: + - tutorials/lora/rn2483-to-lopy.html + - tutorials/lora/rn2483-to-lopy.md + - chapter/tutorials/lora/rn2483-to-lopy +--- + +compare ./tutorials/lora/lorawan-otaa content/tutorials/lora/lorawan-otaa +content/tutorials/lora/lorawan-otaa.md +no front matter in file +--- +title: "LoRaWAN with OTAA" +aliases: + - tutorials/lora/lorawan-otaa.html + - tutorials/lora/lorawan-otaa.md + - chapter/tutorials/lora/lorawan-otaa +--- + +compare ./tutorials/lora/lora-mac-nano-gateway content/tutorials/lora/lora-mac-nano-gateway +content/tutorials/lora/lora-mac-nano-gateway.md +no front matter in file +--- +title: "LoRa-MAC Nano-Gateway" +aliases: + - tutorials/lora/lora-mac-nano-gateway.html + - tutorials/lora/lora-mac-nano-gateway.md + - chapter/tutorials/lora/lora-mac-nano-gateway +--- + +content/tutorials/lora/_index.md +no front matter in file +--- +title: "LoRa Examples" +aliases: +--- + +compare ./docnotes/syntax content/docnotes/syntax +content/docnotes/syntax.md +no front matter in file +--- +title: "Syntax" +aliases: + - docnotes/syntax.html + - docnotes/syntax.md + - chapter/docnotes/syntax +--- + +compare ./docnotes/replscript content/docnotes/replscript +content/docnotes/replscript.md +no front matter in file +--- +title: "REPL vs Scripts" +aliases: + - docnotes/replscript.html + - docnotes/replscript.md + - chapter/docnotes/replscript +--- + +compare ./docnotes/mesh-networks content/docnotes/mesh-networks +content/docnotes/mesh-networks.md +no front matter in file +--- +title: "Mesh Networks" +aliases: + - docnotes/mesh-networks.html + - docnotes/mesh-networks.md + - chapter/docnotes/mesh-networks +--- + +compare ./docnotes/introduction content/docnotes/introduction +content/docnotes/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - docnotes/introduction.html + - docnotes/introduction.md + - chapter/docnotes +--- + +content/docnotes/_index.md +title not found for content/docnotes/README.md +no front matter in file +--- +title: "" +aliases: +--- + +compare ./pytrackpysense/introduction content/pytrackpysense/introduction +content/pytrackpysense/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - pytrackpysense/introduction.html + - pytrackpysense/introduction.md + - chapter/pytrackpysense +--- + +content/pytrackpysense/_index.md +title not found for content/pytrackpysense/README.md +no front matter in file +--- +title: "" +aliases: +--- + +compare ./pytrackpysense/installation/README content/pytrackpysense/installation/README +content/pytrackpysense/installation/README.md +no front matter in file +--- +title: "Installing Software" +aliases: + - chapter/pytrackpysense/installation +--- + +compare ./pytrackpysense/installation/drivers content/pytrackpysense/installation/drivers +content/pytrackpysense/installation/drivers.md +no front matter in file +--- +title: "Installing Drivers - Windows 7" +aliases: + - pytrackpysense/installation/drivers.html + - pytrackpysense/installation/drivers.md + - chapter/pytrackpysense/installation/drivers +--- + +compare ./pytrackpysense/installation/firmware content/pytrackpysense/installation/firmware +content/pytrackpysense/installation/firmware.md +no front matter in file +--- +title: "Updating Firmware" +aliases: + - pytrackpysense/installation/firmware.html + - pytrackpysense/installation/firmware.md + - chapter/pytrackpysense/installation/firmware +--- + +compare ./pytrackpysense/installation/libraries content/pytrackpysense/installation/libraries +content/pytrackpysense/installation/libraries.md +no front matter in file +--- +title: "Installing Libraries" +aliases: + - pytrackpysense/installation/libraries.html + - pytrackpysense/installation/libraries.md + - chapter/pytrackpysense/installation/libraries +--- + +content/pytrackpysense/installation/_index.md +no front matter in file +--- +title: "Installing Software" +aliases: +--- + +compare ./pytrackpysense/apireference/pysense content/pytrackpysense/apireference/pysense +content/pytrackpysense/apireference/pysense.md +no front matter in file +--- +title: "Pysense" +aliases: + - pytrackpysense/apireference/pysense.html + - pytrackpysense/apireference/pysense.md + - chapter/pytrackpysense/apireference/pysense +--- + +compare ./pytrackpysense/apireference/sleep content/pytrackpysense/apireference/sleep +content/pytrackpysense/apireference/sleep.md +no front matter in file +--- +title: "Sleep" +aliases: + - pytrackpysense/apireference/sleep.html + - pytrackpysense/apireference/sleep.md + - chapter/pytrackpysense/apireference/sleep +--- + +compare ./pytrackpysense/apireference/README content/pytrackpysense/apireference/README +content/pytrackpysense/apireference/README.md +no front matter in file +--- +title: "API Reference" +aliases: + - chapter/pytrackpysense/apireference +--- + +compare ./pytrackpysense/apireference/pytrack content/pytrackpysense/apireference/pytrack +content/pytrackpysense/apireference/pytrack.md +no front matter in file +--- +title: "Pytrack" +aliases: + - pytrackpysense/apireference/pytrack.html + - pytrackpysense/apireference/pytrack.md + - chapter/pytrackpysense/apireference/pytrack +--- + +content/pytrackpysense/apireference/_index.md +no front matter in file +--- +title: "API Reference" +aliases: +--- + +compare ./pytrackpysense/apireference/pyscan content/pytrackpysense/apireference/pyscan +content/pytrackpysense/apireference/pyscan.md +no front matter in file +--- +title: "Pyscan" +aliases: + - pytrackpysense/apireference/pyscan.html + - pytrackpysense/apireference/pyscan.md + - chapter/pytrackpysense/apireference/pyscan +--- + +compare ./firmwareapi/introduction content/firmwareapi/introduction +content/firmwareapi/introduction.md +no front matter in file +--- +title: "Introduction" +aliases: + - firmwareapi/introduction.html + - firmwareapi/introduction.md + - chapter/firmwareapi +--- + +compare ./firmwareapi/notes content/firmwareapi/notes +content/firmwareapi/notes.md +no front matter in file +--- +title: "Notes" +aliases: + - firmwareapi/notes.html + - firmwareapi/notes.md + - chapter/firmwareapi/notes +--- + +content/firmwareapi/_index.md +title not found for content/firmwareapi/README.md +no front matter in file +--- +title: "" +aliases: +--- + +compare ./firmwareapi/micropython/uos content/firmwareapi/micropython/uos +content/firmwareapi/micropython/uos.md +no front matter in file +--- +title: "uos" +aliases: + - firmwareapi/micropython/uos.html + - firmwareapi/micropython/uos.md + - chapter/firmwareapi/micropython/uos +--- + +compare ./firmwareapi/micropython/sys content/firmwareapi/micropython/sys +content/firmwareapi/micropython/sys.md +no front matter in file +--- +title: "sys" +aliases: + - firmwareapi/micropython/sys.html + - firmwareapi/micropython/sys.md + - chapter/firmwareapi/micropython/sys +--- + +compare ./firmwareapi/micropython/uhashlib content/firmwareapi/micropython/uhashlib +content/firmwareapi/micropython/uhashlib.md +no front matter in file +--- +title: "uhashlib" +aliases: + - firmwareapi/micropython/uhashlib.html + - firmwareapi/micropython/uhashlib.md + - chapter/firmwareapi/micropython/uhashlib +--- + +compare ./firmwareapi/micropython/select content/firmwareapi/micropython/select +content/firmwareapi/micropython/select.md +no front matter in file +--- +title: "select" +aliases: + - firmwareapi/micropython/select.html + - firmwareapi/micropython/select.md + - chapter/firmwareapi/micropython/select +--- + +compare ./firmwareapi/micropython/utime content/firmwareapi/micropython/utime +content/firmwareapi/micropython/utime.md +no front matter in file +--- +title: "utime" +aliases: + - firmwareapi/micropython/utime.html + - firmwareapi/micropython/utime.md + - chapter/firmwareapi/micropython/utime +--- + +compare ./firmwareapi/micropython/math content/firmwareapi/micropython/math +content/firmwareapi/micropython/math.md +no front matter in file +--- +title: "math" +aliases: + - firmwareapi/micropython/math.html + - firmwareapi/micropython/math.md + - chapter/firmwareapi/micropython/math +--- + +compare ./firmwareapi/micropython/builtin content/firmwareapi/micropython/builtin +content/firmwareapi/micropython/builtin.md +no front matter in file +--- +title: "Builtin" +aliases: + - firmwareapi/micropython/builtin.html + - firmwareapi/micropython/builtin.md + - chapter/firmwareapi/micropython/builtin +--- + +compare ./firmwareapi/micropython/_thread content/firmwareapi/micropython/_thread +content/firmwareapi/micropython/_thread.md +no front matter in file +--- +title: "_thread" +aliases: + - firmwareapi/micropython/_thread.html + - firmwareapi/micropython/_thread.md + - chapter/firmwareapi/micropython/_thread +--- + +compare ./firmwareapi/micropython/array content/firmwareapi/micropython/array +content/firmwareapi/micropython/array.md +no front matter in file +--- +title: "array" +aliases: + - firmwareapi/micropython/array.html + - firmwareapi/micropython/array.md + - chapter/firmwareapi/micropython/array +--- + +compare ./firmwareapi/micropython/ussl content/firmwareapi/micropython/ussl +content/firmwareapi/micropython/ussl.md +no front matter in file +--- +title: "ussl" +aliases: + - firmwareapi/micropython/ussl.html + - firmwareapi/micropython/ussl.md + - chapter/firmwareapi/micropython/ussl +--- + +compare ./firmwareapi/micropython/README content/firmwareapi/micropython/README +content/firmwareapi/micropython/README.md +no front matter in file +--- +title: "MicroPython Modules" +aliases: + - chapter/firmwareapi/micropython +--- + +compare ./firmwareapi/micropython/ure content/firmwareapi/micropython/ure +content/firmwareapi/micropython/ure.md +no front matter in file +--- +title: "ure" +aliases: + - firmwareapi/micropython/ure.html + - firmwareapi/micropython/ure.md + - chapter/firmwareapi/micropython/ure +--- + +compare ./firmwareapi/micropython/ujson content/firmwareapi/micropython/ujson +content/firmwareapi/micropython/ujson.md +no front matter in file +--- +title: "ujson" +aliases: + - firmwareapi/micropython/ujson.html + - firmwareapi/micropython/ujson.md + - chapter/firmwareapi/micropython/ujson +--- + +compare ./firmwareapi/micropython/cmath content/firmwareapi/micropython/cmath +content/firmwareapi/micropython/cmath.md +no front matter in file +--- +title: "cmath" +aliases: + - firmwareapi/micropython/cmath.html + - firmwareapi/micropython/cmath.md + - chapter/firmwareapi/micropython/cmath +--- + +compare ./firmwareapi/micropython/gc content/firmwareapi/micropython/gc +content/firmwareapi/micropython/gc.md +no front matter in file +--- +title: "gc" +aliases: + - firmwareapi/micropython/gc.html + - firmwareapi/micropython/gc.md + - chapter/firmwareapi/micropython/gc +--- + +compare ./firmwareapi/micropython/ucrypto content/firmwareapi/micropython/ucrypto +content/firmwareapi/micropython/ucrypto.md +no front matter in file +--- +title: "ucrypto" +aliases: + - firmwareapi/micropython/ucrypto.html + - firmwareapi/micropython/ucrypto.md + - chapter/firmwareapi/micropython/ucrypto +--- + +compare ./firmwareapi/micropython/ubinascii content/firmwareapi/micropython/ubinascii +content/firmwareapi/micropython/ubinascii.md +no front matter in file +--- +title: "ubinascii" +aliases: + - firmwareapi/micropython/ubinascii.html + - firmwareapi/micropython/ubinascii.md + - chapter/firmwareapi/micropython/ubinascii +--- + +compare ./firmwareapi/micropython/usocket content/firmwareapi/micropython/usocket +content/firmwareapi/micropython/usocket.md +no front matter in file +--- +title: "usocket" +aliases: + - firmwareapi/micropython/usocket.html + - firmwareapi/micropython/usocket.md + - chapter/firmwareapi/micropython/usocket +--- + +compare ./firmwareapi/micropython/micropython content/firmwareapi/micropython/micropython +content/firmwareapi/micropython/micropython.md +no front matter in file +--- +title: "micropython" +aliases: + - firmwareapi/micropython/micropython.html + - firmwareapi/micropython/micropython.md + - chapter/firmwareapi/micropython/micropython +--- + +compare ./firmwareapi/micropython/uzlib content/firmwareapi/micropython/uzlib +content/firmwareapi/micropython/uzlib.md +title not found for content/firmwareapi/micropython/uzlib.md +no front matter in file +--- +title: "" +aliases: + - firmwareapi/micropython/uzlib.html + - firmwareapi/micropython/uzlib.md + - chapter/firmwareapi/micropython/uzlib +--- + +content/firmwareapi/micropython/_index.md +no front matter in file +--- +title: "MicroPython Modules" +aliases: +--- + +compare ./firmwareapi/micropython/ustruct content/firmwareapi/micropython/ustruct +content/firmwareapi/micropython/ustruct.md +no front matter in file +--- +title: "ustruct" +aliases: + - firmwareapi/micropython/ustruct.html + - firmwareapi/micropython/ustruct.md + - chapter/firmwareapi/micropython/ustruct +--- + +compare ./firmwareapi/micropython/uctypes content/firmwareapi/micropython/uctypes +content/firmwareapi/micropython/uctypes.md +no front matter in file +--- +title: "uctypes" +aliases: + - firmwareapi/micropython/uctypes.html + - firmwareapi/micropython/uctypes.md + - chapter/firmwareapi/micropython/uctypes +--- + +compare ./firmwareapi/pycom/README content/firmwareapi/pycom/README +content/firmwareapi/pycom/README.md +no front matter in file +--- +title: "Pycom Modules" +aliases: + - chapter/firmwareapi/pycom +--- + +compare ./firmwareapi/pycom/aes content/firmwareapi/pycom/aes +content/firmwareapi/pycom/aes.md +no front matter in file +--- +title: "AES" +aliases: + - firmwareapi/pycom/aes.html + - firmwareapi/pycom/aes.md + - chapter/firmwareapi/pycom/aes +--- + +compare ./firmwareapi/pycom/pycom content/firmwareapi/pycom/pycom +content/firmwareapi/pycom/pycom.md +no front matter in file +--- +title: "pycom" +aliases: + - firmwareapi/pycom/pycom.html + - firmwareapi/pycom/pycom.md + - chapter/firmwareapi/pycom/pycom +--- + +content/firmwareapi/pycom/_index.md +no front matter in file +--- +title: "Pycom Modules" +aliases: +--- + +compare ./firmwareapi/pycom/network/sigfox content/firmwareapi/pycom/network/sigfox +content/firmwareapi/pycom/network/sigfox.md +no front matter in file +--- +title: "Sigfox" +aliases: + - firmwareapi/pycom/network/sigfox.html + - firmwareapi/pycom/network/sigfox.md + - chapter/firmwareapi/pycom/network/sigfox +--- + +compare ./firmwareapi/pycom/network/README content/firmwareapi/pycom/network/README +content/firmwareapi/pycom/network/README.md +no front matter in file +--- +title: "network" +aliases: + - chapter/firmwareapi/pycom/network +--- + +compare ./firmwareapi/pycom/network/lte content/firmwareapi/pycom/network/lte +content/firmwareapi/pycom/network/lte.md +no front matter in file +--- +title: "LTE" +aliases: + - firmwareapi/pycom/network/lte.html + - firmwareapi/pycom/network/lte.md + - chapter/firmwareapi/pycom/network/lte +--- + +compare ./firmwareapi/pycom/network/server content/firmwareapi/pycom/network/server +content/firmwareapi/pycom/network/server.md +no front matter in file +--- +title: "Server" +aliases: + - firmwareapi/pycom/network/server.html + - firmwareapi/pycom/network/server.md + - chapter/firmwareapi/pycom/network/server +--- + +compare ./firmwareapi/pycom/network/wlan content/firmwareapi/pycom/network/wlan +content/firmwareapi/pycom/network/wlan.md +no front matter in file +--- +title: "WLAN" +aliases: + - firmwareapi/pycom/network/wlan.html + - firmwareapi/pycom/network/wlan.md + - chapter/firmwareapi/pycom/network/wlan +--- + +content/firmwareapi/pycom/network/_index.md +no front matter in file +--- +title: "network" +aliases: +--- + +content/firmwareapi/pycom/network/bluetooth/gattscharacteristic.md +no front matter in file +--- +title: "GATTSCharacteristic" +aliases: + - firmwareapi/pycom/network/bluetooth/gattscharacteristic.html + - firmwareapi/pycom/network/bluetooth/gattscharacteristic.md +--- + +content/firmwareapi/pycom/network/bluetooth/gattccharacteristic.md +no front matter in file +--- +title: "GATTCCharacteristic" +aliases: + - firmwareapi/pycom/network/bluetooth/gattccharacteristic.html + - firmwareapi/pycom/network/bluetooth/gattccharacteristic.md +--- + +content/firmwareapi/pycom/network/bluetooth/gattccservice.md +no front matter in file +--- +title: "GATTCService" +aliases: + - firmwareapi/pycom/network/bluetooth/gattccservice.html + - firmwareapi/pycom/network/bluetooth/gattccservice.md +--- + +compare ./firmwareapi/pycom/network/bluetooth/README content/firmwareapi/pycom/network/bluetooth/README +content/firmwareapi/pycom/network/bluetooth/README.md +no front matter in file +--- +title: "Bluetooth" +aliases: + - chapter/firmwareapi/pycom/network/bluetooth +--- + +compare ./firmwareapi/pycom/network/bluetooth/gatt content/firmwareapi/pycom/network/bluetooth/gatt +content/firmwareapi/pycom/network/bluetooth/gatt.md +no front matter in file +--- +title: "GATT" +aliases: + - firmwareapi/pycom/network/bluetooth/gatt.html + - firmwareapi/pycom/network/bluetooth/gatt.md + - chapter/firmwareapi/pycom/network/bluetooth/gatt +--- + +compare ./firmwareapi/pycom/network/bluetooth/gattsservice content/firmwareapi/pycom/network/bluetooth/gattsservice +content/firmwareapi/pycom/network/bluetooth/gattsservice.md +no front matter in file +--- +title: "GATTSService" +aliases: + - firmwareapi/pycom/network/bluetooth/gattsservice.html + - firmwareapi/pycom/network/bluetooth/gattsservice.md + - chapter/firmwareapi/pycom/network/bluetooth/gattsservice +--- + +content/firmwareapi/pycom/network/bluetooth/gattcconnection.md +no front matter in file +--- +title: "GATTCConnection" +aliases: + - firmwareapi/pycom/network/bluetooth/gattcconnection.html + - firmwareapi/pycom/network/bluetooth/gattcconnection.md +--- + +content/firmwareapi/pycom/network/bluetooth/_index.md +no front matter in file +--- +title: "Bluetooth" +aliases: +--- + +content/firmwareapi/pycom/network/lora/pymesh.md +no front matter in file +--- +title: "Pymesh" +aliases: + - firmwareapi/pycom/network/lora/pymesh.html + - firmwareapi/pycom/network/lora/pymesh.md +--- + +content/firmwareapi/pycom/network/lora/README.md +no front matter in file +--- +title: "LoRa" +aliases: +--- + +content/firmwareapi/pycom/network/lora/_index.md +no front matter in file +--- +title: "LoRa" +aliases: +--- + +compare ./firmwareapi/pycom/machine/rtc content/firmwareapi/pycom/machine/rtc +content/firmwareapi/pycom/machine/rtc.md +no front matter in file +--- +title: "RTC" +aliases: + - firmwareapi/pycom/machine/rtc.html + - firmwareapi/pycom/machine/rtc.md + - chapter/firmwareapi/pycom/machine/rtc +--- + +compare ./firmwareapi/pycom/machine/uart content/firmwareapi/pycom/machine/uart +content/firmwareapi/pycom/machine/uart.md +no front matter in file +--- +title: "UART" +aliases: + - firmwareapi/pycom/machine/uart.html + - firmwareapi/pycom/machine/uart.md + - chapter/firmwareapi/pycom/machine/uart +--- + +compare ./firmwareapi/pycom/machine/can content/firmwareapi/pycom/machine/can +content/firmwareapi/pycom/machine/can.md +no front matter in file +--- +title: "CAN" +aliases: + - firmwareapi/pycom/machine/can.html + - firmwareapi/pycom/machine/can.md + - chapter/firmwareapi/pycom/machine/can +--- + +compare ./firmwareapi/pycom/machine/spi content/firmwareapi/pycom/machine/spi +content/firmwareapi/pycom/machine/spi.md +no front matter in file +--- +title: "SPI" +aliases: + - firmwareapi/pycom/machine/spi.html + - firmwareapi/pycom/machine/spi.md + - chapter/firmwareapi/pycom/machine/spi +--- + +compare ./firmwareapi/pycom/machine/adc content/firmwareapi/pycom/machine/adc +content/firmwareapi/pycom/machine/adc.md +no front matter in file +--- +title: "ADC" +aliases: + - firmwareapi/pycom/machine/adc.html + - firmwareapi/pycom/machine/adc.md + - chapter/firmwareapi/pycom/machine/adc +--- + +compare ./firmwareapi/pycom/machine/sd content/firmwareapi/pycom/machine/sd +content/firmwareapi/pycom/machine/sd.md +no front matter in file +--- +title: "SD" +aliases: + - firmwareapi/pycom/machine/sd.html + - firmwareapi/pycom/machine/sd.md + - chapter/firmwareapi/pycom/machine/sd +--- + +compare ./firmwareapi/pycom/machine/README content/firmwareapi/pycom/machine/README +content/firmwareapi/pycom/machine/README.md +no front matter in file +--- +title: "machine" +aliases: + - chapter/firmwareapi/pycom/machine +--- + +compare ./firmwareapi/pycom/machine/rmt content/firmwareapi/pycom/machine/rmt +content/firmwareapi/pycom/machine/rmt.md +no front matter in file +--- +title: "RMT" +aliases: + - firmwareapi/pycom/machine/rmt.html + - firmwareapi/pycom/machine/rmt.md + - chapter/firmwareapi/pycom/machine/rmt +--- + +compare ./firmwareapi/pycom/machine/pwm content/firmwareapi/pycom/machine/pwm +content/firmwareapi/pycom/machine/pwm.md +no front matter in file +--- +title: "PWM" +aliases: + - firmwareapi/pycom/machine/pwm.html + - firmwareapi/pycom/machine/pwm.md + - chapter/firmwareapi/pycom/machine/pwm +--- + +compare ./firmwareapi/pycom/machine/pin content/firmwareapi/pycom/machine/pin +content/firmwareapi/pycom/machine/pin.md +no front matter in file +--- +title: "Pin" +aliases: + - firmwareapi/pycom/machine/pin.html + - firmwareapi/pycom/machine/pin.md + - chapter/firmwareapi/pycom/machine/pin +--- + +compare ./firmwareapi/pycom/machine/timer content/firmwareapi/pycom/machine/timer +content/firmwareapi/pycom/machine/timer.md +no front matter in file +--- +title: "Timer" +aliases: + - firmwareapi/pycom/machine/timer.html + - firmwareapi/pycom/machine/timer.md + - chapter/firmwareapi/pycom/machine/timer +--- + +compare ./firmwareapi/pycom/machine/dac content/firmwareapi/pycom/machine/dac +content/firmwareapi/pycom/machine/dac.md +no front matter in file +--- +title: "DAC" +aliases: + - firmwareapi/pycom/machine/dac.html + - firmwareapi/pycom/machine/dac.md + - chapter/firmwareapi/pycom/machine/dac +--- + +compare ./firmwareapi/pycom/machine/wdt content/firmwareapi/pycom/machine/wdt +content/firmwareapi/pycom/machine/wdt.md +no front matter in file +--- +title: "WDT" +aliases: + - firmwareapi/pycom/machine/wdt.html + - firmwareapi/pycom/machine/wdt.md + - chapter/firmwareapi/pycom/machine/wdt +--- + +content/firmwareapi/pycom/machine/_index.md +no front matter in file +--- +title: "machine" +aliases: +--- + +compare ./firmwareapi/pycom/machine/i2c content/firmwareapi/pycom/machine/i2c +content/firmwareapi/pycom/machine/i2c.md +no front matter in file +--- +title: "I2C" +aliases: + - firmwareapi/pycom/machine/i2c.html + - firmwareapi/pycom/machine/i2c.md + - chapter/firmwareapi/pycom/machine/i2c +--- + diff --git a/migration.py b/migration.py new file mode 100644 index 0000000..d9dbf3f --- /dev/null +++ b/migration.py @@ -0,0 +1,296 @@ +import os +import sys +# import urllib.request +import os.path +import mistune +import xml.etree.ElementTree as ET +from lxml import etree +from io import StringIO +from shutil import copyfile +import re + +weights = { '': 10 } # per level weight in toc +prev_ident = "" +SUMMARY="content/SUMMARY.md" +KEY_SEP="@" +SRC_URL = '/' # 'https://development.pycom.io/' + +def _list_content(): + import glob + from pathlib import Path + return [f for f in Path('content').glob('**/*.md')] + [f for f in Path('content').glob('**/*.html')] + +def _parse_file(filename): + text = "" + with open(filename) as fp: + line = fp.readline() + cnt = 1 + while line: + line = _parse_line(filename, fp.readline()) + cnt += 1 + text += line + return text + +def _make_index(src): + dst = './content/' + '/'.join(src.split('/')[:-1]) + '/_index.md' + src = './content/' + src + # print('# copy:', src , '-->' ,dst) + try: + copyfile(src, dst) + except Exception as e: + print('# ', e) + + +def _make_key(url): + if url.endswith('README.md') or url.endswith('introduction.md'): + _make_index(url) + return KEY_SEP.join(url.split('/')[:-1]) + else: + return KEY_SEP.join(url.split("/")).replace(".md","") + + +def _make_parent(key, level): + return KEY_SEP.join(key.split(KEY_SEP)[-2 - level:-1]) + +w = 10 +prev_level = 1 + +def _traverse(root, nodes, last_h2): + global weights + weight = 10 + parent = root + + for node in nodes: + # w = w + 10 + if node.text: + if node.attrib.has_key('href'): + url = node.attrib['href'] + key = _make_key(url) + name = root.text + '>' + node.text + name = node.text + if node.text == "Introduction": + name = last_h2 + else: + name = node.text + # last_h2=node.text + + parent = _make_parent(key, _traverse.level) + # print(etree.tostring(root, pretty_print=True).decode()) + + weight_key = parent + if weight_key in weights: + weights[weight_key] = weights[weight_key] + 10 + else: + weights[weight_key] = 10 + url =SRC_URL + url.replace('introduction.md', '/').replace('README.md', '/').replace('.md', '/') + # print('#', traverse.level * ' ',weights[weight_key] , '>',key, node.text) + # print('#', traverse.level * ' ',weights[traverse.level] , traverse.level, root.text, '>', node.text,'[', url,']') + print(_write_toc(key, name, url, parent, weights[weight_key])) + + else: + if node.tag == 'h2': + w= 0 + last_h2 = node.text + print('# ***', last_h2) + + _traverse.level += 1 + + + _traverse(parent, list(node), last_h2) + # weights[traverse.level]= 10 + if node.text: + parent = node + _traverse.level -= 1 + + +def _write_toc(key, name, url, parent, weight): + toc ="" + toc += "[[menu.main]]\n" + toc += " name = \"%s\"\n" % name.replace("\\","") # remove escapes + toc += " url = \"%s\"\n" % url + toc += " identifier = \"%s\"\n" % key + if parent: + toc += " parent = \"%s\"\n" % parent + toc += " weight = %s\n" % weight + return toc + +def _override_file(f, text): + file = open(f,"w") + file.write(text) + file.close() + +def _parse_line(f, line): + + if "{% page-ref " in line: + # {% page-ref page="development/wipy2.md" %} + # --> + # {{< refname "development/wipy2.md" >}} + line = line.replace("{% page-ref page=", "{{% refname ") + line = line.replace("%}", "%}}") + + if "{% hint" in line: + line = line.replace("{%", "{{%") + line = line.replace("%}", "%}}") + + if "endhint" in line: + # {% endhint %} --> {{% /hint %}} + line = line.replace("endhint", "/hint") + line = line.replace("{%", "{{<") + line = line.replace("%}", ">}}") + + if ".md)" in line: + line = line.replace(".md)", ")") + + return line + +def _find_title(filename): + with open(SUMMARY) as fp: + line = fp.readline() + cnt = 1 + print(filename) + while line: + # filename was a python3 POSIXFile object + filename = str(filename).replace("_index.md", "README.md") + + if str(filename)[8:].replace('.md','') in line: + # result is beetween [] + result = re.search('\[(.*)\]', line) + if result is not None: + return result.group(1).replace("\\","") + line = fp.readline() + print("title not found for", filename) + + return "" + + +# def _find_title(filename): +# with open(SUMMARY) as fp: +# line = fp.readline() +# cnt = 1 +# while line: +# if line.startswith('#'): +# print(filename, line) +# return line.replace('#', '').strip() +# line = fp.readline() +# print("title not found for", filename) +# # sys.exit(1) +# return "" + +def _remove_front_matters(file_path): + file = open(file_path, "r") + line = file.readline() + # check if first line contains '---' + if not line.startswith("---"): + print("no front matter in file") + return + i = 0 + line = "" + # skip until next '---' + while not line.startswith('---'): + line = file.readline() + i = i + 1 + # recopy content + output_path = '%s.output' % file_path + with open(output_path, 'wb') as out_file: + out_file.write(line.encode()) + while line: + line = file.readline() + out_file.write(line.encode()) + # move to original filemame + os.rename(output_path, file_path) + +def _make_front_matters(title, urls): + fm ="" + fm+= "---\n" + fm += "title: \"%s\"\n" % title.replace("\\","") # remove escapes if any + # + fm += "aliases:\n" + for url in urls: + fm += " - %s\n" % url + fm += "---\n" + print(fm) + return fm + +import json +def _write_front_matters(file_path, title, urls): + # remove possible existing front matters tags + _remove_front_matters(file_path) + # load the gitbook redirects.json + # open a tmp file + output_path = '%s.output' % file_path + with open(output_path, 'wb') as out_file: + # write the front matter tags in blank file + out_file.write(_make_front_matters(title, urls).encode()) + # recopy the rest of the file + with open(file_path, 'r') as in_file: + out_file.write(in_file.read().encode()) + # delete tmp file and place new one + os.rename(output_path, file_path) + + +# callable public methods + +def load_sumary(): + markdown = mistune.Markdown() + f = open(SUMMARY) + parser = etree.HTMLParser() + tree = etree.parse(StringIO(markdown(f.read())), parser) + uls = tree.xpath("//body/*") + _traverse.level = 1 + _traverse(tree.xpath("//body/*")[0], uls,'') + return tree + +def parse_files(): + text = "" + for f in _list_content(): + text = _parse_file(f) + _override_file(f, text) + +def _make_urls(file_path, redirects): + urls = [] + if not (str(file_path).endswith("_index.md") or str(file_path).endswith("README.md")): + urls.append(str(file_path)[8:].replace(".md", ".html")) + urls.append(str(file_path)[8:]) + for r in redirects['redirects']: + if 'to' in r: + r['to'] = r['to'].replace(".html", "") #[2:] + r['to'] = r['to'].replace(".html", "") + file_path = str(file_path).replace(".md", "") #[8:] + + if r['to'][2:] == file_path[8:]: + print("compare %s %s" % (r['to'], file_path)) + urls.append(r["from"]) + return urls + +def write_all_front_matters(): + with open("redirects.json", "r") as read_file: + redirects = json.load(read_file) + for f in _list_content(): + urls = _make_urls(f, redirects) + title = _find_title(f) + _write_front_matters(f, title, urls) + + + +load_sumary() +parse_files() +write_all_front_matters() + +# ({{% ref page="../dashboard.md" %}}) +# {% content "fifth" %} +# {% content "first" %} +# {% content "forth" %} +# {% content "second" %} +# {% content "third" %} +# {% endhint %} +# {% endtabs %} +# {% hint style="danger" %} +# {% hint style="info" %} +# {% hint style="warning" %} +# {% page-ref page="../../pymakr/installation/atom.md" %} +# {% tabs first="Exp Board 2.0", second="Exp Board 3.0" %} +# {% tabs first="Exp Board 2.0", second="Exp Board 3.0", third="Pytrack/Pysense/Pyscan", forth="USB UART Adapter", fifth="WiFi" %} +# {% tabs first="Exp Board 2.0", second="Exp Board 3.0", third="Pytrack/Pysense/Pyscan", fourth="USB UART Adapter", fifth="WiFi" %} +# {% tabs first="Exp Board 2.0", second="Exp Board 3.0", third="Pytrack/Pysense/Pyscan", fourth="USB UART Adapter", fifth="Wifi" %} +# {{% /hint %}} +# {{% hint style="info" %}} diff --git a/pybytes/connect/README.md b/pybytes/connect/README.md deleted file mode 100644 index 0e1b93f..0000000 --- a/pybytes/connect/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# Add a device to Pybytes - -In this section, we will explain to you how to add a device to Pybytes - -## Step 1: Add device wizard - -In Pybytes, go to `Devices` Page: - -1. Click on `Add Device`. - -![](../../.gitbook/assets/1-1.jpg) - -2. Select your device \(e.g., WiPy, LoPy, SiPy, etc.\); - -![](../../.gitbook/assets/2-1.jpg) - -3. Select your shield \(e.g., PySense, PyTrack, PyScan or other\); - -![](../../.gitbook/assets/3%20%281%29.jpg) - -4. Select your network option; - -![](../../.gitbook/assets/4%20%281%29.jpg) - -5. Enter a unique name and the network credentials \(SSID and password\) for your device; - -![](../../.gitbook/assets/5-1.jpg) - -## Step 2: Connect your device to Pybytes - -At the end of the "Add Device" wizard, Pybytes will give you two options for you to connect your device to Pybytes: - -![](../../.gitbook/assets/7-1.png) - -Select how you would like to connect your device to Pybytes: - -1. [Connect your device quickly \(Recommended\)](quick.md) - -{% page-ref page="quick.md" %} - -2. [Connect your device by flashing Pybytes Library](flash.md) - -{% page-ref page="flash.md" %} - -{% hint style="info" %} -From firmware 1.16.x onwards all Pycom devices come with Pybytes library built-in `/frozen` folder. That means that you can choose between adding your device quickly with the firmware updater or you can flash Pybytes library manually. -{% endhint %} - diff --git a/pybytes/integrations/README.md b/pybytes/integrations/README.md deleted file mode 100644 index c3f4664..0000000 --- a/pybytes/integrations/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Integrations - -## Integration with external services - -Pybytes offers a way to interact with external IoT platform or custom services, like the following: - -* [AWS IoT](amazon-iot.md): a managed cloud platform that lets connected devices easily and securely interact with cloud applications and other devices -* [Microsoft Azure](azure.md): it's a comprehensive collection of services and solutions designed to help you create end-to-end IoT applications on Azure. -* [Google Cloud IoT](google.md): a complete set of tools to connect, process, store, and analyze data both at the edge and in the cloud. -* [Web Hooks](webhooks.md): user-defined HTTP callbacks to a defined remote destination. All elements of -the requests (headers, query string parameters, etc) are customizable. diff --git a/redirects.json b/redirects.json new file mode 100644 index 0000000..ddac24c --- /dev/null +++ b/redirects.json @@ -0,0 +1,211 @@ +{ + "redirects": [ + {"from": "chapter/products", "to": "./products.html"}, + {"from": "chapter/gettingstarted", "to": "./gettingstarted/introduction.html"}, + {"from": "getting-started", "to": "./gettingstarted/introduction.html"}, + {"from": "getting-started/introduction", "to": "./gettingstarted/introduction.html"}, + {"from": "chapter/gettingstarted/introduction", "to": "./gettingstarted/introduction.html"}, + {"from": "chapter/gettingstarted/hardwaresetup", "to": "./gettingstarted/connection/README.html"}, + {"from": "chapter/gettingstarted/connection/lopy", "to": "./gettingstarted/connection/lopy.html"}, + {"from": "chapter/gettingstarted/connection/lopy4", "to": "./gettingstarted/connection/lopy4.html"}, + {"from": "chapter/gettingstarted/connection/sipy", "to": "./gettingstarted/connection/sipy.html"}, + {"from": "chapter/gettingstarted/connection/gpy", "to": "./gettingstarted/connection/gpy.html"}, + {"from": "chapter/gettingstarted/connection/fipy", "to": "./gettingstarted/connection/fipy.html"}, + {"from": "chapter/gettingstarted/connection/wipy", "to": "./gettingstarted/connection/wipy.html"}, + {"from": "chapter/gettingstarted/installation/installingsoftware", "to": "./gettingstarted/installation/README.html"}, + {"from": "chapter/gettingstarted/installation/drivers", "to": "./gettingstarted/installation/drivers.html"}, + {"from": "chapter/gettingstarted/installation/firmwaretool", "to": "./gettingstarted/installation/firmwaretool.html"}, + {"from": "chapter/gettingstarted/installation/pymakr", "to": "./gettingstarted/installation/pymakr.html"}, + {"from": "chapter/gettingstarted/programming", "to": "./gettingstarted/programming/README.html"}, + {"from": "chapter/gettingstarted/programming/micropython", "to": "./gettingstarted/programming/micropython.html"}, + {"from": "chapter/gettingstarted/programming/examples", "to": "./gettingstarted/programming/examples.html"}, + {"from": "chapter/gettingstarted/programming/first-project", "to": "./gettingstarted/programming/first-project.html"}, + {"from": "chapter/gettingstarted/programming/repl", "to": "./gettingstarted/programming/repl/README.html"}, + {"from": "chapter/gettingstarted/programming/repl/serial", "to": "./gettingstarted/programming/repl/serial.html"}, + {"from": "chapter/gettingstarted/programming/repl/telnet", "to": "./gettingstarted/programming/repl/telnet.html"}, + {"from": "chapter/gettingstarted/programming/ftp", "to": "./gettingstarted/programming/ftp.html"}, + {"from": "chapter/gettingstarted/programming/safeboot", "to": "./gettingstarted/programming/safeboot.html"}, + {"from": "chapter/gettingstarted/registration/README", "to": "./gettingstarted/registration/README.html"}, + {"from": "chapter/gettingstarted/registration/sigfox", "to": "./gettingstarted/registration/sigfox.html"}, + {"from": "chapter/gettingstarted/registration/cellular", "to": "./gettingstarted/registration/cellular.html"}, + {"from": "chapter/gettingstarted/registration/lora", "to": "./gettingstarted/registration/lora/README.html"}, + {"from": "chapter/gettingstarted/registration/lora/ttn", "to": "./gettingstarted/registration/lora/ttn.html"}, + {"from": "chapter/gettingstarted/registration/lora/objenious", "to": "./gettingstarted/registration/lora/objenious.html"}, + {"from": "chapter/pymakr/installation", "to": "./pymakr/installation/README.html"}, + {"from": "chapter/pymakr/installation/atom", "to": "./pymakr/installation/atom.html"}, + {"from": "chapter/pymakr/installation/vscode", "to": "./pymakr/installation/vscode.html"}, + {"from": "chapter/pymakr/toolsfeatures", "to": "./pymakr/toolsfeatures.html"}, + {"from": "chapter/pymakr/settings", "to": "./pymakr/settings.html"}, + {"from": "chapter/pytrackpysense", "to": "./pytrackpysense/introduction.html"}, + {"from": "chapter/pytrackpysense/installation", "to": "./pytrackpysense/installation/README.html"}, + {"from": "chapter/pytrackpysense/installation/firmware", "to": "./pytrackpysense/installation/firmware.html"}, + {"from": "chapter/pytrackpysense/installation/drivers", "to": "./pytrackpysense/installation/drivers.html"}, + {"from": "chapter/pytrackpysense/installation/libraries", "to": "./pytrackpysense/installation/libraries.html"}, + {"from": "chapter/pytrackpysense/apireference", "to": "./pytrackpysense/apireference/README.html"}, + {"from": "chapter/pytrackpysense/apireference/pytrack", "to": "./pytrackpysense/apireference/pytrack.html"}, + {"from": "chapter/pytrackpysense/apireference/pysense", "to": "./pytrackpysense/apireference/pysense.html"}, + {"from": "chapter/pytrackpysense/apireference/pyscan", "to": "./pytrackpysense/apireference/pyscan.html"}, + {"from": "chapter/pytrackpysense/apireference/sleep", "to": "./pytrackpysense/apireference/sleep.html"}, + {"from": "chapter/tutorials", "to": "./tutorials/introduction.html"}, + {"from": "chapter/tutorials/all", "to": "./tutorials/all/README.html"}, + {"from": "chapter/tutorials/all/repl", "to": "./tutorials/all/repl.html"}, + {"from": "chapter/tutorials/all/wlan", "to": "./tutorials/all/wlan.html"}, + {"from": "chapter/tutorials/all/ble", "to": "./tutorials/all/ble.html"}, + {"from": "chapter/tutorials/all/https", "to": "./tutorials/all/https.html"}, + {"from": "chapter/tutorials/all/mqtt", "to": "./tutorials/all/mqtt.html"}, + {"from": "chapter/tutorials/all/aws", "to": "./tutorials/all/aws.html"}, + {"from": "chapter/tutorials/all/adc", "to": "./tutorials/all/adc.html"}, + {"from": "chapter/tutorials/all/i2c", "to": "./tutorials/all/i2c.html"}, + {"from": "chapter/tutorials/all/owd", "to": "./tutorials/all/owd.html"}, + {"from": "chapter/tutorials/all/threading", "to": "./tutorials/all/threading.html"}, + {"from": "chapter/tutorials/all/rgbled", "to": "./tutorials/all/rgbled.html"}, + {"from": "chapter/tutorials/all/timers", "to": "./tutorials/all/timers.html"}, + {"from": "chapter/tutorials/all/pir", "to": "./tutorials/all/pir.html"}, + {"from": "chapter/tutorials/all/modbus", "to": "./tutorials/all/modbus.html"}, + {"from": "chapter/tutorials/all/ota", "to": "./tutorials/all/ota.html"}, + {"from": "chapter/tutorials/all/rmt", "to": "./tutorials/all/rmt.html"}, + {"from": "chapter/tutorials/all/socket", "to": "./tutorials/all/socket.html"}, + {"from": "chapter/tutorials/lora", "to": "./tutorials/lora/README.html"}, + {"from": "chapter/tutorials/lora/lora-mac", "to": "./tutorials/lora/lora-mac.html"}, + {"from": "chapter/tutorials/lora/lorawan-otaa", "to": "./tutorials/lora/lorawan-otaa.html"}, + {"from": "chapter/tutorials/lora/lorawan-abp", "to": "./tutorials/lora/lorawan-abp.html"}, + {"from": "chapter/tutorials/lora/lora-mac-nano-gateway", "to": "./tutorials/lora/lora-mac-nano-gateway.html"}, + {"from": "chapter/tutorials/lora/module-module", "to": "./tutorials/lora/module-module.html"}, + {"from": "chapter/tutorials/lora/lorawan-nano-gateway", "to": "./tutorials/lora/lorawan-nano-gateway.html"}, + {"from": "chapter/tutorials/lora/rn2483-to-lopy", "to": "./tutorials/lora/rn2483-to-lopy.html"}, + {"from": "chapter/tutorials/lora/lora-mesh", "to": "./tutorials/lora/lora-mesh.html"}, + {"from": "chapter/tutorials/sigfox", "to": "./tutorials/sigfox.html"}, + {"from": "chapter/tutorials/lte", "to": "./tutorials/lte/README.html"}, + {"from": "chapter/tutorials/lte/cat-m1", "to": "./tutorials/lte/cat-m1.html"}, + {"from": "chapter/tutorials/lte/nb-iot", "to": "./tutorials/lte/nb-iot.html"}, + {"from": "chapter/tutorials/lte/imei", "to": "./tutorials/lte/imei.html"}, + {"from": "chapter/tutorials/lte/firmware", "to": "./tutorials/lte/firmware.html"}, + {"from": "chapter/tutorials/pytrack", "to": "./tutorials/pytrack.html"}, + {"from": "chapter/tutorials/pysense", "to": "./tutorials/pysense.html"}, + {"from": "chapter/tutorials/pyscan", "to": "./tutorials/pyscan.html"}, + {"from": "chapter/firmwareapi", "to": "./firmwareapi/introduction.html"}, + {"from": "chapter/firmwareapi/pycom", "to": "./firmwareapi/pycom/README.html"}, + {"from": "chapter/firmwareapi/pycom/machine", "to": "./firmwareapi/pycom/machine/README.html"}, + {"from": "chapter/firmwareapi/pycom/machine/adc", "to": "./firmwareapi/pycom/machine/adc.html"}, + {"from": "chapter/firmwareapi/pycom/machine/dac", "to": "./firmwareapi/pycom/machine/dac.html"}, + {"from": "chapter/firmwareapi/pycom/machine/i2c", "to": "./firmwareapi/pycom/machine/i2c.html"}, + {"from": "chapter/firmwareapi/pycom/machine/pin", "to": "./firmwareapi/pycom/machine/pin.html"}, + {"from": "chapter/firmwareapi/pycom/machine/pwm", "to": "./firmwareapi/pycom/machine/pwm.html"}, + {"from": "chapter/firmwareapi/pycom/machine/rtc", "to": "./firmwareapi/pycom/machine/rtc.html"}, + {"from": "chapter/firmwareapi/pycom/machine/spi", "to": "./firmwareapi/pycom/machine/spi.html"}, + {"from": "chapter/firmwareapi/pycom/machine/uart", "to": "./firmwareapi/pycom/machine/uart.html"}, + {"from": "chapter/firmwareapi/pycom/machine/wdt", "to": "./firmwareapi/pycom/machine/wdt.html"}, + {"from": "chapter/firmwareapi/pycom/machine/timer", "to": "./firmwareapi/pycom/machine/timer.html"}, + {"from": "chapter/firmwareapi/pycom/machine/sd", "to": "./firmwareapi/pycom/machine/sd.html"}, + {"from": "chapter/firmwareapi/pycom/machine/can", "to": "./firmwareapi/pycom/machine/can.html"}, + {"from": "chapter/firmwareapi/pycom/machine/rmt", "to": "./firmwareapi/pycom/machine/rmt.html"}, + {"from": "chapter/firmwareapi/pycom/network", "to": "./firmwareapi/pycom/network/README.html"}, + {"from": "chapter/firmwareapi/pycom/network/wlan", "to": "./firmwareapi/pycom/network/wlan.html"}, + {"from": "chapter/firmwareapi/pycom/network/server", "to": "./firmwareapi/pycom/network/server.html"}, + {"from": "chapter/firmwareapi/pycom/network/bluetooth", "to": "./firmwareapi/pycom/network/bluetooth/README.html"}, + {"from": "chapter/firmwareapi/pycom/network/bluetooth/gatt", "to": "./firmwareapi/pycom/network/bluetooth/gatt.html"}, + {"from": "chapter/firmwareapi/pycom/network/bluetooth/gattsservice", "to": "./firmwareapi/pycom/network/bluetooth/gattsservice.html"}, + {"from": "chapter/firmwareapi/pycom/network/lora", "to": "./firmwareapi/pycom/network/lora.html"}, + {"from": "chapter/firmwareapi/pycom/network/sigfox", "to": "./firmwareapi/pycom/network/sigfox.html"}, + {"from": "chapter/firmwareapi/pycom/network/lte", "to": "./firmwareapi/pycom/network/lte.html"}, + {"from": "chapter/firmwareapi/pycom/aes", "to": "./firmwareapi/pycom/aes.html"}, + {"from": "chapter/firmwareapi/pycom/pycom", "to": "./firmwareapi/pycom/pycom.html"}, + {"from": "chapter/firmwareapi/micropython", "to": "./firmwareapi/micropython/README.html"}, + {"from": "chapter/firmwareapi/micropython/micropython", "to": "./firmwareapi/micropython/micropython.html"}, + {"from": "chapter/firmwareapi/micropython/uctypes", "to": "./firmwareapi/micropython/uctypes.html"}, + {"from": "chapter/firmwareapi/micropython/sys", "to": "./firmwareapi/micropython/sys.html"}, + {"from": "chapter/firmwareapi/micropython/uos", "to": "./firmwareapi/micropython/uos.html"}, + {"from": "chapter/firmwareapi/micropython/array", "to": "./firmwareapi/micropython/array.html"}, + {"from": "chapter/firmwareapi/micropython/cmath", "to": "./firmwareapi/micropython/cmath.html"}, + {"from": "chapter/firmwareapi/micropython/math", "to": "./firmwareapi/micropython/math.html"}, + {"from": "chapter/firmwareapi/micropython/gc", "to": "./firmwareapi/micropython/gc.html"}, + {"from": "chapter/firmwareapi/micropython/ubinascii", "to": "./firmwareapi/micropython/ubinascii.html"}, + {"from": "chapter/firmwareapi/micropython/ujson", "to": "./firmwareapi/micropython/ujson.html"}, + {"from": "chapter/firmwareapi/micropython/ure", "to": "./firmwareapi/micropython/ure.html"}, + {"from": "chapter/firmwareapi/micropython/usocket", "to": "./firmwareapi/micropython/usocket.html"}, + {"from": "chapter/firmwareapi/micropython/select", "to": "./firmwareapi/micropython/select.html"}, + {"from": "chapter/firmwareapi/micropython/utime", "to": "./firmwareapi/micropython/utime.html"}, + {"from": "chapter/firmwareapi/micropython/uhashlib", "to": "./firmwareapi/micropython/uhashlib.html"}, + {"from": "chapter/firmwareapi/micropython/ussl", "to": "./firmwareapi/micropython/ussl.html"}, + {"from": "chapter/firmwareapi/micropython/ucrypto", "to": "./firmwareapi/micropython/ucrypto.html"}, + {"from": "chapter/firmwareapi/micropython/ustruct", "to": "./firmwareapi/micropython/ustruct.html"}, + {"from": "chapter/firmwareapi/micropython/uzlib", "to": "./firmwareapi/micropython/uzlib.html"}, + {"from": "chapter/firmwareapi/micropython/_thread", "to": "./firmwareapi/micropython/_thread.html"}, + {"from": "chapter/firmwareapi/micropython/builtin", "to": "./firmwareapi/micropython/builtin.html"}, + {"from": "chapter/firmwareapi/notes", "to": "./firmwareapi/notes.html"}, + {"from": "product-info", "to": "./datasheets/introduction.html"}, + {"from": "product-info/development", "to": "./datasheets/development/README.html"}, + {"from": "product-info/development/wipy2", "to": "./datasheets/development/wipy2.html"}, + {"from": "product-info/development/wipy3", "to": "./datasheets/development/wipy3.html"}, + {"from": "product-info/development/lopy", "to": "./datasheets/development/lopy.html"}, + {"from": "product-info/development/lopy4", "to": "./datasheets/development/lopy4.html"}, + {"from": "product-info/development/sipy", "to": "./datasheets/development/sipy.html"}, + {"from": "product-info/development/gpy", "to": "./datasheets/development/gpy.html"}, + {"from": "product-info/development/fipy", "to": "./datasheets/development/fipy.html"}, + {"from": "product-info/oem", "to": "./datasheets/oem/README.html"}, + {"from": "product-info/oem/w01", "to": "./datasheets/oem/w01.html"}, + {"from": "product-info/oem/l01", "to": "./datasheets/oem/l01.html"}, + {"from": "product-info/oem/l04", "to": "./datasheets/oem/l04.html"}, + {"from": "product-info/oem/g01", "to": "./datasheets/oem/g01.html"}, + {"from": "product-info/oem/l01_reference", "to": "./datasheets/oem/l01_reference.html"}, + {"from": "product-info/oem/universal_reference", "to": "./datasheets/oem/universal_reference.html"}, + {"from": "product-info/boards", "to": "./datasheets/boards/README.html"}, + {"from": "product-info/boards/expansion3", "to": "./datasheets/boards/expansion3.html"}, + {"from": "product-info/boards/pytrack", "to": "./datasheets/boards/pytrack.html"}, + {"from": "product-info/boards/pysense", "to": "./datasheets/boards/pysense.html"}, + {"from": "product-info/boards/pyscan", "to": "./datasheets/boards/pyscan.html"}, + {"from": "product-info/boards/expansion2", "to": "./datasheets/boards/expansion2.html"}, + {"from": "product-info/boards/deepsleep", "to": "./datasheets/boards/deepsleep/README.html"}, + {"from": "product-info/boards/deepsleep/api", "to": "./datasheets/boards/deepsleep/api.html"}, + {"from": "product-info/notes", "to": "./datasheets/notes.html"}, + {"from": "chapter/datasheets", "to": "./datasheets/introduction.html"}, + {"from": "chapter/datasheets/development", "to": "./datasheets/development/README.html"}, + {"from": "chapter/datasheets/development/wipy2", "to": "./datasheets/development/wipy2.html"}, + {"from": "chapter/datasheets/development/wipy3", "to": "./datasheets/development/wipy3.html"}, + {"from": "chapter/datasheets/development/lopy", "to": "./datasheets/development/lopy.html"}, + {"from": "chapter/datasheets/development/lopy4", "to": "./datasheets/development/lopy4.html"}, + {"from": "chapter/datasheets/development/sipy", "to": "./datasheets/development/sipy.html"}, + {"from": "chapter/datasheets/development/gpy", "to": "./datasheets/development/gpy.html"}, + {"from": "chapter/datasheets/development/fipy", "to": "./datasheets/development/fipy.html"}, + {"from": "chapter/datasheets/oem", "to": "./datasheets/oem/README.html"}, + {"from": "chapter/datasheets/oem/w01", "to": "./datasheets/oem/w01.html"}, + {"from": "chapter/datasheets/oem/l01", "to": "./datasheets/oem/l01.html"}, + {"from": "chapter/datasheets/oem/l04", "to": "./datasheets/oem/l04.html"}, + {"from": "chapter/datasheets/oem/g01", "to": "./datasheets/oem/g01.html"}, + {"from": "chapter/datasheets/oem/l01_reference", "to": "./datasheets/oem/l01_reference.html"}, + {"from": "chapter/datasheets/oem/universal_reference", "to": "./datasheets/oem/universal_reference.html"}, + {"from": "chapter/datasheets/boards", "to": "./datasheets/boards/README.html"}, + {"from": "chapter/datasheets/boards/expansion3", "to": "./datasheets/boards/expansion3.html"}, + {"from": "chapter/datasheets/boards/pytrack", "to": "./datasheets/boards/pytrack.html"}, + {"from": "chapter/datasheets/boards/pysense", "to": "./datasheets/boards/pysense.html"}, + {"from": "chapter/datasheets/boards/pyscan", "to": "./datasheets/boards/pyscan.html"}, + {"from": "chapter/datasheets/boards/expansion2", "to": "./datasheets/boards/expansion2.html"}, + {"from": "chapter/datasheets/boards/deepsleep", "to": "./datasheets/boards/deepsleep/README.html"}, + {"from": "chapter/datasheets/boards/deepsleep/api", "to": "./datasheets/boards/deepsleep/api.html"}, + {"from": "chapter/datasheets/notes", "to": "./datasheets/notes.html"}, + {"from": "chapter/pybytes", "to": "./pybytes/introduction.html"}, + {"from": "chapter/pybytes/getstarted/intro", "to": "./pybytes/getstarted.html"}, + {"from": "chapter/pybytes/connect/intro", "to": "./pybytes/connect/README.html"}, + {"from": "chapter/pybytes/connect/quick", "to": "./pybytes/connect/quick.html"}, + {"from": "chapter/pybytes/connect/flash", "to": "./pybytes/connect/flash.html"}, + {"from": "chapter/pybytes/connect/sigfox/sigfox", "to": "./pybytes/connect/sigfox/README.html"}, + {"from": "chapter/pybytes/connect/sigfox/sigfoxDevKit", "to": "./pybytes/connect/sigfox/devkit.html"}, + {"from": "chapter/pybytes/connect/sigfox/sigfoxCustomContract", "to": "./pybytes/connect/sigfox/custom.html"}, + {"from": "chapter/pybytes/connect/sigfox/README"}, + {"from": "chapter/pybytes/dashboard/intro", "to": "./pybytes/dashboard"}, + {"from": "chapter/docnotes", "to": "./docnotes/introduction.html"}, + {"from": "chapter/docnotes/syntax", "to": "./docnotes/syntax.html"}, + {"from": "chapter/docnotes/replscript", "to": "./docnotes/replscript.html"}, + {"from": "chapter/docnotes/mesh-networks", "to": "./docnotes/mesh-networks.html"}, + {"from": "chapter/advance/downgrade", "to": "./advance/downgrade.html"}, + {"from": "chapter/advance/cli", "to": "./advance/cli.html"}, + {"from": "chapter/advance/encryption", "to": "./advance/encryption.html"}, + {"from": "gettingstarted/wipy.html", "to": "./gettingstarted/connection/wipy.html"}, + {"from": "gettingstarted/lopy.html", "to": "./gettingstarted/connection/lopy.html"}, + {"from": "gettingstarted/sipy.html", "to": "./gettingstarted/connection/sipy.html"}, + {"from": "gettingstarted/gpy.html", "to": "./gettingstarted/connection/gpy.html"}, + {"from": "gettingstarted/fipy.html", "to": "./gettingstarted/connection/fipy.html"}, + {"from": "gettingstarted/lopy4.html", "to": "./gettingstarted/connection/lopy4.html"}, + {"from": "chapter/license", "to": "./license.html"} + ] +} diff --git a/static/.DS_Store b/static/.DS_Store new file mode 100644 index 0000000..f296346 Binary files /dev/null and b/static/.DS_Store differ diff --git a/.gitbook/assets/01 (1).gif b/static/gitbook/assets/01 (1).gif similarity index 100% rename from .gitbook/assets/01 (1).gif rename to static/gitbook/assets/01 (1).gif diff --git a/.gitbook/assets/01 (1).png b/static/gitbook/assets/01 (1).png similarity index 100% rename from .gitbook/assets/01 (1).png rename to static/gitbook/assets/01 (1).png diff --git a/.gitbook/assets/01.gif b/static/gitbook/assets/01.gif similarity index 100% rename from .gitbook/assets/01.gif rename to static/gitbook/assets/01.gif diff --git a/.gitbook/assets/01.png b/static/gitbook/assets/01.png similarity index 100% rename from .gitbook/assets/01.png rename to static/gitbook/assets/01.png diff --git a/.gitbook/assets/01_aws_integration.png b/static/gitbook/assets/01_aws_integration.png similarity index 100% rename from .gitbook/assets/01_aws_integration.png rename to static/gitbook/assets/01_aws_integration.png diff --git a/.gitbook/assets/01_azure_integration.png b/static/gitbook/assets/01_azure_integration.png similarity index 100% rename from .gitbook/assets/01_azure_integration.png rename to static/gitbook/assets/01_azure_integration.png diff --git a/.gitbook/assets/01_google_integration.png b/static/gitbook/assets/01_google_integration.png similarity index 99% rename from .gitbook/assets/01_google_integration.png rename to static/gitbook/assets/01_google_integration.png index 615d1ee..e3a9834 100644 Binary files a/.gitbook/assets/01_google_integration.png and b/static/gitbook/assets/01_google_integration.png differ diff --git a/.gitbook/assets/01_webhook_integration.png b/static/gitbook/assets/01_webhook_integration.png similarity index 100% rename from .gitbook/assets/01_webhook_integration.png rename to static/gitbook/assets/01_webhook_integration.png diff --git a/.gitbook/assets/02 (1).png b/static/gitbook/assets/02 (1).png similarity index 100% rename from .gitbook/assets/02 (1).png rename to static/gitbook/assets/02 (1).png diff --git a/.gitbook/assets/02-1 (1).png b/static/gitbook/assets/02-1 (1).png similarity index 100% rename from .gitbook/assets/02-1 (1).png rename to static/gitbook/assets/02-1 (1).png diff --git a/.gitbook/assets/02-1.gif b/static/gitbook/assets/02-1.gif similarity index 100% rename from .gitbook/assets/02-1.gif rename to static/gitbook/assets/02-1.gif diff --git a/.gitbook/assets/02-1.png b/static/gitbook/assets/02-1.png similarity index 100% rename from .gitbook/assets/02-1.png rename to static/gitbook/assets/02-1.png diff --git a/.gitbook/assets/02.gif b/static/gitbook/assets/02.gif similarity index 100% rename from .gitbook/assets/02.gif rename to static/gitbook/assets/02.gif diff --git a/.gitbook/assets/02.png b/static/gitbook/assets/02.png similarity index 100% rename from .gitbook/assets/02.png rename to static/gitbook/assets/02.png diff --git a/.gitbook/assets/02_aws_integration.png b/static/gitbook/assets/02_aws_integration.png similarity index 100% rename from .gitbook/assets/02_aws_integration.png rename to static/gitbook/assets/02_aws_integration.png diff --git a/.gitbook/assets/02_azure_integration.png b/static/gitbook/assets/02_azure_integration.png similarity index 100% rename from .gitbook/assets/02_azure_integration.png rename to static/gitbook/assets/02_azure_integration.png diff --git a/.gitbook/assets/02_google_integration.png b/static/gitbook/assets/02_google_integration.png similarity index 99% rename from .gitbook/assets/02_google_integration.png rename to static/gitbook/assets/02_google_integration.png index 4630ef8..7741a7c 100644 Binary files a/.gitbook/assets/02_google_integration.png and b/static/gitbook/assets/02_google_integration.png differ diff --git a/.gitbook/assets/02_webhook_integration.png b/static/gitbook/assets/02_webhook_integration.png similarity index 100% rename from .gitbook/assets/02_webhook_integration.png rename to static/gitbook/assets/02_webhook_integration.png diff --git a/.gitbook/assets/03 (1).gif b/static/gitbook/assets/03 (1).gif similarity index 100% rename from .gitbook/assets/03 (1).gif rename to static/gitbook/assets/03 (1).gif diff --git a/.gitbook/assets/03 (2).gif b/static/gitbook/assets/03 (2).gif similarity index 99% rename from .gitbook/assets/03 (2).gif rename to static/gitbook/assets/03 (2).gif index 6e11a62..bfe3535 100644 Binary files a/.gitbook/assets/03 (2).gif and b/static/gitbook/assets/03 (2).gif differ diff --git a/.gitbook/assets/03-1.gif b/static/gitbook/assets/03-1.gif similarity index 99% rename from .gitbook/assets/03-1.gif rename to static/gitbook/assets/03-1.gif index 9a1917f..8b40d21 100644 Binary files a/.gitbook/assets/03-1.gif and b/static/gitbook/assets/03-1.gif differ diff --git a/.gitbook/assets/03-1.png b/static/gitbook/assets/03-1.png similarity index 100% rename from .gitbook/assets/03-1.png rename to static/gitbook/assets/03-1.png diff --git a/.gitbook/assets/03.gif b/static/gitbook/assets/03.gif similarity index 100% rename from .gitbook/assets/03.gif rename to static/gitbook/assets/03.gif diff --git a/.gitbook/assets/03.png b/static/gitbook/assets/03.png similarity index 100% rename from .gitbook/assets/03.png rename to static/gitbook/assets/03.png diff --git a/.gitbook/assets/03_aws_integration.png b/static/gitbook/assets/03_aws_integration.png similarity index 100% rename from .gitbook/assets/03_aws_integration.png rename to static/gitbook/assets/03_aws_integration.png diff --git a/.gitbook/assets/03_azure_integration.png b/static/gitbook/assets/03_azure_integration.png similarity index 100% rename from .gitbook/assets/03_azure_integration.png rename to static/gitbook/assets/03_azure_integration.png diff --git a/.gitbook/assets/03_google_integration.png b/static/gitbook/assets/03_google_integration.png similarity index 100% rename from .gitbook/assets/03_google_integration.png rename to static/gitbook/assets/03_google_integration.png diff --git a/.gitbook/assets/03_webhook_integration.png b/static/gitbook/assets/03_webhook_integration.png similarity index 99% rename from .gitbook/assets/03_webhook_integration.png rename to static/gitbook/assets/03_webhook_integration.png index 9bc20ef..1eb087c 100644 Binary files a/.gitbook/assets/03_webhook_integration.png and b/static/gitbook/assets/03_webhook_integration.png differ diff --git a/.gitbook/assets/04-1.gif b/static/gitbook/assets/04-1.gif similarity index 100% rename from .gitbook/assets/04-1.gif rename to static/gitbook/assets/04-1.gif diff --git a/.gitbook/assets/04-1.png b/static/gitbook/assets/04-1.png similarity index 100% rename from .gitbook/assets/04-1.png rename to static/gitbook/assets/04-1.png diff --git a/.gitbook/assets/04.gif b/static/gitbook/assets/04.gif similarity index 100% rename from .gitbook/assets/04.gif rename to static/gitbook/assets/04.gif diff --git a/.gitbook/assets/04.png b/static/gitbook/assets/04.png similarity index 100% rename from .gitbook/assets/04.png rename to static/gitbook/assets/04.png diff --git a/.gitbook/assets/04_aws_integration.png b/static/gitbook/assets/04_aws_integration.png similarity index 100% rename from .gitbook/assets/04_aws_integration.png rename to static/gitbook/assets/04_aws_integration.png diff --git a/.gitbook/assets/04_azure_integration.png b/static/gitbook/assets/04_azure_integration.png similarity index 99% rename from .gitbook/assets/04_azure_integration.png rename to static/gitbook/assets/04_azure_integration.png index 0199cb2..a652614 100644 Binary files a/.gitbook/assets/04_azure_integration.png and b/static/gitbook/assets/04_azure_integration.png differ diff --git a/.gitbook/assets/04_google_integration.png b/static/gitbook/assets/04_google_integration.png similarity index 100% rename from .gitbook/assets/04_google_integration.png rename to static/gitbook/assets/04_google_integration.png diff --git a/.gitbook/assets/05 (1).png b/static/gitbook/assets/05 (1).png similarity index 100% rename from .gitbook/assets/05 (1).png rename to static/gitbook/assets/05 (1).png diff --git a/.gitbook/assets/05 (2).png b/static/gitbook/assets/05 (2).png similarity index 98% rename from .gitbook/assets/05 (2).png rename to static/gitbook/assets/05 (2).png index e898a3a..0ddfcf6 100644 Binary files a/.gitbook/assets/05 (2).png and b/static/gitbook/assets/05 (2).png differ diff --git a/.gitbook/assets/05-1.png b/static/gitbook/assets/05-1.png similarity index 100% rename from .gitbook/assets/05-1.png rename to static/gitbook/assets/05-1.png diff --git a/.gitbook/assets/05.png b/static/gitbook/assets/05.png similarity index 100% rename from .gitbook/assets/05.png rename to static/gitbook/assets/05.png diff --git a/.gitbook/assets/05_aws_integration.png b/static/gitbook/assets/05_aws_integration.png similarity index 100% rename from .gitbook/assets/05_aws_integration.png rename to static/gitbook/assets/05_aws_integration.png diff --git a/.gitbook/assets/05_azure_integration.png b/static/gitbook/assets/05_azure_integration.png similarity index 100% rename from .gitbook/assets/05_azure_integration.png rename to static/gitbook/assets/05_azure_integration.png diff --git a/.gitbook/assets/05_google_integration.png b/static/gitbook/assets/05_google_integration.png similarity index 99% rename from .gitbook/assets/05_google_integration.png rename to static/gitbook/assets/05_google_integration.png index 9a2e26b..5b65a3e 100644 Binary files a/.gitbook/assets/05_google_integration.png and b/static/gitbook/assets/05_google_integration.png differ diff --git a/.gitbook/assets/06 (1).gif b/static/gitbook/assets/06 (1).gif similarity index 99% rename from .gitbook/assets/06 (1).gif rename to static/gitbook/assets/06 (1).gif index 362c766..994ca20 100644 Binary files a/.gitbook/assets/06 (1).gif and b/static/gitbook/assets/06 (1).gif differ diff --git a/.gitbook/assets/06.gif b/static/gitbook/assets/06.gif similarity index 100% rename from .gitbook/assets/06.gif rename to static/gitbook/assets/06.gif diff --git a/.gitbook/assets/06_aws_integration.png b/static/gitbook/assets/06_aws_integration.png similarity index 100% rename from .gitbook/assets/06_aws_integration.png rename to static/gitbook/assets/06_aws_integration.png diff --git a/.gitbook/assets/06_azure_integration.png b/static/gitbook/assets/06_azure_integration.png similarity index 99% rename from .gitbook/assets/06_azure_integration.png rename to static/gitbook/assets/06_azure_integration.png index 803091a..6bc382f 100644 Binary files a/.gitbook/assets/06_azure_integration.png and b/static/gitbook/assets/06_azure_integration.png differ diff --git a/.gitbook/assets/06_google_integration.png b/static/gitbook/assets/06_google_integration.png similarity index 99% rename from .gitbook/assets/06_google_integration.png rename to static/gitbook/assets/06_google_integration.png index ba371da..717b9b9 100644 Binary files a/.gitbook/assets/06_google_integration.png and b/static/gitbook/assets/06_google_integration.png differ diff --git a/.gitbook/assets/07 (1).png b/static/gitbook/assets/07 (1).png similarity index 100% rename from .gitbook/assets/07 (1).png rename to static/gitbook/assets/07 (1).png diff --git a/.gitbook/assets/07.png b/static/gitbook/assets/07.png similarity index 100% rename from .gitbook/assets/07.png rename to static/gitbook/assets/07.png diff --git a/.gitbook/assets/07_azure_integration.png b/static/gitbook/assets/07_azure_integration.png similarity index 100% rename from .gitbook/assets/07_azure_integration.png rename to static/gitbook/assets/07_azure_integration.png diff --git a/.gitbook/assets/07_google_integration.png b/static/gitbook/assets/07_google_integration.png similarity index 100% rename from .gitbook/assets/07_google_integration.png rename to static/gitbook/assets/07_google_integration.png diff --git a/.gitbook/assets/08_google_integration.png b/static/gitbook/assets/08_google_integration.png similarity index 98% rename from .gitbook/assets/08_google_integration.png rename to static/gitbook/assets/08_google_integration.png index eb51a82..991c105 100644 Binary files a/.gitbook/assets/08_google_integration.png and b/static/gitbook/assets/08_google_integration.png differ diff --git a/.gitbook/assets/1-1.jpg b/static/gitbook/assets/1-1.jpg similarity index 100% rename from .gitbook/assets/1-1.jpg rename to static/gitbook/assets/1-1.jpg diff --git a/.gitbook/assets/1-1.png b/static/gitbook/assets/1-1.png similarity index 100% rename from .gitbook/assets/1-1.png rename to static/gitbook/assets/1-1.png diff --git a/.gitbook/assets/1.jpg b/static/gitbook/assets/1.jpg similarity index 100% rename from .gitbook/assets/1.jpg rename to static/gitbook/assets/1.jpg diff --git a/.gitbook/assets/1.png b/static/gitbook/assets/1.png similarity index 100% rename from .gitbook/assets/1.png rename to static/gitbook/assets/1.png diff --git a/.gitbook/assets/16-213297_expertise_pycom_wipy-2.0r.pdf b/static/gitbook/assets/16-213297_expertise_pycom_wipy-2.0r.pdf similarity index 100% rename from .gitbook/assets/16-213297_expertise_pycom_wipy-2.0r.pdf rename to static/gitbook/assets/16-213297_expertise_pycom_wipy-2.0r.pdf diff --git a/.gitbook/assets/16-213298_expertise_pycom_lopy-1.0r.pdf b/static/gitbook/assets/16-213298_expertise_pycom_lopy-1.0r.pdf similarity index 100% rename from .gitbook/assets/16-213298_expertise_pycom_lopy-1.0r.pdf rename to static/gitbook/assets/16-213298_expertise_pycom_lopy-1.0r.pdf diff --git a/.gitbook/assets/17-210585_expertise_sipy_sipy-1.0.pdf b/static/gitbook/assets/17-210585_expertise_sipy_sipy-1.0.pdf similarity index 100% rename from .gitbook/assets/17-210585_expertise_sipy_sipy-1.0.pdf rename to static/gitbook/assets/17-210585_expertise_sipy_sipy-1.0.pdf diff --git a/.gitbook/assets/17-213356_red-certificate_pycom_l01-1.0.pdf b/static/gitbook/assets/17-213356_red-certificate_pycom_l01-1.0.pdf similarity index 100% rename from .gitbook/assets/17-213356_red-certificate_pycom_l01-1.0.pdf rename to static/gitbook/assets/17-213356_red-certificate_pycom_l01-1.0.pdf diff --git a/.gitbook/assets/17-213357_red-certificate_pycom_w01-1.0.pdf b/static/gitbook/assets/17-213357_red-certificate_pycom_w01-1.0.pdf similarity index 100% rename from .gitbook/assets/17-213357_red-certificate_pycom_w01-1.0.pdf rename to static/gitbook/assets/17-213357_red-certificate_pycom_w01-1.0.pdf diff --git a/.gitbook/assets/17-214126_red-certificate_pycom_wipy-3.0.pdf b/static/gitbook/assets/17-214126_red-certificate_pycom_wipy-3.0.pdf similarity index 100% rename from .gitbook/assets/17-214126_red-certificate_pycom_wipy-3.0.pdf rename to static/gitbook/assets/17-214126_red-certificate_pycom_wipy-3.0.pdf diff --git a/.gitbook/assets/172181407_aa_00_final.pdf b/static/gitbook/assets/172181407_aa_00_final.pdf similarity index 100% rename from .gitbook/assets/172181407_aa_00_final.pdf rename to static/gitbook/assets/172181407_aa_00_final.pdf diff --git a/.gitbook/assets/172181408_aa_00_final.pdf b/static/gitbook/assets/172181408_aa_00_final.pdf similarity index 100% rename from .gitbook/assets/172181408_aa_00_final.pdf rename to static/gitbook/assets/172181408_aa_00_final.pdf diff --git a/.gitbook/assets/172181411_aa_00_final.pdf b/static/gitbook/assets/172181411_aa_00_final.pdf similarity index 100% rename from .gitbook/assets/172181411_aa_00_final.pdf rename to static/gitbook/assets/172181411_aa_00_final.pdf diff --git a/.gitbook/assets/172181413_aa_00_final.pdf b/static/gitbook/assets/172181413_aa_00_final.pdf similarity index 100% rename from .gitbook/assets/172181413_aa_00_final.pdf rename to static/gitbook/assets/172181413_aa_00_final.pdf diff --git a/.gitbook/assets/172181414_aa_00_final.pdf b/static/gitbook/assets/172181414_aa_00_final.pdf similarity index 100% rename from .gitbook/assets/172181414_aa_00_final.pdf rename to static/gitbook/assets/172181414_aa_00_final.pdf diff --git a/.gitbook/assets/2 (1).png b/static/gitbook/assets/2 (1).png similarity index 99% rename from .gitbook/assets/2 (1).png rename to static/gitbook/assets/2 (1).png index 76e2caf..0ee1364 100644 Binary files a/.gitbook/assets/2 (1).png and b/static/gitbook/assets/2 (1).png differ diff --git a/.gitbook/assets/2-1.jpg b/static/gitbook/assets/2-1.jpg similarity index 100% rename from .gitbook/assets/2-1.jpg rename to static/gitbook/assets/2-1.jpg diff --git a/.gitbook/assets/2.jpg b/static/gitbook/assets/2.jpg similarity index 100% rename from .gitbook/assets/2.jpg rename to static/gitbook/assets/2.jpg diff --git a/.gitbook/assets/2.png b/static/gitbook/assets/2.png similarity index 100% rename from .gitbook/assets/2.png rename to static/gitbook/assets/2.png diff --git a/.gitbook/assets/2090acc16_grant.pdf b/static/gitbook/assets/2090acc16_grant.pdf similarity index 100% rename from .gitbook/assets/2090acc16_grant.pdf rename to static/gitbook/assets/2090acc16_grant.pdf diff --git a/.gitbook/assets/2090bcc16_grant.pdf b/static/gitbook/assets/2090bcc16_grant.pdf similarity index 100% rename from .gitbook/assets/2090bcc16_grant.pdf rename to static/gitbook/assets/2090bcc16_grant.pdf diff --git a/.gitbook/assets/2090ccc16_grant.pdf b/static/gitbook/assets/2090ccc16_grant.pdf similarity index 100% rename from .gitbook/assets/2090ccc16_grant.pdf rename to static/gitbook/assets/2090ccc16_grant.pdf diff --git a/.gitbook/assets/2091acc16_grant.pdf b/static/gitbook/assets/2091acc16_grant.pdf similarity index 100% rename from .gitbook/assets/2091acc16_grant.pdf rename to static/gitbook/assets/2091acc16_grant.pdf diff --git a/.gitbook/assets/2091bcc16_grant.pdf b/static/gitbook/assets/2091bcc16_grant.pdf similarity index 100% rename from .gitbook/assets/2091bcc16_grant.pdf rename to static/gitbook/assets/2091bcc16_grant.pdf diff --git a/.gitbook/assets/2mp.png b/static/gitbook/assets/2mp.png similarity index 100% rename from .gitbook/assets/2mp.png rename to static/gitbook/assets/2mp.png diff --git a/.gitbook/assets/3 (1).jpg b/static/gitbook/assets/3 (1).jpg similarity index 100% rename from .gitbook/assets/3 (1).jpg rename to static/gitbook/assets/3 (1).jpg diff --git a/.gitbook/assets/3 (1).png b/static/gitbook/assets/3 (1).png similarity index 99% rename from .gitbook/assets/3 (1).png rename to static/gitbook/assets/3 (1).png index 2ad2dc8..c457112 100644 Binary files a/.gitbook/assets/3 (1).png and b/static/gitbook/assets/3 (1).png differ diff --git a/.gitbook/assets/3.jpg b/static/gitbook/assets/3.jpg similarity index 100% rename from .gitbook/assets/3.jpg rename to static/gitbook/assets/3.jpg diff --git a/.gitbook/assets/3.png b/static/gitbook/assets/3.png similarity index 100% rename from .gitbook/assets/3.png rename to static/gitbook/assets/3.png diff --git a/.gitbook/assets/4 (1).jpg b/static/gitbook/assets/4 (1).jpg similarity index 100% rename from .gitbook/assets/4 (1).jpg rename to static/gitbook/assets/4 (1).jpg diff --git a/.gitbook/assets/4.jpg b/static/gitbook/assets/4.jpg similarity index 100% rename from .gitbook/assets/4.jpg rename to static/gitbook/assets/4.jpg diff --git a/.gitbook/assets/5-1.gif b/static/gitbook/assets/5-1.gif similarity index 100% rename from .gitbook/assets/5-1.gif rename to static/gitbook/assets/5-1.gif diff --git a/.gitbook/assets/5-1.jpg b/static/gitbook/assets/5-1.jpg similarity index 100% rename from .gitbook/assets/5-1.jpg rename to static/gitbook/assets/5-1.jpg diff --git a/.gitbook/assets/5.gif b/static/gitbook/assets/5.gif similarity index 100% rename from .gitbook/assets/5.gif rename to static/gitbook/assets/5.gif diff --git a/.gitbook/assets/5.jpg b/static/gitbook/assets/5.jpg similarity index 100% rename from .gitbook/assets/5.jpg rename to static/gitbook/assets/5.jpg diff --git a/.gitbook/assets/6 (1).png b/static/gitbook/assets/6 (1).png similarity index 100% rename from .gitbook/assets/6 (1).png rename to static/gitbook/assets/6 (1).png diff --git a/.gitbook/assets/6.png b/static/gitbook/assets/6.png similarity index 100% rename from .gitbook/assets/6.png rename to static/gitbook/assets/6.png diff --git a/.gitbook/assets/7 (1).png b/static/gitbook/assets/7 (1).png similarity index 100% rename from .gitbook/assets/7 (1).png rename to static/gitbook/assets/7 (1).png diff --git a/.gitbook/assets/7 (2).png b/static/gitbook/assets/7 (2).png similarity index 100% rename from .gitbook/assets/7 (2).png rename to static/gitbook/assets/7 (2).png diff --git a/.gitbook/assets/7-1.png b/static/gitbook/assets/7-1.png similarity index 100% rename from .gitbook/assets/7-1.png rename to static/gitbook/assets/7-1.png diff --git a/.gitbook/assets/7.png b/static/gitbook/assets/7.png similarity index 100% rename from .gitbook/assets/7.png rename to static/gitbook/assets/7.png diff --git a/.gitbook/assets/8-1.png b/static/gitbook/assets/8-1.png similarity index 100% rename from .gitbook/assets/8-1.png rename to static/gitbook/assets/8-1.png diff --git a/.gitbook/assets/8.png b/static/gitbook/assets/8.png similarity index 100% rename from .gitbook/assets/8.png rename to static/gitbook/assets/8.png diff --git a/.gitbook/assets/accelerometer_visualiser (1).png b/static/gitbook/assets/accelerometer_visualiser (1).png similarity index 100% rename from .gitbook/assets/accelerometer_visualiser (1).png rename to static/gitbook/assets/accelerometer_visualiser (1).png diff --git a/.gitbook/assets/accelerometer_visualiser.png b/static/gitbook/assets/accelerometer_visualiser.png similarity index 100% rename from .gitbook/assets/accelerometer_visualiser.png rename to static/gitbook/assets/accelerometer_visualiser.png diff --git a/.gitbook/assets/apiaccess (1).png b/static/gitbook/assets/apiaccess (1).png similarity index 99% rename from .gitbook/assets/apiaccess (1).png rename to static/gitbook/assets/apiaccess (1).png index 9a22b26..442ceb3 100644 Binary files a/.gitbook/assets/apiaccess (1).png and b/static/gitbook/assets/apiaccess (1).png differ diff --git a/.gitbook/assets/apiaccess.png b/static/gitbook/assets/apiaccess.png similarity index 100% rename from .gitbook/assets/apiaccess.png rename to static/gitbook/assets/apiaccess.png diff --git a/.gitbook/assets/apiaccesskeys (1).png b/static/gitbook/assets/apiaccesskeys (1).png similarity index 100% rename from .gitbook/assets/apiaccesskeys (1).png rename to static/gitbook/assets/apiaccesskeys (1).png diff --git a/.gitbook/assets/apiaccesskeys.png b/static/gitbook/assets/apiaccesskeys.png similarity index 100% rename from .gitbook/assets/apiaccesskeys.png rename to static/gitbook/assets/apiaccesskeys.png diff --git a/.gitbook/assets/apiaccessscope (1).png b/static/gitbook/assets/apiaccessscope (1).png similarity index 99% rename from .gitbook/assets/apiaccessscope (1).png rename to static/gitbook/assets/apiaccessscope (1).png index 0b1d521..1d443d4 100644 Binary files a/.gitbook/assets/apiaccessscope (1).png and b/static/gitbook/assets/apiaccessscope (1).png differ diff --git a/.gitbook/assets/apiaccessscope.png b/static/gitbook/assets/apiaccessscope.png similarity index 100% rename from .gitbook/assets/apiaccessscope.png rename to static/gitbook/assets/apiaccessscope.png diff --git a/.gitbook/assets/apiicon.png b/static/gitbook/assets/apiicon.png similarity index 100% rename from .gitbook/assets/apiicon.png rename to static/gitbook/assets/apiicon.png diff --git a/.gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbk7blltxqntvqzh_-2fpysense_lopy4.png b/static/gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbk7blltxqntvqzh_-2fpysense_lopy4.png similarity index 100% rename from .gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbk7blltxqntvqzh_-2fpysense_lopy4.png rename to static/gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbk7blltxqntvqzh_-2fpysense_lopy4.png diff --git a/.gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbluw130dl1amaklt-2fpytrack_lopy4.png b/static/gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbluw130dl1amaklt-2fpytrack_lopy4.png similarity index 100% rename from .gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbluw130dl1amaklt-2fpytrack_lopy4.png rename to static/gitbook/assets/assets-2f-lifiulge6_ztmmvcuea-2f-lkmxk1kqvbgjpw04i3u-2f-liqbluw130dl1amaklt-2fpytrack_lopy4.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn7x3eyyjifoqpxmzd-l01-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn7x3eyyjifoqpxmzd-l01-1.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn7x3eyyjifoqpxmzd-l01-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn7x3eyyjifoqpxmzd-l01-1.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn80ythqnrgah01r2m-lopy-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn80ythqnrgah01r2m-lopy-1.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn80ythqnrgah01r2m-lopy-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn80ythqnrgah01r2m-lopy-1.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82srvkf3rhetvjpi-fipy-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82srvkf3rhetvjpi-fipy-1.png similarity index 99% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82srvkf3rhetvjpi-fipy-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82srvkf3rhetvjpi-fipy-1.png index b1f7726..6826654 100644 Binary files a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82srvkf3rhetvjpi-fipy-1.png and b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82srvkf3rhetvjpi-fipy-1.png differ diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82uldmpus0lnq1kx-expansion3.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82uldmpus0lnq1kx-expansion3.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82uldmpus0lnq1kx-expansion3.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn82uldmpus0lnq1kx-expansion3.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ejihh1jeasccad-pytrack.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ejihh1jeasccad-pytrack.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ejihh1jeasccad-pytrack.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ejihh1jeasccad-pytrack.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ftusu7mke5ppmd-wipy2-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ftusu7mke5ppmd-wipy2-1.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ftusu7mke5ppmd-wipy2-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83ftusu7mke5ppmd-wipy2-1.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hclnq-gurt2p_m-pysense.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hclnq-gurt2p_m-pysense.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hclnq-gurt2p_m-pysense.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hclnq-gurt2p_m-pysense.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hfia61dsuyojco-pyscan-new.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hfia61dsuyojco-pyscan-new.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hfia61dsuyojco-pyscan-new.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83hfia61dsuyojco-pyscan-new.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (1).png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (1).png similarity index 98% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (1).png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (1).png index c87911b..89ab249 100644 Binary files a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (1).png and b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (1).png differ diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (2).png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (2).png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (2).png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1 (2).png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1.png similarity index 98% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1.png index c87911b..89ab249 100644 Binary files a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1.png and b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn83xkh3nwgrgs_fwq-g01-1.png differ diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85ios3qzh5brsxk2-w01.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85ios3qzh5brsxk2-w01.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85ios3qzh5brsxk2-w01.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85ios3qzh5brsxk2-w01.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85npgnazxzxyv-nu-lopy4-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85npgnazxzxyv-nu-lopy4-1.png similarity index 99% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85npgnazxzxyv-nu-lopy4-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85npgnazxzxyv-nu-lopy4-1.png index f5fb9e8..c7c1dbe 100644 Binary files a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85npgnazxzxyv-nu-lopy4-1.png and b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn85npgnazxzxyv-nu-lopy4-1.png differ diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86hknsrea22r0i-s-l04-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86hknsrea22r0i-s-l04-1.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86hknsrea22r0i-s-l04-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86hknsrea22r0i-s-l04-1.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86jsexys_ho7ct7c-expansion2.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86jsexys_ho7ct7c-expansion2.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86jsexys_ho7ct7c-expansion2.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86jsexys_ho7ct7c-expansion2.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86n8h-hb1oh1idwb-sipy-2.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86n8h-hb1oh1idwb-sipy-2.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86n8h-hb1oh1idwb-sipy-2.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86n8h-hb1oh1idwb-sipy-2.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86pdzbdvrponxeg6-wipy3.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86pdzbdvrponxeg6-wipy3.png similarity index 100% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86pdzbdvrponxeg6-wipy3.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn86pdzbdvrponxeg6-wipy3.png diff --git a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn87yf-xz772800vwc-gpy-1.png b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn87yf-xz772800vwc-gpy-1.png similarity index 99% rename from .gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn87yf-xz772800vwc-gpy-1.png rename to static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn87yf-xz772800vwc-gpy-1.png index a13a77a..d3d638a 100644 Binary files a/.gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn87yf-xz772800vwc-gpy-1.png and b/static/gitbook/assets/assets-lil0igdl11z7jos_jpx-lkn7scqkkkb6tqb3uyo-lkn87yf-xz772800vwc-gpy-1.png differ diff --git a/.gitbook/assets/atom_config_step_2-1.png b/static/gitbook/assets/atom_config_step_2-1.png similarity index 100% rename from .gitbook/assets/atom_config_step_2-1.png rename to static/gitbook/assets/atom_config_step_2-1.png diff --git a/.gitbook/assets/atom_config_step_2.png b/static/gitbook/assets/atom_config_step_2.png similarity index 100% rename from .gitbook/assets/atom_config_step_2.png rename to static/gitbook/assets/atom_config_step_2.png diff --git a/.gitbook/assets/atom_config_step_3 (1).png b/static/gitbook/assets/atom_config_step_3 (1).png similarity index 100% rename from .gitbook/assets/atom_config_step_3 (1).png rename to static/gitbook/assets/atom_config_step_3 (1).png diff --git a/.gitbook/assets/atom_config_step_3.png b/static/gitbook/assets/atom_config_step_3.png similarity index 100% rename from .gitbook/assets/atom_config_step_3.png rename to static/gitbook/assets/atom_config_step_3.png diff --git a/.gitbook/assets/atom_config_step_4 (1).png b/static/gitbook/assets/atom_config_step_4 (1).png similarity index 100% rename from .gitbook/assets/atom_config_step_4 (1).png rename to static/gitbook/assets/atom_config_step_4 (1).png diff --git a/.gitbook/assets/atom_config_step_4.png b/static/gitbook/assets/atom_config_step_4.png similarity index 96% rename from .gitbook/assets/atom_config_step_4.png rename to static/gitbook/assets/atom_config_step_4.png index 62e98d2..47a2174 100644 Binary files a/.gitbook/assets/atom_config_step_4.png and b/static/gitbook/assets/atom_config_step_4.png differ diff --git a/.gitbook/assets/atom_config_step_5 (1).png b/static/gitbook/assets/atom_config_step_5 (1).png similarity index 100% rename from .gitbook/assets/atom_config_step_5 (1).png rename to static/gitbook/assets/atom_config_step_5 (1).png diff --git a/.gitbook/assets/atom_config_step_5.png b/static/gitbook/assets/atom_config_step_5.png similarity index 100% rename from .gitbook/assets/atom_config_step_5.png rename to static/gitbook/assets/atom_config_step_5.png diff --git a/.gitbook/assets/atom_config_step_6 (1).png b/static/gitbook/assets/atom_config_step_6 (1).png similarity index 100% rename from .gitbook/assets/atom_config_step_6 (1).png rename to static/gitbook/assets/atom_config_step_6 (1).png diff --git a/.gitbook/assets/atom_config_step_6.png b/static/gitbook/assets/atom_config_step_6.png similarity index 100% rename from .gitbook/assets/atom_config_step_6.png rename to static/gitbook/assets/atom_config_step_6.png diff --git a/.gitbook/assets/atom_config_step_7 (1).png b/static/gitbook/assets/atom_config_step_7 (1).png similarity index 100% rename from .gitbook/assets/atom_config_step_7 (1).png rename to static/gitbook/assets/atom_config_step_7 (1).png diff --git a/.gitbook/assets/atom_config_step_7.png b/static/gitbook/assets/atom_config_step_7.png similarity index 100% rename from .gitbook/assets/atom_config_step_7.png rename to static/gitbook/assets/atom_config_step_7.png diff --git a/.gitbook/assets/atom_icon.png b/static/gitbook/assets/atom_icon.png similarity index 100% rename from .gitbook/assets/atom_icon.png rename to static/gitbook/assets/atom_icon.png diff --git a/.gitbook/assets/atom_project (1).png b/static/gitbook/assets/atom_project (1).png similarity index 100% rename from .gitbook/assets/atom_project (1).png rename to static/gitbook/assets/atom_project (1).png diff --git a/.gitbook/assets/atom_project.png b/static/gitbook/assets/atom_project.png similarity index 100% rename from .gitbook/assets/atom_project.png rename to static/gitbook/assets/atom_project.png diff --git a/.gitbook/assets/atom_setup_step_1-1.png b/static/gitbook/assets/atom_setup_step_1-1.png similarity index 100% rename from .gitbook/assets/atom_setup_step_1-1.png rename to static/gitbook/assets/atom_setup_step_1-1.png diff --git a/.gitbook/assets/atom_setup_step_1.png b/static/gitbook/assets/atom_setup_step_1.png similarity index 98% rename from .gitbook/assets/atom_setup_step_1.png rename to static/gitbook/assets/atom_setup_step_1.png index bf39619..9eb625b 100644 Binary files a/.gitbook/assets/atom_setup_step_1.png and b/static/gitbook/assets/atom_setup_step_1.png differ diff --git a/.gitbook/assets/atom_setup_step_2-1.png b/static/gitbook/assets/atom_setup_step_2-1.png similarity index 99% rename from .gitbook/assets/atom_setup_step_2-1.png rename to static/gitbook/assets/atom_setup_step_2-1.png index da1636a..22a5c48 100644 Binary files a/.gitbook/assets/atom_setup_step_2-1.png and b/static/gitbook/assets/atom_setup_step_2-1.png differ diff --git a/.gitbook/assets/atom_setup_step_2.png b/static/gitbook/assets/atom_setup_step_2.png similarity index 99% rename from .gitbook/assets/atom_setup_step_2.png rename to static/gitbook/assets/atom_setup_step_2.png index 7ea5093..08367d7 100644 Binary files a/.gitbook/assets/atom_setup_step_2.png and b/static/gitbook/assets/atom_setup_step_2.png differ diff --git a/.gitbook/assets/atom_setup_step_3-1.png b/static/gitbook/assets/atom_setup_step_3-1.png similarity index 100% rename from .gitbook/assets/atom_setup_step_3-1.png rename to static/gitbook/assets/atom_setup_step_3-1.png diff --git a/.gitbook/assets/atom_setup_step_3.png b/static/gitbook/assets/atom_setup_step_3.png similarity index 99% rename from .gitbook/assets/atom_setup_step_3.png rename to static/gitbook/assets/atom_setup_step_3.png index c1e9e4b..068a5e7 100644 Binary files a/.gitbook/assets/atom_setup_step_3.png and b/static/gitbook/assets/atom_setup_step_3.png differ diff --git a/.gitbook/assets/atom_setup_step_4-1.png b/static/gitbook/assets/atom_setup_step_4-1.png similarity index 100% rename from .gitbook/assets/atom_setup_step_4-1.png rename to static/gitbook/assets/atom_setup_step_4-1.png diff --git a/.gitbook/assets/atom_setup_step_4.png b/static/gitbook/assets/atom_setup_step_4.png similarity index 99% rename from .gitbook/assets/atom_setup_step_4.png rename to static/gitbook/assets/atom_setup_step_4.png index 20e1126..40f3bef 100644 Binary files a/.gitbook/assets/atom_setup_step_4.png and b/static/gitbook/assets/atom_setup_step_4.png differ diff --git a/.gitbook/assets/atom_setup_step_5-1.png b/static/gitbook/assets/atom_setup_step_5-1.png similarity index 100% rename from .gitbook/assets/atom_setup_step_5-1.png rename to static/gitbook/assets/atom_setup_step_5-1.png diff --git a/.gitbook/assets/atom_setup_step_5.png b/static/gitbook/assets/atom_setup_step_5.png similarity index 99% rename from .gitbook/assets/atom_setup_step_5.png rename to static/gitbook/assets/atom_setup_step_5.png index f1746b3..ecc1e9d 100644 Binary files a/.gitbook/assets/atom_setup_step_5.png and b/static/gitbook/assets/atom_setup_step_5.png differ diff --git a/.gitbook/assets/barcode.png b/static/gitbook/assets/barcode.png similarity index 100% rename from .gitbook/assets/barcode.png rename to static/gitbook/assets/barcode.png diff --git a/.gitbook/assets/bare_fipy.png b/static/gitbook/assets/bare_fipy.png similarity index 100% rename from .gitbook/assets/bare_fipy.png rename to static/gitbook/assets/bare_fipy.png diff --git a/.gitbook/assets/bare_gpy.png b/static/gitbook/assets/bare_gpy.png similarity index 100% rename from .gitbook/assets/bare_gpy.png rename to static/gitbook/assets/bare_gpy.png diff --git a/.gitbook/assets/bare_lopy.png b/static/gitbook/assets/bare_lopy.png similarity index 100% rename from .gitbook/assets/bare_lopy.png rename to static/gitbook/assets/bare_lopy.png diff --git a/.gitbook/assets/bare_lopy4.png b/static/gitbook/assets/bare_lopy4.png similarity index 100% rename from .gitbook/assets/bare_lopy4.png rename to static/gitbook/assets/bare_lopy4.png diff --git a/.gitbook/assets/bare_sipy.png b/static/gitbook/assets/bare_sipy.png similarity index 99% rename from .gitbook/assets/bare_sipy.png rename to static/gitbook/assets/bare_sipy.png index 4e062cb..9f1c7dc 100644 Binary files a/.gitbook/assets/bare_sipy.png and b/static/gitbook/assets/bare_sipy.png differ diff --git a/.gitbook/assets/bare_wipy.png b/static/gitbook/assets/bare_wipy.png similarity index 100% rename from .gitbook/assets/bare_wipy.png rename to static/gitbook/assets/bare_wipy.png diff --git a/.gitbook/assets/c03-b0-red-final (1).pdf b/static/gitbook/assets/c03-b0-red-final (1).pdf similarity index 100% rename from .gitbook/assets/c03-b0-red-final (1).pdf rename to static/gitbook/assets/c03-b0-red-final (1).pdf diff --git a/.gitbook/assets/c03-b0-red-final.pdf b/static/gitbook/assets/c03-b0-red-final.pdf similarity index 100% rename from .gitbook/assets/c03-b0-red-final.pdf rename to static/gitbook/assets/c03-b0-red-final.pdf diff --git a/.gitbook/assets/datasheetsicon.png b/static/gitbook/assets/datasheetsicon.png similarity index 100% rename from .gitbook/assets/datasheetsicon.png rename to static/gitbook/assets/datasheetsicon.png diff --git a/.gitbook/assets/deepsleep-image-1.jpg b/static/gitbook/assets/deepsleep-image-1.jpg similarity index 100% rename from .gitbook/assets/deepsleep-image-1.jpg rename to static/gitbook/assets/deepsleep-image-1.jpg diff --git a/.gitbook/assets/deepsleep-image.jpg b/static/gitbook/assets/deepsleep-image.jpg similarity index 100% rename from .gitbook/assets/deepsleep-image.jpg rename to static/gitbook/assets/deepsleep-image.jpg diff --git a/.gitbook/assets/deepsleep-pinout (1).png b/static/gitbook/assets/deepsleep-pinout (1).png similarity index 100% rename from .gitbook/assets/deepsleep-pinout (1).png rename to static/gitbook/assets/deepsleep-pinout (1).png diff --git a/.gitbook/assets/deepsleep-pinout.pdf b/static/gitbook/assets/deepsleep-pinout.pdf similarity index 99% rename from .gitbook/assets/deepsleep-pinout.pdf rename to static/gitbook/assets/deepsleep-pinout.pdf index d2b2125..19c5865 100644 --- a/.gitbook/assets/deepsleep-pinout.pdf +++ b/static/gitbook/assets/deepsleep-pinout.pdf @@ -1,5 +1,5 @@ %PDF-1.6 % -1 0 obj <>]/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream +1 0 obj <>]/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream @@ -804,7 +804,7 @@ g޷ TtD2SZ>8B$FHq#[[kS(,y"GHOhu % yOZ9Z:Q*O$/HU*Y0$ y-Υ(#H9hvoQ倽'O<8Cetg`)bU$ݞ7Jz3C2Īu!^ME>o|N~GuNΌq"q c0YxZX'-5N{w]sʁU s쫪Hxޏ 8k vs;k!ywOq;ǝ<:Ey><yYP%i\``9Xq4ZtL0LNTTB*ʠL \yN5iNbkVW^NMȞ8+yyz{|E),cU[r<$yuד>^NO~ zvrf~؟OmaSqWjVމ\ߠv<|{I%Ir qS:gU-g.X5Wˀ~<7UW>ڗOXG_y?qq-><~wOy>Ƈ#i==<`}tΜj.Lv[qvjNTUh/urvqI>dhINkғz5HtSQ=2YnS9ܔHJdO^6XUqJdb#LB1F[9Yc$=Fz Lf^4}ݡ=&7h;OgʴH,j <6g^԰[Vs>xN^E:9JgV@X#cY:\Ag,xpڶb ,iqY];b{&h\E #qk@[-/ġKCݱ1ϳ2H\.er;^qgtq(By;.i#9<=OK}= %2cE ){+ EHS,zKCiM:y#h`3KY#$˸7="Vw荻?oaNJR]UThJcoѺ~fīc}d>Nޢ5Z[|YV+ $7&v$$q-=d#>l ~駶ɻ?ge=f$K;:!Zmu]=џe۩vX闉jx8[NYl(%M g;1RV.Y+dS`nRm2|'-a7ڝݥ7G;S<]9VwmMc &!SC~*,4΅UЧRkW{ wǭlhB v1\<^t ?2KkVQ.l׶m[|҉8|q?O%_ۺ}{O6=t8=I?|Ty?p{oiǜ<=@ - KVqkjw),epdJK3r95ooc-¹QjO c ѡ:mr ̻oWU"5<.#8wLr\XP,=}A^7ݟ[]>(x=܎Orxn=6e*4H%K(Z Zc.3P&]V(zڎٷ&Z%J7TRy],L8)xE%,NQ 9%FiDn;rYf|ㆃB6܋CC;JRyj=zyKr/8N; RkvӏsOIvmH-`9G~3?μyhyyyuo$(FGaRKytպưo2G\bqLЌӶN\;y%a ,IuQ<<ևcgbgcy<瘸y<:$q7<yl%Q7Ȣv#βȲ=\dGdGd<:N̎<Ȏʎ<ȑיQǙQeKie8B:hMJA j;PmARGSWR"y}qڮ܇qNj-F3L"zXmިn` + KVqkjw),epdJK3r95ooc-¹QjO c ѡ:mr ̻oWU"5<.#8wLr\XP,=}A^7ݟ[]>(x=܎Orxn=6e*4H%K(Z Zc.3P&]V(zڎٷ&Z%J7TRy],L8)xE%,NQ 9%FiDn;rYf|ㆃB6܋CC;JRyj=zyKr/8N; RkvӏsOIvmH-`9G~3?μyhyyyuo$(FGaRKytպưo2G\bqLЌӶN\;y%a ,IuQ<<ևcgbgcy<瘸y<:$q7<yl%Q7Ȣv#βȲ=\dGdGd<:N̎<Ȏʎ<ȑיQǙQeKie8B:hMJA j;PmARGSWR"y}qڮ܇qNj-F3L"zXmިn` "lO>V3\Uu \˼6{B;92kB:Oo m"Ux/vSTRfq3'b,7,T[s gy[2MFa&rφ☼x$uRO#zݽx;N2E1ʚg4ΰʔ#ҜjBAdHѱ[۷O{h6(OY;|y'?ygyz#<>xlo'GB&e[ ԤKzf#sY [LOS?8qN~J(J(d#ʙ Ή -yM>|F c9$FȤ״&cg^bhbcǘ:8~qQ)i%#'#?xKO'}=.'~=%:#$t{OZ{AWTw[Je1thF iU}wuzt/W|@~yz+yk/+;uE*1y;lAu>_8u:_y(bk,?0uyn/ƲyʋVڝo'Xq 3XO6J\bn74 &fl{lf3wXhebB]>a.o>]NXʒ};S1SZ>rKRyYct;v *`ogDC*c B[7Ӥ#JD"Dplbo,RSƶЪRYoTz'llXQy]~~*վRxa sMIa%R$u-N}H@vԋۊ,ƃF25ʭ0gṆ3|}㞺,e#q]9ǗfsxÄZzChq';y4kYz\_C,.\nMX2˦tǷ,q,%OOKcwWhXM:_w,1cJ+ -Kߑ27gk/`E_]Q0mTyO?W*Hq'88ԈHr?N'#wO&G7\(Gt_5"ӳ>"״:=^y:̖Yy#i^(~q[K=`WۡOj}yjKqR=ggb/ǂN$8uw<GQ~y_`/2ZV,AuA<ď":X:eʶ]\Jw\^><{SicOG+(3'=4[K8i9Ϗc(3.c<ڂr|=&ɗUG'`YuV}Ǧ)|/`Qy]\yy!Vt\g vy熲qNd9`=!Ե\Q P{ȍ,NG:wv>k({yhyyYct;v *`ogDC*c B[7Ӥ#JD"Dplbo,RSƶЪRYoTz'llXQy]~~*վRxa sMIa%R$u-N}H@vԋۊ,ƃF25ʭ0gṆ3|}㞺,e#q]9ǗfsxÄZzChq';y4kYz\_C,.\nMX2˦tǷ,q,%OOKcwWhXM:_w,1cJ+ -Kߑ27gk/`E_]Q0mTyO?W*Hq'88ԈHr?N'#wO&G7(Gt_5"ӳ>"״:=^y:̖Yy#i^(~q[K=`WۡOj}yjKqR=ggb/ǂN$8uw<GQ~y_`/2ZV,AuA<ď":X:eʶ]\Jw\^><{SicOG+(3'=4[K8i9Ϗc(3.c<ڂr|=&ɗUG'`YuV}Ǧ)|/`Qy]\yy!Vt\g vy熲qNd9`=!Ե\Q P{ȍ,NG:wv>k({yhyHoCIyZ#hzkW$9#h&B'y<ЂI1Gfגbyͧ#g8%Jr,OwoOjDqK<a4U'!|B@+g|:<E)r#*"pZOK-1;m-Ս*k.Z]1Gէw%ך`K z;'zҪ3?s;=w97{TƔ"=&Yer,Qd\NTd8ڷ*j; Z".n)B;6k =u朰ǝ|dͿJggxw^RS{B̥)XzRFrz^դWك=J1-h-ܑxK,7RuqFdžyM_r q \ذN-ޯGCve;^ט9F3ȼ<.'\EU%ąl0z3/<<3O9n:poC-9mi=VS'&{9#V9-(=ʼ9W$t=sir2Ⱥ+~Ai>wP}7qtz? j>/\q"ɜ:AZ1W=K_T+yr[zmBPcOdg9/%I$MwI `z<}"˟I.痒,F]<U-yw|jʼΘx iRu zwleiᖂSƌ VA9.̅/Ku%{ .;oek[A\+t8vBk{-97^eP֬}殎~wzOcͳIl=m,mAb1l$&>ei.OyO?GdC*xģ~N=`R=`cE,4LŞʑͥ1}_RѳVWCҽqvPS4/ 0q"DCOqw[J[;w!zXdn6s'Y*qL͓#< 5i]˟UJp<H @@ -1995,7 +1995,7 @@ J       #",7DP]is}      ! " ! " ! ! !!!!!! !%()'4%@$M#Y#e#p#y$$%%&&''( ( ) ) ) )((((((($'.1&01.<,H+U+a+l+v,~,---../00011000/////#*18:#9,784C2P2\2g3r3{44556666777877766666)1; B D C)@3<>9J8W9b:m;w;;<<<<====>>>== =!="="="="/7 - C JM L% I.D9AE@R@]@gAqAyABBBBCCCCC D D#C%C&C'C'C'C'C'4 > J RUT!Q) N4KAHLGW"Fa#Fk$Gs$G{%G%G%G%H%H%H%H&H&I&I'I)I+H,H,I-I-I-I-9 EQ X[[X#W1 T>QHNR$L\(Le*Kn+Lu+L}+L+L+L,M,M,M,M-M-M.N/N0N1M2M2M2M2M2= + C JM L% I.D9AE@R@]@gAqAyABBBBCCCCC D D#C%C&C'C'C'C'C'4 > J RUT!Q) N4KAHLGW"Fa#Fk$Gs$G{%G%G%G%H%H%H%H&H&I&I'I)I+H,H,I-I-I-I-9 EQ X[[X#W1 T>QHNR$L(Le*Kn+Lu+L}+L+L+L,M,M,M,M-M-M.N/N0N1M2M2M2M2M2= KW] ``__.];YEUN$RW+Q_/Ph0Pp1Pw1P2Q2Q2Q2Q2Q3R3R4R4R5Q6Q7Q7Q7Q7Q7Q7AQ[accef+d8 aC\K#YS+W[1Uc5Uk6Us7Uz7U8U8U8U8U9U9U:U:U;U;T;T;T;T;T;T;EU_dhhjl(k6 g@cI `Q*]X2[_7Yf:XnX>X?X?W?W@W@W@W@W?W?W?W?HXahlmoq&p3m>iGfN(cU1_\8]b<\i?[pAZxAZBZBZCZCZDZDZEZEZEZD~ZD~ZC~ZC~ZC~ZCL[dlprsu#u1r<oElL%hS/dY7b_=_eA^lD]sF]{G]G]H]H}]I|]Iz]Jy]Jx]Iw]Iw]Hw]Gw]Gw]Gw]GP^gotvv y!y/w;tCqK"mQ,iW5f\=cbBahF~`oI|`wKz`Ly`Lw`Mu`Mt`Nr`Np_Op`Np`Lp`Kp`Kp`Kp`Kp`KSakrwyz |}-{9 yBuI rO*oU3kZ;h_B{feHwdkLtcsOrc|PpcQocRmcRkcRicRhbSgcRhcPhcOhcNhcNhcNhcNVcnuz}}+7 }@zHwN'tS1qX:{m]AukbHqhhNmgoRjfxThfUffVdfVcfVafV`fV_fU`fS`fRafQafQafQafQYfqy~(5>F|L$yQ.}vV7vs[@pp_HjneOelkTbktW_j~Y^jY\kX[kXZkXYkWXjVYjUYjTYjSYjSYjSYjS]jt|%2<DK"P+x|U5rzY=kw]FetbM_rhT[ppXXpzYWpYVpXUpWTpVSpVRpURpTRoTSoSSoSSoSSoS`nxĀ"0: BIzN(tS1mW:f~\C`{`KZyfQUxnUSwxWRwVQxUPxTOxROxQNxPMwQMvQMuQMuQMuQMuQdr| ,7 @|GvL$oQ.hV7bZ?[_FUeLQmPOwQNPMOMMLLLKKJJKI~LH}LH}LH}LH}Liwǁ(4}=wDpJ!jO*cT2\X:V]AQdFNlILwIKHKGJEIDICHBGCFEEEEEEEEEo|‡#}0w: qAjHdM%]R-WV5R\;Mc?JkAIvAH@H>G=F;F:E9D:B4>4>4>4}Évpl#g/b7 \>VDPJ KO&GV*D]-Bg-Ar,@~+?*?(>'=&<$<%:'9)9)9)9)ȅ}ofa]'Y0S8 N>IDDJ@Q >Z",=,;+;+<*<*.02~3u3n3h2c/^.Z.V. +w u )s 1q 8o?nElJkPiVh\fcdjcsa}`^][ZYXXX "##!zwuspm$k,i4g:eAdFbLaR_X]_\g[pYzXVUSRQQPP!%'((z'u%q"nl if c(a0_6^=\C[IYOWUV]U eS nR!xP!O!N"L"K!J!I!I!I &)+,|-u,p)l'h%e#b#_#\#$Z$,X$3V$9U$?S$ER$KP%RO%ZM&bL&kJ&vI'H'F'E'D'C&B&B&B%*-/0y0q0l.g,c*_)(Y)V)!T)(Q)/O)5N);L)BJ)HI*OH*WF*_E+iC+sB,A,?,>,=,;+;+<*<*.02~3u3n3h2c/^.Z.V. S.P.M.%K.+I.1F.8E.>C.EB.L@/T?/]>0f<0q;0}91807060505/5.5.135{6r6k6d5_2Z2U3Q3M3J3H3"E3(B3.?24>2;<3B;3J:3R84Z74d55o45|35251504/4/3/302368x9o9g9`8[6U6P7K8H8 E8B8?8&<8,:8288868?58G38O29X19b09n.:z-:-:,:+9*9*8*7*669;u<l<d<]<V;P;K<F=B= ?><>9>#7>*5>02>61>=/>E.>M,>V+?a*?l)?y(?'?'?&?%>$=$<$;9<}=r>i?a?Y?R?J@EAAB\DZIYOXVV]UeSoRyQONMLLKK|tmifdca^\"Z)X/W5U:T@S FQ LP SN -[M dK nJ yH G E D C C B C xohc_][Z W US$Q+P1N7M=KCJJHQGYEbDlBxA?><;:;;~ t!k"d"^ ZWUSQNL J'H-F3E9C@BGAN?V=`<j:v98654344!{#p%g%`%Z$U"R OLJ GEC#A*?0=6<=;D9L8T6^5 h4!t2!1!0!/!- - -.#x&m(d(\(V(Q&M$J"G!C!A!>!,)G*)P)*Z(*d'+q%+~$+#+"*!*!)!)!(%~)r+g-^.V.P.J-E,@+;,7,4, 1,/,-- +-')--(-4&.<%.E$/N#/X"/c!0o 0}00//.--){,o.d0[1S1L1G0A0;06121.2+2)2'3%3$#3+"42 4:4B4L5V5a5n5{5544322,x/l1a2X3P3I3C3=46506,7)7%8 "8 99"9):0:7:@:J:T:_;l;z;::9 877/u2i4^5U6M6F6@7:729-:(;#=>???@&@-@5@=@G@Q @\ @i +[M dK nJ yH G E D C C B C xohc_][Z W US$Q+P1N7M=KCJJHQGYEbDlBxA?><;:;;~ t!k"d"^ ZWUSQNL J'H-F3E9C@BGAN?V=`<j:v98654344!{#p%g%`%Z$U"R OLJ GEC#A*?0=6<=;D9L8T6^5 h4!t2!1!0!/!- - -.#x&m(d((V(Q&M$J"G!C!A!>!,)G*)P)*Z(*d'+q%+~$+#+"*!*!)!)!(%~)r+g-^.V.P.J-E,@+;,7,4, 1,/,-- +-')--(-4&.<%.E$/N#/X"/c!0o 0}00//.--){,o.d0[1S1L1G0A0;06121.2+2)2'3%3$#3+"42 4:4B4L5V5a5n5{5544322,x/l1a2X3P3I3C3=46506,7)7%8 "8 99"9):0:7:@:J:T:_;l;z;::9 877/u2i4^5U6M6F6@7:729-:(;#=>???@&@-@5@=@G@Q @\ @i Aw @@?>== <3q5e7[8Q9J9C9=:7;/=*>%@BDE FF F# F* F1 F:FCFMFXFeFsFFEDCBB{7m9a:W;N<G<@=:=4?,A&C EGI L MMM M&M.M6M?MIMUMaMoM~LKJIHHv;h=]>S?K?D@>@7A0D)F"HKMORSTTT#T*T2T;TETQS]SjSzSRQPONp?dAYBOBHCBC;D3G,I$LOQSVYY Z[[\%\-\6\@[K[X[f[u[ZYXWVkC_EUELFFF?G7J/M'PSVX[^`` abcd!d(d0d:dFdSd`dpcba``_eHZIQIJICJ:M2Q)T!X[^ acfhij klmn"o)o3o?oLnZnim{lkjji_MVMOMHN>Q5U,Y"]adgjloprst @@ -2353,7 +2353,7 @@ hnty} ҹ+8<(>8?G?Uw@bkAl_BuWH|QONZMfLtKJ~J|J{IzOyOyOyOyOyOyOyOyԱ) 15)788Fx8Rl9\a;fY?mRDrNKuKSvI]wHhvGuuFtDsDrDqDpDpDpDpDpDpDpDp֪ʺ" )-(/5w0Ak1Ka3TY7\R;bM@fJFhGMjEUjD]jBgjAri?~h>g=g=f=f=f=f=f=f=f=fڣ̴  $#u&/j(9_*BW-JQ1PK5TH;XE@ZBF[@L\>S\<[\;d[9m[8wZ6Z5Y5Y5Y5Y5Y5Y5Y5Yή½ |rg']0U#7N'=I+BD0EA4H>9J<>K:DL8IL6PL4VL3^L2fK0oK/xJ/xJ/xJ/xJ/xJ/xJ/xJ/xJĸwm c YQ$J*E/@$3<(69,871955:3:;1?VI\U܋fbԁmrxtq|mlmnopӔrӔtҕtҕuҔuӔuӓuӓuӓuӓuӓuӓuӓtq +cZO,!S7.V@:VJETTQO^[JicFthCjBlAlAmBmBmClClDlHkMkQjTjWiXiYjYjYjYjYjYjYjk e[Q+!W6-\?8[HDXRPS\[NfdIrjF}mDoCoCpCpDoEoEoGoLnPnTmWlZl[m[n[n[n[n[n[n[nl f\S+!\4+a=7aFC]POXZ[RdeLokH{pFrErEsEsFsFrGrJqOqTpXp[o\p]q^q^q^q^q^q^q^qm g ^W* b2*g;5gDAdMM^WZWadQlmLwrHuGvFvGvGvIvJuNuStXt[s^s_t`uavavavavavavavni `(h0'n93oC?lKKfTX_^cWimPttLxJyJzKzLzNyOyRxWw\w_waxbyczdzdzdzdzdzdzdzoj ab&n.%t90vBVI\U܋fbԁmrxtq|mlmnopӔrӔtҕtҕuҔuӔuӓuӓuӓuӓuӓuӓuӓtq l} ,7A%I/P8VBߙ\M֒c_͉kpŁq~yxsqqrst˙vϙwϙwИxИxїxіxіxіxіxіxіxіuq o +7A!H)O2U;ڟZIјb]Ǒimo|v{}wvwwxĝy̝z͝z͜zΛzϚyϙyϙyϙyϙyϙyϙyϙvr r+7@H$O+ߪT3դWG˞`Z—gkmzsy}zz{||ɡ|ʠ|˟|̞{͜{Λ{Λ{Λ{Λ{Λ{Λ{Λvs u  *6?GN$ڮM1ЩUEƣ^Xeilxqw}~ǥȤ~ɢ~ʠ}˟}̞}̞}̞}̞}̞}̞}̞wt x  @@ -3327,7 +3327,7 @@ D0 L/ V- a+ n) |' 7G_ q)YhE$1=_k"Qk+3r7kYT]ky鲏vdUD3xz;Bt'5TnYfG"4UcBF*-ݢc9.ѫ~˴~mbĄT4 `df9'O_cP#@-Tz)q k̿wW=&$/;GTs紐s[E1eb'5Pap"GO!l&lN2 'i < ӿxia`gpzʲt_GAʊ[8NjKTnhzղ}qib^YURNKJLPV_j6dE2*b >d,ZT23*C^|/=O`pŽl\OE=5.)$"*7>t/X~Cm$W#* $@^}t 0@Qf}Ռӷ~yuroppsxJ8*! Frn7Z]J:7&d )K..Mlk  1F]vagzrib\WRMJHGGILS^o]',T|+QxAb= +Kno3JcMCWk~ɻcVLE>950,*('(,29JhFt#Jp,4\S4U{},C]}R.BVj~}zyz{B91*%"(Hr@k'.M-S{q"Fl8/Gba"7Lbv||tnjhggigkqx/! 2^I1]p'Rz58_V$> endobj xref 0 52 0000000000 65535 f ++Hfp*9HXh{ƺbK9+7w!LjuP8$'KuO]3WH +>Tnhzղ}qib^YURNKJLPV_j6dE2*b >d,ZT23*C^|/=O`pŽl\OE=5.)$"*7>t/X~Cm$W#* $@^}t 0@Qf}Ռӷ~yuroppsxJ8*! Frn7Z]J:7&d )K..Mlk  1F]vagzrib\WRMJHGGILS^o]',T|+QxAb= +Kno3JcMCWk~ɻcVLE>950,*('(,29JhFt#Jp,4\S4U{},C]}R.BVj~}zyz{B91*%"(Hr@k'.M-S{q"Fl8/Gba"7Lbv||tnjhggigkqx/! 2^I1]p'Rz58_V$> endobj xref 0 52 0000000000 65535 f 0000000016 00000 n 0000000258 00000 n 0000061525 00000 n diff --git a/.gitbook/assets/deepsleep-pinout.png b/static/gitbook/assets/deepsleep-pinout.png similarity index 99% rename from .gitbook/assets/deepsleep-pinout.png rename to static/gitbook/assets/deepsleep-pinout.png index 4ff3c12..f59d058 100644 Binary files a/.gitbook/assets/deepsleep-pinout.png and b/static/gitbook/assets/deepsleep-pinout.png differ diff --git a/.gitbook/assets/deepsleep-schematic.pdf b/static/gitbook/assets/deepsleep-schematic.pdf similarity index 100% rename from .gitbook/assets/deepsleep-schematic.pdf rename to static/gitbook/assets/deepsleep-schematic.pdf diff --git a/.gitbook/assets/devkitcheck (1).png b/static/gitbook/assets/devkitcheck (1).png similarity index 100% rename from .gitbook/assets/devkitcheck (1).png rename to static/gitbook/assets/devkitcheck (1).png diff --git a/.gitbook/assets/devkitcheck.png b/static/gitbook/assets/devkitcheck.png similarity index 100% rename from .gitbook/assets/devkitcheck.png rename to static/gitbook/assets/devkitcheck.png diff --git a/.gitbook/assets/downgrade_gui (1).png b/static/gitbook/assets/downgrade_gui (1).png similarity index 100% rename from .gitbook/assets/downgrade_gui (1).png rename to static/gitbook/assets/downgrade_gui (1).png diff --git a/.gitbook/assets/downgrade_gui.png b/static/gitbook/assets/downgrade_gui.png similarity index 100% rename from .gitbook/assets/downgrade_gui.png rename to static/gitbook/assets/downgrade_gui.png diff --git a/.gitbook/assets/edit-mode (1).gif b/static/gitbook/assets/edit-mode (1).gif similarity index 100% rename from .gitbook/assets/edit-mode (1).gif rename to static/gitbook/assets/edit-mode (1).gif diff --git a/.gitbook/assets/edit-mode.gif b/static/gitbook/assets/edit-mode.gif similarity index 100% rename from .gitbook/assets/edit-mode.gif rename to static/gitbook/assets/edit-mode.gif diff --git a/.gitbook/assets/expansion2 (1).png b/static/gitbook/assets/expansion2 (1).png similarity index 99% rename from .gitbook/assets/expansion2 (1).png rename to static/gitbook/assets/expansion2 (1).png index a2e7f82..069a522 100644 Binary files a/.gitbook/assets/expansion2 (1).png and b/static/gitbook/assets/expansion2 (1).png differ diff --git a/.gitbook/assets/expansion2-pinout-1.png b/static/gitbook/assets/expansion2-pinout-1.png similarity index 100% rename from .gitbook/assets/expansion2-pinout-1.png rename to static/gitbook/assets/expansion2-pinout-1.png diff --git a/.gitbook/assets/expansion2-pinout.pdf b/static/gitbook/assets/expansion2-pinout.pdf similarity index 100% rename from .gitbook/assets/expansion2-pinout.pdf rename to static/gitbook/assets/expansion2-pinout.pdf diff --git a/.gitbook/assets/expansion2-pinout.png b/static/gitbook/assets/expansion2-pinout.png similarity index 100% rename from .gitbook/assets/expansion2-pinout.png rename to static/gitbook/assets/expansion2-pinout.png diff --git a/.gitbook/assets/expansion2-specsheet.pdf b/static/gitbook/assets/expansion2-specsheet.pdf similarity index 100% rename from .gitbook/assets/expansion2-specsheet.pdf rename to static/gitbook/assets/expansion2-specsheet.pdf diff --git a/.gitbook/assets/expansion2.png b/static/gitbook/assets/expansion2.png similarity index 100% rename from .gitbook/assets/expansion2.png rename to static/gitbook/assets/expansion2.png diff --git a/.gitbook/assets/expansion3 (1).png b/static/gitbook/assets/expansion3 (1).png similarity index 99% rename from .gitbook/assets/expansion3 (1).png rename to static/gitbook/assets/expansion3 (1).png index 8dc4600..dc0970d 100644 Binary files a/.gitbook/assets/expansion3 (1).png and b/static/gitbook/assets/expansion3 (1).png differ diff --git a/.gitbook/assets/expansion3-pinout-1.png b/static/gitbook/assets/expansion3-pinout-1.png similarity index 100% rename from .gitbook/assets/expansion3-pinout-1.png rename to static/gitbook/assets/expansion3-pinout-1.png diff --git a/.gitbook/assets/expansion3-pinout.pdf b/static/gitbook/assets/expansion3-pinout.pdf similarity index 99% rename from .gitbook/assets/expansion3-pinout.pdf rename to static/gitbook/assets/expansion3-pinout.pdf index aa0648e..fcf88da 100644 Binary files a/.gitbook/assets/expansion3-pinout.pdf and b/static/gitbook/assets/expansion3-pinout.pdf differ diff --git a/.gitbook/assets/expansion3-pinout.png b/static/gitbook/assets/expansion3-pinout.png similarity index 99% rename from .gitbook/assets/expansion3-pinout.png rename to static/gitbook/assets/expansion3-pinout.png index d809e0c..40591fa 100644 Binary files a/.gitbook/assets/expansion3-pinout.png and b/static/gitbook/assets/expansion3-pinout.png differ diff --git a/.gitbook/assets/expansion3-specsheet-1.pdf b/static/gitbook/assets/expansion3-specsheet-1.pdf similarity index 99% rename from .gitbook/assets/expansion3-specsheet-1.pdf rename to static/gitbook/assets/expansion3-specsheet-1.pdf index b04d39e..aa8e8ae 100644 Binary files a/.gitbook/assets/expansion3-specsheet-1.pdf and b/static/gitbook/assets/expansion3-specsheet-1.pdf differ diff --git a/.gitbook/assets/expansion3.png b/static/gitbook/assets/expansion3.png similarity index 100% rename from .gitbook/assets/expansion3.png rename to static/gitbook/assets/expansion3.png diff --git a/.gitbook/assets/expansion_board_2_fipy.png b/static/gitbook/assets/expansion_board_2_fipy.png similarity index 100% rename from .gitbook/assets/expansion_board_2_fipy.png rename to static/gitbook/assets/expansion_board_2_fipy.png diff --git a/.gitbook/assets/expansion_board_2_gpy.png b/static/gitbook/assets/expansion_board_2_gpy.png similarity index 100% rename from .gitbook/assets/expansion_board_2_gpy.png rename to static/gitbook/assets/expansion_board_2_gpy.png diff --git a/.gitbook/assets/expansion_board_2_lopy.png b/static/gitbook/assets/expansion_board_2_lopy.png similarity index 100% rename from .gitbook/assets/expansion_board_2_lopy.png rename to static/gitbook/assets/expansion_board_2_lopy.png diff --git a/.gitbook/assets/expansion_board_2_lopy4.png b/static/gitbook/assets/expansion_board_2_lopy4.png similarity index 100% rename from .gitbook/assets/expansion_board_2_lopy4.png rename to static/gitbook/assets/expansion_board_2_lopy4.png diff --git a/.gitbook/assets/expansion_board_2_sipy.png b/static/gitbook/assets/expansion_board_2_sipy.png similarity index 100% rename from .gitbook/assets/expansion_board_2_sipy.png rename to static/gitbook/assets/expansion_board_2_sipy.png diff --git a/.gitbook/assets/expansion_board_2_wipy.png b/static/gitbook/assets/expansion_board_2_wipy.png similarity index 99% rename from .gitbook/assets/expansion_board_2_wipy.png rename to static/gitbook/assets/expansion_board_2_wipy.png index 39ca876..3a8c81e 100644 Binary files a/.gitbook/assets/expansion_board_2_wipy.png and b/static/gitbook/assets/expansion_board_2_wipy.png differ diff --git a/.gitbook/assets/expansion_board_3_fipy.png b/static/gitbook/assets/expansion_board_3_fipy.png similarity index 100% rename from .gitbook/assets/expansion_board_3_fipy.png rename to static/gitbook/assets/expansion_board_3_fipy.png diff --git a/.gitbook/assets/expansion_board_3_gpy.png b/static/gitbook/assets/expansion_board_3_gpy.png similarity index 100% rename from .gitbook/assets/expansion_board_3_gpy.png rename to static/gitbook/assets/expansion_board_3_gpy.png diff --git a/.gitbook/assets/expansion_board_3_lopy.png b/static/gitbook/assets/expansion_board_3_lopy.png similarity index 100% rename from .gitbook/assets/expansion_board_3_lopy.png rename to static/gitbook/assets/expansion_board_3_lopy.png diff --git a/.gitbook/assets/expansion_board_3_lopy4.png b/static/gitbook/assets/expansion_board_3_lopy4.png similarity index 100% rename from .gitbook/assets/expansion_board_3_lopy4.png rename to static/gitbook/assets/expansion_board_3_lopy4.png diff --git a/.gitbook/assets/expansion_board_3_sipy.png b/static/gitbook/assets/expansion_board_3_sipy.png similarity index 100% rename from .gitbook/assets/expansion_board_3_sipy.png rename to static/gitbook/assets/expansion_board_3_sipy.png diff --git a/.gitbook/assets/expansion_board_3_wipy.png b/static/gitbook/assets/expansion_board_3_wipy.png similarity index 100% rename from .gitbook/assets/expansion_board_3_wipy.png rename to static/gitbook/assets/expansion_board_3_wipy.png diff --git a/.gitbook/assets/filezilla-settings-1 (1).png b/static/gitbook/assets/filezilla-settings-1 (1).png similarity index 100% rename from .gitbook/assets/filezilla-settings-1 (1).png rename to static/gitbook/assets/filezilla-settings-1 (1).png diff --git a/.gitbook/assets/filezilla-settings-1.png b/static/gitbook/assets/filezilla-settings-1.png similarity index 100% rename from .gitbook/assets/filezilla-settings-1.png rename to static/gitbook/assets/filezilla-settings-1.png diff --git a/.gitbook/assets/filezilla-settings-2 (1).png b/static/gitbook/assets/filezilla-settings-2 (1).png similarity index 100% rename from .gitbook/assets/filezilla-settings-2 (1).png rename to static/gitbook/assets/filezilla-settings-2 (1).png diff --git a/.gitbook/assets/filezilla-settings-2.png b/static/gitbook/assets/filezilla-settings-2.png similarity index 100% rename from .gitbook/assets/filezilla-settings-2.png rename to static/gitbook/assets/filezilla-settings-2.png diff --git a/.gitbook/assets/fingerprint.png b/static/gitbook/assets/fingerprint.png similarity index 100% rename from .gitbook/assets/fingerprint.png rename to static/gitbook/assets/fingerprint.png diff --git a/.gitbook/assets/fipy (1).png b/static/gitbook/assets/fipy (1).png similarity index 100% rename from .gitbook/assets/fipy (1).png rename to static/gitbook/assets/fipy (1).png diff --git a/.gitbook/assets/fipy-1.png b/static/gitbook/assets/fipy-1.png similarity index 99% rename from .gitbook/assets/fipy-1.png rename to static/gitbook/assets/fipy-1.png index 6c1e2d3..60ed14d 100644 Binary files a/.gitbook/assets/fipy-1.png and b/static/gitbook/assets/fipy-1.png differ diff --git a/.gitbook/assets/fipy-pinout.pdf b/static/gitbook/assets/fipy-pinout.pdf similarity index 100% rename from .gitbook/assets/fipy-pinout.pdf rename to static/gitbook/assets/fipy-pinout.pdf diff --git a/.gitbook/assets/fipy-pinout.png b/static/gitbook/assets/fipy-pinout.png similarity index 100% rename from .gitbook/assets/fipy-pinout.png rename to static/gitbook/assets/fipy-pinout.png diff --git a/.gitbook/assets/fipy-specsheet-1.pdf b/static/gitbook/assets/fipy-specsheet-1.pdf similarity index 100% rename from .gitbook/assets/fipy-specsheet-1.pdf rename to static/gitbook/assets/fipy-specsheet-1.pdf diff --git a/.gitbook/assets/fipy.png b/static/gitbook/assets/fipy.png similarity index 100% rename from .gitbook/assets/fipy.png rename to static/gitbook/assets/fipy.png diff --git a/.gitbook/assets/fipy_c03-b0-red-final.pdf b/static/gitbook/assets/fipy_c03-b0-red-final.pdf similarity index 99% rename from .gitbook/assets/fipy_c03-b0-red-final.pdf rename to static/gitbook/assets/fipy_c03-b0-red-final.pdf index bb447df..dcf3e8c 100644 Binary files a/.gitbook/assets/fipy_c03-b0-red-final.pdf and b/static/gitbook/assets/fipy_c03-b0-red-final.pdf differ diff --git a/.gitbook/assets/firmware-update (1).png b/static/gitbook/assets/firmware-update (1).png similarity index 99% rename from .gitbook/assets/firmware-update (1).png rename to static/gitbook/assets/firmware-update (1).png index 214c855..ca6c535 100644 Binary files a/.gitbook/assets/firmware-update (1).png and b/static/gitbook/assets/firmware-update (1).png differ diff --git a/.gitbook/assets/firmware-update (2).png b/static/gitbook/assets/firmware-update (2).png similarity index 100% rename from .gitbook/assets/firmware-update (2).png rename to static/gitbook/assets/firmware-update (2).png diff --git a/.gitbook/assets/firmware-update-2.png b/static/gitbook/assets/firmware-update-2.png similarity index 100% rename from .gitbook/assets/firmware-update-2.png rename to static/gitbook/assets/firmware-update-2.png diff --git a/.gitbook/assets/firmware-update.png b/static/gitbook/assets/firmware-update.png similarity index 100% rename from .gitbook/assets/firmware-update.png rename to static/gitbook/assets/firmware-update.png diff --git a/.gitbook/assets/fwupdater (1).png b/static/gitbook/assets/fwupdater (1).png similarity index 100% rename from .gitbook/assets/fwupdater (1).png rename to static/gitbook/assets/fwupdater (1).png diff --git a/.gitbook/assets/fwupdater.png b/static/gitbook/assets/fwupdater.png similarity index 100% rename from .gitbook/assets/fwupdater.png rename to static/gitbook/assets/fwupdater.png diff --git a/.gitbook/assets/g01-1.png b/static/gitbook/assets/g01-1.png similarity index 100% rename from .gitbook/assets/g01-1.png rename to static/gitbook/assets/g01-1.png diff --git a/.gitbook/assets/g01-drawing.pdf b/static/gitbook/assets/g01-drawing.pdf similarity index 100% rename from .gitbook/assets/g01-drawing.pdf rename to static/gitbook/assets/g01-drawing.pdf diff --git a/.gitbook/assets/g01-pinout.pdf b/static/gitbook/assets/g01-pinout.pdf similarity index 100% rename from .gitbook/assets/g01-pinout.pdf rename to static/gitbook/assets/g01-pinout.pdf diff --git a/.gitbook/assets/g01-pinout.png b/static/gitbook/assets/g01-pinout.png similarity index 100% rename from .gitbook/assets/g01-pinout.png rename to static/gitbook/assets/g01-pinout.png diff --git a/.gitbook/assets/g01-specsheet.pdf b/static/gitbook/assets/g01-specsheet.pdf similarity index 100% rename from .gitbook/assets/g01-specsheet.pdf rename to static/gitbook/assets/g01-specsheet.pdf diff --git a/.gitbook/assets/g01.png b/static/gitbook/assets/g01.png similarity index 100% rename from .gitbook/assets/g01.png rename to static/gitbook/assets/g01.png diff --git a/.gitbook/assets/getting_started (1).png b/static/gitbook/assets/getting_started (1).png similarity index 99% rename from .gitbook/assets/getting_started (1).png rename to static/gitbook/assets/getting_started (1).png index 0264fae..e71b2b4 100644 Binary files a/.gitbook/assets/getting_started (1).png and b/static/gitbook/assets/getting_started (1).png differ diff --git a/.gitbook/assets/getting_started.png b/static/gitbook/assets/getting_started.png similarity index 96% rename from .gitbook/assets/getting_started.png rename to static/gitbook/assets/getting_started.png index 490c1b4..432a2f5 100644 Binary files a/.gitbook/assets/getting_started.png and b/static/gitbook/assets/getting_started.png differ diff --git a/.gitbook/assets/gpy (1).png b/static/gitbook/assets/gpy (1).png similarity index 100% rename from .gitbook/assets/gpy (1).png rename to static/gitbook/assets/gpy (1).png diff --git a/.gitbook/assets/gpy-1.png b/static/gitbook/assets/gpy-1.png similarity index 100% rename from .gitbook/assets/gpy-1.png rename to static/gitbook/assets/gpy-1.png diff --git a/.gitbook/assets/gpy-pinout.pdf b/static/gitbook/assets/gpy-pinout.pdf similarity index 100% rename from .gitbook/assets/gpy-pinout.pdf rename to static/gitbook/assets/gpy-pinout.pdf diff --git a/.gitbook/assets/gpy-pinout.png b/static/gitbook/assets/gpy-pinout.png similarity index 100% rename from .gitbook/assets/gpy-pinout.png rename to static/gitbook/assets/gpy-pinout.png diff --git a/.gitbook/assets/gpy-specsheet.pdf b/static/gitbook/assets/gpy-specsheet.pdf similarity index 99% rename from .gitbook/assets/gpy-specsheet.pdf rename to static/gitbook/assets/gpy-specsheet.pdf index 48c62aa..9560a3d 100644 --- a/.gitbook/assets/gpy-specsheet.pdf +++ b/static/gitbook/assets/gpy-specsheet.pdf @@ -746,7 +746,7 @@ Gŭh   5?VM|7NDT :dOx`Qn9ȾS>1$7+QסּgC$h&,wbGnQ|A_DVrc7^V3M#!1zؘDwiIJ?зheLr X<6ؽz$9A7aЍ '5 -C)ѳvN'=4ӓOc*;O)aƽM7MM>jSڜ`ߔGP&}FPG@*5BkF;#EwpY_wQe~pw Z_6!H-ujcيCLOϑzMtΏ<\(5U hd z'#EP6 {u09,>fz +C)ѳvN'=4ӓOc*;O)aƽM7MM>jSڜ`ߔGP&}FPG@*5BkF;#EwpY_wQe~pw Z_6!H-ujcيCLOϑzMtΏ<(5U hd z'#EP6 {u09,>fz C^F}Z$rk`|4p D64]Ʌ!S'H%l_n5ylKv?M ׺DU߯le+կ6z譟J0?ff/ T )>*X'$\>WfcYm0 &uB]W:NPTLnJodjoPXZ6HN@sLI 2.H<? hf5ísz!WRe0f4ޥ}YgVpP9/W.p^/PRYqv7&Cu8VYTjD)/g+J'Bˤ*s06ZUzjx+j%H*6I=a y.|,ZZFj?`(;J,5 iS`"L|zm 688EfjZ"-A=h^w;Sy)^F%%b'<;*h_#{s _ MXUَ]plI򫕿hkf74^OM( yꄓM*4wvlv-gqhk2$ e(z|;qYy/0bT% oIR$[ (*r~i4 /& hS{3tߑҦN6[nPQlpQ+CBME_5 y0 -i"k9Kw9/aDRKB l( 5X8yl=D)d__EQPYh s}[k n1-<]cL$Io\(np.uw FIPbɥ^.0>-Pɞ~*quw)b%$VVf=>ab/\cCھN]h&9l ֟waߔ`iL}JNLF\ QhEYvu6pk:cR}ȈR.sb;^1S9]<#Ǥ p"4DwMrEV@&B8G 2t:ԚE97 %~Nxr-[`8%W EKRC $BȐ+?bIx/z[K$֧o3$tKg(3\ +e^V+m% Fr꿾0kI9WFӶ{`7W &o0*Ý!I1@Q "~'eL # 3,ln< 1;KY7Q>Yh s}[k n1-<]cL$Io(np.uw FIPbɥ^.0>-Pɞ~*quw)b%$VVf=>ab/\cCھN]h&9l ֟waߔ`iL}JNLF\ QhEYvu6pk:cR}ȈR.sb;^1S9]<#Ǥ p"4DwMrEV@&B8G 2t:ԚE97 %~Nxr-[`8%W EKRC $BȐ+?bIx/z[K$֧o3$tKg(3\ qH;35w^zJ /Lt`2Мv[]tJxR9|11۪0^W*Y R @6~m1ºpLnmfws:XQ30+NP[TCӟrA!w|/t/$Oel^[9Lyfm/o9 @9VZ&YWGJ^hݲof,̼'=!;QJ=ePjͶ!ml( lo֜sNު|t[j)MPr=Uh~ 4ǣgaǂÖ6RRcuO̴$oզ+l[uTB` 5u~:n+A4dt^.OG1ƹr ?4buwoI_AIaC$1X# 1j<`{wSww'OtE0R;/JTu׷e,X"?w_z YPQMlN V]Wu%Y\i8 5d߶~õyji-}z+ew\voVQ˹AgdU(~P5QZ1R~hIꆥm"l mmzVћ+d{W7Ka}0 WöN5ߺƮ׻F\wy&Zr'm\cϙYxm{z=5 ec1d5UÄb b2Fғzmw@B @@ -1393,7 +1393,7 @@ HX8FZ /m8NZD3$"c&R2̫ux}<锲33`f0ick?L[7r)fҡ~pznm_Vxz O;Ե͘YU(vw5,MBVB~> mo4}S$8A0*b AOJd^zIRE[J(tì)HК֗>2GF`݂dS~yQ{;0̫ C.-8{P>FNSЅῃeD[L˴&Nd9Tm.ubPY{wjSu랜&Vկ^0:uJaN[Ac ,2RNE YþOChHQ~bRm(ŋlL!St@r Bg#`؃3j#J)sy@ 9'ljcy^D'B7uvMKB<*p!Y#6хIpb췩 BhIH%hޯu*6_#x, GbKCw!5ZZǙFpe>jM>!Mb)H*2@ᩞLGV|>v/[54hoPgUNzR2n68^`֗fj9UĉVB\%NM-i{x{eZAE\~cVDu PXԴcPQwi s-ULeTfW/kK]_36 <kG1@HΚK1ƈ|:B<LEd bI{;"[*hn P7fH~!?MWbSmp ' 9kjzwDhBʗ%zKzcjE̬ L:xHC3~ |ݙP192,íK-yݬH=r5i4JOغ%> 8NE RװCCd># -X1&%C;F!́wCi\61ed22f '16Ћw::|?.9qZUGgh+\>Hc=b?!anҶffAOus`^HDԬʋ|K%vkq}apyKIU\(>S}0Z܅!tJk 6 W;>^K"lZv[:2`D +X1&%C;F!́wCi\61ed22f '16Ћw::|?.9qZUGgh+\>Hc=b?!anҶffAOus`^HDԬʋ|K%vkq}apyKIU(>S}0Z܅!tJk 6 W;>^K"lZv[:2`D N?J ƾd[Hvo:v` @hq݄8OV۶ ,m2Q_or<+!BH"ufm)J4&+B֍j@D9 b[pqzT壷Q-@ m,nI-$ɓd[9biT=!5ExGގ߸zM5An+&QCp|ӵLkJ~fSH# MS?@wN{K{+|Y\ӉǖLjo*߮c(^A%T϶ķ}q~KwÎ Dvи\#-  @@ -1553,7 +1553,7 @@ E@q^ m%uq6QʀPJhŖ%jݙ0#S-DwfcVþG.l gPp_[D˺7xhuׁ&) CB?Tkdha w'1*Ż*K<7Q\d xp5+\c`qZC'͐AH^NjiE ~So=+ErxE~(DaXk^8թ4/z+A4ue.}-c+0#ʦ_"rj:O ;YW)_S]7&&Q攀a jSHqX6Hhd03FBKYK8e'3;t|o{^ֶ eOEuig}-`+ttqjU7ac+2)-Kk]v/~!kT)#v/r-#!0+n&Jۼo$V2h@9U*CY&XHT%jZ`r"Lix6T5֭^ 7TNngf/VrƚH.Zn*f{u ` [ L̗Z,T#oS7mFjBл6,MP.􀑩 hnYOkbYjVfgwU(ݟ.e*+jDo qp*FbX iVSÅ..x%e霆^s>aɾ[!?~rf䀁oxSI)+?4D43u8wԵS~ENې-3rFX1}zf,qeG' xQ H|v~W @[I\Ό.9 -Qo/+6Vɹ!\(gǽ龟51Wp19%@L6={RxHuOmأ>=GQL|:틍=v{)3ʺUm<1Fc9\5Kau[GdX  KP淤${ l55ύKwXVuZC6ߘ߈ O?-z0c`F.{T+EC^r3\p'F\ϊ8/Ѧ7_G/$w?sŖ'*( H +Qo/+6Vɹ!(gǽ龟51Wp19%@L6={RxHuOmأ>=GQL|:틍=v{)3ʺUm<1Fc9\5Kau[GdX  KP淤${ l55ύKwXVuZC6ߘ߈ O?-z0c`F.{T+EC^r3\p'F\ϊ8/Ѧ7_G/$w?sŖ'*( H B aLRČ\ySȼp>(H'SmZCǵN0cAvt% IJҟPŒȃ !Š'#q-K,6l^2d2:IhKSkɿF& 9n&)\_i4t V 2RkTRFKJTy\ڵ[߲k-McGhis\INZf3=0iAq'Sq,ahwܚ @@ -3653,7 +3653,7 @@ h$aOZLHIrg;5%on;R=g#)7k(#qu=rp4Rt/.9d^%QH_O\T:OinRP0@_OsdDOILG@:]%#14mf8-@5)heKm7eq]hddRY@2O`-(kuI( K)NCX3PG[t,Drnk~> endstream endobj 233 0 obj <> endobj 232 0 obj <>stream @@ -4103,7 +4103,7 @@ x: I, @e2 BGtEVlR1{=wo,l;sw: h mPuA- ~q PV[nsI:S5rUlC8ھVςp5Vճ&b0&K}^Y5ܪƹU/KQJx\\Vm6Uf١=\6^)ʶgU}$m:{N8yr;KdKssk':lA.hʄ_d>(srYOS)VQJ8|F".<vyD(kñXH]HB%c ^]Px 8^q[GW}66.V1bsc:+y\ Ǜ -yf|W#/߿qКvMTXF?!=@12ľFvܟqnuOƷw;eդ|Sb4GN?;!`C}ee1ԅm>M#>߿@,{J0yro~\{gg}ok9T۱xG~ 9Nh&l[m;NM3N\(ϙiƑ#b? tGsape!v@l`Kۏl|YوGhϽr;v%-u~"zmc=q9C ^-rO!;a@2Og?8K)y=uFɊJ|\(>5{Oɳϫ r$<1)%ڎ\c*7ޠF>ߑob`Nc>:gUu=t80_?xφ߁;XݣkQO>ู/|_O`Es`:8/֪{U\O_~ug~ +yf|W#/߿qКvMTXF?!=@12ľFvܟqnuOƷw;eդ|Sb4GN?;!`C}ee1ԅm>M#>߿@,{J0yro~\{gg}ok9T۱xG~ 9Nh&l[m;NM3N\(ϙiƑ#b? tGsape!v@l`Kۏl|YوGhϽr;v%-u~"zmc=q9C ^-rO!;a@2Og?8K)y=uFɊJ|(>5{Oɳϫ r$<1)%ڎ\c*7ޠF>ߑob`Nc>:gUu=t80_?xφ߁;XݣkQO>ู/|_O`Es`:8/֪{U\O_~ug~ ~w#y&Aʹ{uXg(I7¿"b!yF{oφFan!RA/%mӀ_ ds./%Cbr%KtG1Tu,FecP8Kƫen+仺nSkHq;|σf]'bΩ ,fIVH أ x)'K>> ܶ w?8dty%}p涹1,;|`8HIw\5:'y0݁X:/Z|804-Q Ɩ)c)f};^;\6nmlv2A-2nm<xSi` e])Rj g Ebe-Q[劒4p8Kd$8c`#vվ?n18nyS.WPs\9ttnĜ_aߡqY$͹.GghnYi6oc&9m܋lJcoh9oF&ÑXi]q-yя9\x+.؆D`~"UD#fQl+}J7Dq9Dq(D}IG&h4Fh4Fh4Fh4Fh4Fh4FhpH@ʧ.GdA.YsDJws>_ը0PzQgJ7(WNHV }]нJlGs %Q#pOz552ؓz;`eO0ݑh7ESP~>~TsbX# Q ¼:|f/bϻy[$plWXaO'>2x2*k {YSt UӎMafzZU¯jS?:-Pmǝ@ӓ⍝5kti I$l&vK -h?ML>N+(3~0ĩ 6|v=loeK;|0ú- םH>m97Xw(lħɨ NF] >T\hjg5\.V; h0zCz 1>%b/WMhQƪtݩkNZX;S+#U\(e݉w |ޗ  }ƞd@NĠkٯ;?~݉~םA b  ,[i.DCɔx~ם1N rV"AꨳEkםF0TsWg% muG4g0y%VٴpL;Zm'#L;ZmgJWwW+䛘)]ݞjZb&q>ӒN&Ge9/1A +h?ML>N+(3~0ĩ 6|v=loeK;|0ú- םH>m97Xw(lħɨ NF] >T\hjg5\.V; h0zCz 1>%b/WMhQƪtݩkNZX;S+#U(e݉w |ޗ  }ƞd@NĠkٯ;?~݉~םA b  ,[i.DCɔx~ם1N rV"AꨳEkםF0TsWg% muG4g0y%VٴpL;Zm'#L;ZmgJWwW+䛘)]ݞjZb&q>ӒN&Ge9/1A "8/6 ngg ;d2HU'-G[-S 'q-\~9 eBKl/k<'JqATVrReZ)h$"t\?-\J$ WDK$,MƁNύ0*Vk4y\J̒t5|Lsi(){7'JFډ/N" 0y7vҞؓCvթ_e[h&~ EҴJCwcqx[%JDijz*()Mǣ+Enѯ%)] J\M'kA~ ySTf/4?(l(oHѻN_WYD;kJYt23Q{㓄n|e(YKG'Y6dkҵm6Q%Q:FN ̈́GT!6QZ]U _&Jb;DM iHǦeQ)QAk%JPDM)K(]U( (2Vˆ/If1:zUMȨ>K5,ønί:Vcu:J\~X>10/#" if|V.X!.cY2y-Vգ=@!a"/{vut'}vKaLC'I}~ܓ1 @_Vs81N1WM{5D.I Z9ka Ycu[f @@ -4687,7 +4687,7 @@ Q>$ oGp3Cb\F[qf68ABj5N=6Lap^),3Zh<\^cA4ZYFVZeno=&?$_F(@MSb3&qJs4R!0bbg8c~> endstream endobj 197 0 obj <>stream -HWko8_b$H줘b6Lv0H4A촉3Rl3 AlZ:<<68[1^(Sj[ x}uLږ3ڏ /T]}e5W3t+^3ŋF뚵]3^T,-_ۗq|I8N8l㯟&'K7ɿ6d-/hͭ' /#Rլl~4W6崦o9\( ' +HWko8_b$H줘b6Lv0H4A촉3Rl3 AlZ:<<68[1^(Sj[ x}uLږ3ڏ /T]}e5W3t+^3ŋF뚵]3^T,-_ۗq|I8N8l㯟&'K7ɿ6d-/hͭ' /#Rլl~4W6崦o9( ' YO84rN>&u{m}pr|r¹g,9 +zj^i4EAE+|x;z635Oϳ\r~rQa\@;%y/e gTUѰ0AYHރ ts%(~Bd5bnh,zvOjQgIkط4+ÍJpNnK2AurJW1|-KS/j^zjËR?0(=xO?~O?7C$wGG=xG_֣菃G=~8=qH?_ףO$wGG=xGߌ*H?g?E?G=~?H?鏴{c?@9*G{#?@8|O$藣HxO$菳{]׮?@kW$+_Vr$wGG=xG_R$?G=~~1NqH?g?q׮H?鏴{c?@kW$+?y zqH?g? Q;8;8?H;{~Տ쎼뎼ꎼ鎼莼玼3vX%g]% m^pѰvn4f.$+MeWhɻΕP nf IOTGھL&gW>89>9\tʎ3Bkk Lz#GONYȝ\W <686a4/\҅%sS, @@ -4905,7 +4905,7 @@ H 6%n@p}Qv?&^v#'cF %{Q5WFRelt|[''77L8``ujgi?tkTSVc9+WD3{C@BA0B\Q6]jlzyuRaD>sJC*2?w/d,l7E{Y?au'לcǀ4Έ,h;rGW,Sv,jBҦСHYI5lJhhh. gۤAju|qo[:)Gl29U48rHn2U5N{nz1{(%Ten1yHMxdAL^Ÿ 4oJ#skKRR=CYtkK&}zYUИ(IJPʅ]%JW~r]GD!n)=`|􍔽OL텽`5ysMMH^m޹+v$m#3t4@x^KE*w$R]x'Y_#nĭw(w* ԕc?E7M2aLWPiw6}4 kDbuqj}/=ݛw#eK(q;zVT$Xv-ChL}uks#\c.PXF5-,cӰn{Ϥ=ݞ:59܅%C矢4ϟQK]@{iS7az1zG 緾綿i^twh^ذ>{*aĪ2<,>i\a{o 5bkVpem%>ŰAFA2-wv$fNCm{˵nMB^Zu9ZyIᦧFCa*4ȼ -ʖ160x?G]Go&DÒWokٶXaQDhq:W39 _wE0tzf0SYdl~G ~@\(qhbA?F^\P*`߀0GZ:%I 4޿YR)yvR_,'=D}ϭύ@@{2fYn6}·]Ockب +ʖ160x?G]Go&DÒWokٶXaQDhq:W39 _wE0tzf0SYdl~G ~@(qhbA?F^\P*`߀0GZ:%I 4޿YR)yvR_,'=D}ϭύ@@{2fYn6}·]Ockب Ԓ\~0@ 䗫f;!2ͧ۰GOF%׃}+JU KUzi (s>( oQ3s9cs炄 *[VK}6j<$ DG¤DG@[*8Yt~8פCtmF, q GO_]dwC޿iHU>S!N}c k;TD:NoL4b 2@Qy[aF +ADC*d>e0m BT5 z NtVc =_,`۔ RʲbՇx)|PuE8>BIn-Ƃڃ3zհ0vR$QyJ0zsE.̫d*sDW8SJoRW-}g>jEV R}Wo[%^ex̽Iz 8ԯ5=k5 @@ -5748,7 +5748,7 @@ oĈ  Ӧz4a)RB=LUIQ/^n.abbj1wLh0{ow w Vq1ƎSc+m ( DQ#s(aŭFrpp0bX*5p}+!9YjH+Jr( -Xl E *40S *b`W d@L5@(רIq>W=aܺۃv.]\htؔӎvÆCkΰb?[EF`ӓ؄ Zi)Щ[z8IDJ1V݀5ō5nLi9y#  endstream endobj 174 0 obj <> endobj 173 0 obj <>stream +Xl E *40S *b`W d@L5@(רIq>W=aܺۃv.]\htؔӎvÆCkΰb?[EF`ӓ؄ Zi)Щ[z8IDJ1V݀5ō5nLi9y#  endstream endobj 174 0 obj <> endobj 173 0 obj <>stream HWGǿ]ݯ$jd"A "ѸqEM(.$DpKĠf<8D ݅'-xaiϭ:[tuUg.ZXcw끆w.q 8%7Mq۹Y zr{fNyh^thaw?GmQw% ^<K;}A|jr>獵ed6y)7%7ɀ+D;a #Ա ~#BZ#R3"1;ϏNLM BMqUpqo 9ns\u"o XxJ4"I$M*y5$ɏ'ŁPq/.oōxG)eHA3ҡP)mMLU%JF9|VCԑjRZU/jjO5M"Dm6Ujڗu@{yNu[УB}~E\W W[W2\.+5hal6 19cqhTu*Sڞh'D{4F4i4&94.t@ӣjuN x;ϻt 48k]iE_xNln>*[ Oz H49M.o5rRG#L/՜fxMEZ$m btI,]u::^ԛpmE V+ JzRBmvWc2N}zX-Q3EzW>ѠtmH}B+.j7jWWo˩waz$g[zN}k ޒSok}Fgl7.pAvUK7Lёz HgD:Σ OЎpqtǹ^r8V˼ԛRS짶m+r>nڇb.{|{ao7+<;gGؑv=bCm؞=|rZYW|1A߂=vQ$D.=( gR,?tH`ujFgY&d[zg*%"<8um@}25zEcU,+K5[@k₳=xk͌L.QbY@+~4:}4)4Nq o]w<:Wgg52ݨN^/bQZ*ɰ#jg+zn*·jbnz,\$U]7DTpSu5М "bPI"~{^Z=~\i5*M7ՇFm@[ xPLLFw]B>X[ 䖬ͳ]0h3f:M[{ %h8]Ihm󄎌Ő0q9û+-D}:y=.G% } ߋ?P! 3a<uTF@Cmy1q% :D -2@׃ 7AjyMi@%D8ͬE.i D U.[kL+h Mr{|`H2V9:ac:8cm4`脓ٖ yF2GeY.ے(:8D*q垕K$~qg?π0Q=\(R)bWXٮ-N\SK5Wqo;b .@{*q;bV7u0o:`p\)%&Ү'^e^Pj$ob!$(zB(=iLaAA0" }xoZ6|ňbO9mae$tFyCb^tRN%zUng+y2)'J?h #P2/ bֽ96bه3%y)DK$j R E1}=e\Xi")@E t9H^pB·MfgЏ.l׆?hqs=q_a`G6xz[K]9D<ͅXE2{#3yT}ܾTD5]- m,RDs#L1kJnLAdaV,ܝy4ZʳD}-/k̒.άUni @@ -6703,7 +6703,7 @@ H7̗ A\0% ݉8$dm^BMNQN$폏 qQl-8gx|ʠ]*c>+Q%Q :n@3LD[F9o*o5}l(QqWطS͓NM "ы!)Poy_Qkp=wC/'1p)jznΞ||<}[cWic 3gGw THJO8N+pc!< 6ȇd:$f5!{r'#ank$I= -$-TZ!MD@!&;Ga81%[+`DRxoQ\(`Vڐ^_@fѽWA0;S xarMKTh)k_q"aТggsv&##PltDE90(r 7zՁUCrL =\t8"#,\#7NA\mO6v:7`p(--4ri#$)%8eꖰ. .y< Z[/2hhoyJ3k|p4GTSܔyKha%3ҷa4c6GڸlR,fUΊuq{83Dj>U)R\)[M3sʈN U6b>;:UirckdIՖVjjL\=kICi&|%9MJ(/a>4e7( +$-TZ!MD@!&;Ga81%[+`DRxoQ(`Vڐ^_@fѽWA0;S xarMKTh)k_q"aТggsv&##PltDE90(r 7zՁUCrL =\t8"#,\#7NA\mO6v:7`p(--4ri#$)%8eꖰ. .y< Z[/2hhoyJ3k|p4GTSܔyKha%3ҷa4c6GڸlR,fUΊuq{83Dj>U)R\)[M3sʈN U6b>;:UirckdIՖVjjL\=kICi&|%9MJ(/a>4e7( cx_>6wC'ֺQPneγt3^HufНpu'ku["3>L 鑇 g"4.(*U6>b-7ZKg)v9?avoy"ז"\su^| e}|VKZ7VOàVjo(^I`ʻB;IT緡"7glw0npɡRfpVB_IjV06 Iâ$PvgUTv0_c4Ń൶O2#s@Դy -APLG+cv@/\(M @~@_ ޓ +APLG+cv@/(M @~@_ ޓ ^ϔ\E€ \$b/b@BN|F†;VτNO b ^.F0'@I]tX bdsiB?A o+, ov2櫹w`d S*.pţV0A5 I ʸ{{$pP|B#GIP ܻpKX>  @@ -7700,7 +7700,7 @@ u$fZ+ - endstream endobj 304 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 307 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 310 0 obj <> endobj 311 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 316 0 obj <> endobj 317 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 321 0 obj <> endobj 322 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 326 0 obj <> endobj 327 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 331 0 obj <> endobj 332 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 337 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 341 0 obj <> endobj 342 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 346 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 354 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 357 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <> endobj 363 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 367 0 obj <> endobj 368 0 obj <> endobj 369 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 372 0 obj <> endobj 373 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <> endobj 383 0 obj <> endobj 384 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 387 0 obj <> endobj 388 0 obj <> endobj 389 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 392 0 obj <> endobj 393 0 obj <> endobj 394 0 obj <> endobj 395 0 obj <> endobj 396 0 obj <> endobj 397 0 obj <> endobj 398 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 401 0 obj <> endobj 402 0 obj <> endobj 403 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 406 0 obj <> endobj 407 0 obj <> endobj 408 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 411 0 obj <> endobj 412 0 obj <> endobj 413 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 416 0 obj <> endobj 417 0 obj <> endobj 418 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 421 0 obj <> endobj 422 0 obj <> endobj 423 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 426 0 obj <> endobj 427 0 obj <> endobj 428 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 431 0 obj <> endobj 432 0 obj <> endobj 433 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 497 0 obj <> endobj 524 0 obj [/View/Design] endobj 525 0 obj <>>> endobj 546 0 obj [545 0 R] endobj 461 0 obj <> endobj 462 0 obj <> endobj 463 0 obj <> endobj 590 0 obj <> endobj xref 0 591 0000000209 65535 f + endstream endobj 304 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 307 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 310 0 obj <> endobj 311 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 316 0 obj <> endobj 317 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 321 0 obj <> endobj 322 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 326 0 obj <> endobj 327 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 331 0 obj <> endobj 332 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 337 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 341 0 obj <> endobj 342 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 346 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 354 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 357 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <> endobj 363 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 367 0 obj <> endobj 368 0 obj <> endobj 369 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 372 0 obj <> endobj 373 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <> endobj 383 0 obj <> endobj 384 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 387 0 obj <> endobj 388 0 obj <> endobj 389 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 392 0 obj <> endobj 393 0 obj <> endobj 394 0 obj <> endobj 395 0 obj <> endobj 396 0 obj <> endobj 397 0 obj <> endobj 398 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 401 0 obj <> endobj 402 0 obj <> endobj 403 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 406 0 obj <> endobj 407 0 obj <> endobj 408 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 411 0 obj <> endobj 412 0 obj <> endobj 413 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 416 0 obj <> endobj 417 0 obj <> endobj 418 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 421 0 obj <> endobj 422 0 obj <> endobj 423 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 426 0 obj <> endobj 427 0 obj <> endobj 428 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 431 0 obj <> endobj 432 0 obj <> endobj 433 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 497 0 obj <> endobj 524 0 obj [/View/Design] endobj 525 0 obj <>>> endobj 546 0 obj [545 0 R] endobj 461 0 obj <> endobj 462 0 obj <> endobj 463 0 obj <> endobj 590 0 obj <> endobj xref 0 591 0000000209 65535 f 0000762850 00000 n 0001230488 00000 n 0001236553 00000 n diff --git a/.gitbook/assets/gpy.png b/static/gitbook/assets/gpy.png similarity index 100% rename from .gitbook/assets/gpy.png rename to static/gitbook/assets/gpy.png diff --git a/.gitbook/assets/image-1.png b/static/gitbook/assets/image-1.png similarity index 100% rename from .gitbook/assets/image-1.png rename to static/gitbook/assets/image-1.png diff --git a/.gitbook/assets/image-2.png b/static/gitbook/assets/image-2.png similarity index 100% rename from .gitbook/assets/image-2.png rename to static/gitbook/assets/image-2.png diff --git a/.gitbook/assets/image-3.png b/static/gitbook/assets/image-3.png similarity index 100% rename from .gitbook/assets/image-3.png rename to static/gitbook/assets/image-3.png diff --git a/.gitbook/assets/image.png b/static/gitbook/assets/image.png similarity index 100% rename from .gitbook/assets/image.png rename to static/gitbook/assets/image.png diff --git a/.gitbook/assets/ip67_case.png b/static/gitbook/assets/ip67_case.png similarity index 100% rename from .gitbook/assets/ip67_case.png rename to static/gitbook/assets/ip67_case.png diff --git a/.gitbook/assets/ip67_case_exp.png b/static/gitbook/assets/ip67_case_exp.png similarity index 100% rename from .gitbook/assets/ip67_case_exp.png rename to static/gitbook/assets/ip67_case_exp.png diff --git a/.gitbook/assets/ip67_case_py.png b/static/gitbook/assets/ip67_case_py.png similarity index 100% rename from .gitbook/assets/ip67_case_py.png rename to static/gitbook/assets/ip67_case_py.png diff --git a/.gitbook/assets/ir.png b/static/gitbook/assets/ir.png similarity index 100% rename from .gitbook/assets/ir.png rename to static/gitbook/assets/ir.png diff --git a/.gitbook/assets/l01-1.png b/static/gitbook/assets/l01-1.png similarity index 100% rename from .gitbook/assets/l01-1.png rename to static/gitbook/assets/l01-1.png diff --git a/.gitbook/assets/l01-drawing.pdf b/static/gitbook/assets/l01-drawing.pdf similarity index 100% rename from .gitbook/assets/l01-drawing.pdf rename to static/gitbook/assets/l01-drawing.pdf diff --git a/.gitbook/assets/l01-oem-baseboard-ref.zip b/static/gitbook/assets/l01-oem-baseboard-ref.zip similarity index 100% rename from .gitbook/assets/l01-oem-baseboard-ref.zip rename to static/gitbook/assets/l01-oem-baseboard-ref.zip diff --git a/.gitbook/assets/l01-oem-layout-1.png b/static/gitbook/assets/l01-oem-layout-1.png similarity index 100% rename from .gitbook/assets/l01-oem-layout-1.png rename to static/gitbook/assets/l01-oem-layout-1.png diff --git a/.gitbook/assets/l01-oem-layout.pdf b/static/gitbook/assets/l01-oem-layout.pdf similarity index 89% rename from .gitbook/assets/l01-oem-layout.pdf rename to static/gitbook/assets/l01-oem-layout.pdf index 358cab3..d265dc9 100644 Binary files a/.gitbook/assets/l01-oem-layout.pdf and b/static/gitbook/assets/l01-oem-layout.pdf differ diff --git a/.gitbook/assets/l01-oem-layout.png b/static/gitbook/assets/l01-oem-layout.png similarity index 99% rename from .gitbook/assets/l01-oem-layout.png rename to static/gitbook/assets/l01-oem-layout.png index 72cf997..758805a 100644 Binary files a/.gitbook/assets/l01-oem-layout.png and b/static/gitbook/assets/l01-oem-layout.png differ diff --git a/.gitbook/assets/l01-oem-schematic.pdf b/static/gitbook/assets/l01-oem-schematic.pdf similarity index 100% rename from .gitbook/assets/l01-oem-schematic.pdf rename to static/gitbook/assets/l01-oem-schematic.pdf diff --git a/.gitbook/assets/l01-pinout.pdf b/static/gitbook/assets/l01-pinout.pdf similarity index 100% rename from .gitbook/assets/l01-pinout.pdf rename to static/gitbook/assets/l01-pinout.pdf diff --git a/.gitbook/assets/l01-pinout.png b/static/gitbook/assets/l01-pinout.png similarity index 100% rename from .gitbook/assets/l01-pinout.png rename to static/gitbook/assets/l01-pinout.png diff --git a/.gitbook/assets/l01-reference (1).png b/static/gitbook/assets/l01-reference (1).png similarity index 99% rename from .gitbook/assets/l01-reference (1).png rename to static/gitbook/assets/l01-reference (1).png index 375df86..5311f5c 100644 Binary files a/.gitbook/assets/l01-reference (1).png and b/static/gitbook/assets/l01-reference (1).png differ diff --git a/.gitbook/assets/l01-reference.png b/static/gitbook/assets/l01-reference.png similarity index 100% rename from .gitbook/assets/l01-reference.png rename to static/gitbook/assets/l01-reference.png diff --git a/.gitbook/assets/l01-specsheet-1.pdf b/static/gitbook/assets/l01-specsheet-1.pdf similarity index 100% rename from .gitbook/assets/l01-specsheet-1.pdf rename to static/gitbook/assets/l01-specsheet-1.pdf diff --git a/.gitbook/assets/l01.png b/static/gitbook/assets/l01.png similarity index 100% rename from .gitbook/assets/l01.png rename to static/gitbook/assets/l01.png diff --git a/.gitbook/assets/l04-1.png b/static/gitbook/assets/l04-1.png similarity index 100% rename from .gitbook/assets/l04-1.png rename to static/gitbook/assets/l04-1.png diff --git a/.gitbook/assets/l04-drawing.pdf b/static/gitbook/assets/l04-drawing.pdf similarity index 100% rename from .gitbook/assets/l04-drawing.pdf rename to static/gitbook/assets/l04-drawing.pdf diff --git a/.gitbook/assets/l04-pinout.pdf b/static/gitbook/assets/l04-pinout.pdf similarity index 100% rename from .gitbook/assets/l04-pinout.pdf rename to static/gitbook/assets/l04-pinout.pdf diff --git a/.gitbook/assets/l04-pinout.png b/static/gitbook/assets/l04-pinout.png similarity index 100% rename from .gitbook/assets/l04-pinout.png rename to static/gitbook/assets/l04-pinout.png diff --git a/.gitbook/assets/l04-specsheet.pdf b/static/gitbook/assets/l04-specsheet.pdf similarity index 100% rename from .gitbook/assets/l04-specsheet.pdf rename to static/gitbook/assets/l04-specsheet.pdf diff --git a/.gitbook/assets/l04.png b/static/gitbook/assets/l04.png similarity index 100% rename from .gitbook/assets/l04.png rename to static/gitbook/assets/l04.png diff --git a/.gitbook/assets/lipo.jpg b/static/gitbook/assets/lipo.jpg similarity index 100% rename from .gitbook/assets/lipo.jpg rename to static/gitbook/assets/lipo.jpg diff --git a/.gitbook/assets/lopy (1).png b/static/gitbook/assets/lopy (1).png similarity index 100% rename from .gitbook/assets/lopy (1).png rename to static/gitbook/assets/lopy (1).png diff --git a/.gitbook/assets/lopy-1.png b/static/gitbook/assets/lopy-1.png similarity index 100% rename from .gitbook/assets/lopy-1.png rename to static/gitbook/assets/lopy-1.png diff --git a/.gitbook/assets/lopy-pinout.pdf b/static/gitbook/assets/lopy-pinout.pdf similarity index 100% rename from .gitbook/assets/lopy-pinout.pdf rename to static/gitbook/assets/lopy-pinout.pdf diff --git a/.gitbook/assets/lopy-pinout.png b/static/gitbook/assets/lopy-pinout.png similarity index 100% rename from .gitbook/assets/lopy-pinout.png rename to static/gitbook/assets/lopy-pinout.png diff --git a/.gitbook/assets/lopy-specsheet.pdf b/static/gitbook/assets/lopy-specsheet.pdf similarity index 99% rename from .gitbook/assets/lopy-specsheet.pdf rename to static/gitbook/assets/lopy-specsheet.pdf index c3477c7..167d63f 100644 Binary files a/.gitbook/assets/lopy-specsheet.pdf and b/static/gitbook/assets/lopy-specsheet.pdf differ diff --git a/.gitbook/assets/lopy.png b/static/gitbook/assets/lopy.png similarity index 100% rename from .gitbook/assets/lopy.png rename to static/gitbook/assets/lopy.png diff --git a/.gitbook/assets/lopy4 (1).png b/static/gitbook/assets/lopy4 (1).png similarity index 100% rename from .gitbook/assets/lopy4 (1).png rename to static/gitbook/assets/lopy4 (1).png diff --git a/.gitbook/assets/lopy4-1.png b/static/gitbook/assets/lopy4-1.png similarity index 100% rename from .gitbook/assets/lopy4-1.png rename to static/gitbook/assets/lopy4-1.png diff --git a/.gitbook/assets/lopy4-pinout.pdf b/static/gitbook/assets/lopy4-pinout.pdf similarity index 100% rename from .gitbook/assets/lopy4-pinout.pdf rename to static/gitbook/assets/lopy4-pinout.pdf diff --git a/.gitbook/assets/lopy4-pinout.png b/static/gitbook/assets/lopy4-pinout.png similarity index 100% rename from .gitbook/assets/lopy4-pinout.png rename to static/gitbook/assets/lopy4-pinout.png diff --git a/.gitbook/assets/lopy4-specsheet-1.pdf b/static/gitbook/assets/lopy4-specsheet-1.pdf similarity index 100% rename from .gitbook/assets/lopy4-specsheet-1.pdf rename to static/gitbook/assets/lopy4-specsheet-1.pdf diff --git a/.gitbook/assets/lopy4.png b/static/gitbook/assets/lopy4.png similarity index 100% rename from .gitbook/assets/lopy4.png rename to static/gitbook/assets/lopy4.png diff --git a/.gitbook/assets/lora_ant.png b/static/gitbook/assets/lora_ant.png similarity index 100% rename from .gitbook/assets/lora_ant.png rename to static/gitbook/assets/lora_ant.png diff --git a/.gitbook/assets/lora_pigtail_ant_lopy.png b/static/gitbook/assets/lora_pigtail_ant_lopy.png similarity index 100% rename from .gitbook/assets/lora_pigtail_ant_lopy.png rename to static/gitbook/assets/lora_pigtail_ant_lopy.png diff --git a/.gitbook/assets/lora_pigtail_lopy.png b/static/gitbook/assets/lora_pigtail_lopy.png similarity index 100% rename from .gitbook/assets/lora_pigtail_lopy.png rename to static/gitbook/assets/lora_pigtail_lopy.png diff --git a/.gitbook/assets/lora_sigfox_pigtail_ant_fipy.png b/static/gitbook/assets/lora_sigfox_pigtail_ant_fipy.png similarity index 100% rename from .gitbook/assets/lora_sigfox_pigtail_ant_fipy.png rename to static/gitbook/assets/lora_sigfox_pigtail_ant_fipy.png diff --git a/.gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png b/static/gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png similarity index 100% rename from .gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png rename to static/gitbook/assets/lora_sigfox_pigtail_ant_lopy4.png diff --git a/.gitbook/assets/lora_sigfox_pigtail_fipy.png b/static/gitbook/assets/lora_sigfox_pigtail_fipy.png similarity index 100% rename from .gitbook/assets/lora_sigfox_pigtail_fipy.png rename to static/gitbook/assets/lora_sigfox_pigtail_fipy.png diff --git a/.gitbook/assets/lora_sigfox_pigtail_lopy4.png b/static/gitbook/assets/lora_sigfox_pigtail_lopy4.png similarity index 100% rename from .gitbook/assets/lora_sigfox_pigtail_lopy4.png rename to static/gitbook/assets/lora_sigfox_pigtail_lopy4.png diff --git a/.gitbook/assets/lorawan_logo (1).png b/static/gitbook/assets/lorawan_logo (1).png similarity index 100% rename from .gitbook/assets/lorawan_logo (1).png rename to static/gitbook/assets/lorawan_logo (1).png diff --git a/.gitbook/assets/lorawan_logo.png b/static/gitbook/assets/lorawan_logo.png similarity index 100% rename from .gitbook/assets/lorawan_logo.png rename to static/gitbook/assets/lorawan_logo.png diff --git a/.gitbook/assets/lte-m-antenna-drawing.pdf b/static/gitbook/assets/lte-m-antenna-drawing.pdf similarity index 100% rename from .gitbook/assets/lte-m-antenna-drawing.pdf rename to static/gitbook/assets/lte-m-antenna-drawing.pdf diff --git a/.gitbook/assets/lte_ant.png b/static/gitbook/assets/lte_ant.png similarity index 100% rename from .gitbook/assets/lte_ant.png rename to static/gitbook/assets/lte_ant.png diff --git a/.gitbook/assets/lte_ant_fipy.png b/static/gitbook/assets/lte_ant_fipy.png similarity index 100% rename from .gitbook/assets/lte_ant_fipy.png rename to static/gitbook/assets/lte_ant_fipy.png diff --git a/.gitbook/assets/lte_ant_gpy.png b/static/gitbook/assets/lte_ant_gpy.png similarity index 93% rename from .gitbook/assets/lte_ant_gpy.png rename to static/gitbook/assets/lte_ant_gpy.png index 52b75c6..ea5b190 100644 Binary files a/.gitbook/assets/lte_ant_gpy.png and b/static/gitbook/assets/lte_ant_gpy.png differ diff --git a/.gitbook/assets/lte_m_rgb.png b/static/gitbook/assets/lte_m_rgb.png similarity index 100% rename from .gitbook/assets/lte_m_rgb.png rename to static/gitbook/assets/lte_m_rgb.png diff --git a/.gitbook/assets/micropython (1).jpg b/static/gitbook/assets/micropython (1).jpg similarity index 100% rename from .gitbook/assets/micropython (1).jpg rename to static/gitbook/assets/micropython (1).jpg diff --git a/.gitbook/assets/micropython.jpg b/static/gitbook/assets/micropython.jpg similarity index 100% rename from .gitbook/assets/micropython.jpg rename to static/gitbook/assets/micropython.jpg diff --git a/.gitbook/assets/microusb.png b/static/gitbook/assets/microusb.png similarity index 99% rename from .gitbook/assets/microusb.png rename to static/gitbook/assets/microusb.png index 6ebbf52..41b2b42 100644 Binary files a/.gitbook/assets/microusb.png and b/static/gitbook/assets/microusb.png differ diff --git a/.gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-1.pdf b/static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-1.pdf similarity index 100% rename from .gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-1.pdf rename to static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-1.pdf diff --git a/.gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-2.pdf b/static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-2.pdf similarity index 100% rename from .gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-2.pdf rename to static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-2.pdf diff --git a/.gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-3.pdf b/static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-3.pdf similarity index 100% rename from .gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-3.pdf rename to static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential-3.pdf diff --git a/.gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential.pdf b/static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential.pdf similarity index 100% rename from .gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential.pdf rename to static/gitbook/assets/monarch_4g-ez_lr5110_atcommands_referencemanual_rev3_noconfidential.pdf diff --git a/.gitbook/assets/mp-filestructure (1).png b/static/gitbook/assets/mp-filestructure (1).png similarity index 100% rename from .gitbook/assets/mp-filestructure (1).png rename to static/gitbook/assets/mp-filestructure (1).png diff --git a/.gitbook/assets/mp-filestructure.png b/static/gitbook/assets/mp-filestructure.png similarity index 100% rename from .gitbook/assets/mp-filestructure.png rename to static/gitbook/assets/mp-filestructure.png diff --git a/.gitbook/assets/nbiot_black_rgb.png b/static/gitbook/assets/nbiot_black_rgb.png similarity index 100% rename from .gitbook/assets/nbiot_black_rgb.png rename to static/gitbook/assets/nbiot_black_rgb.png diff --git a/.gitbook/assets/newsigfoxpac (1).png b/static/gitbook/assets/newsigfoxpac (1).png similarity index 99% rename from .gitbook/assets/newsigfoxpac (1).png rename to static/gitbook/assets/newsigfoxpac (1).png index a1e0890..421362d 100644 Binary files a/.gitbook/assets/newsigfoxpac (1).png and b/static/gitbook/assets/newsigfoxpac (1).png differ diff --git a/.gitbook/assets/newsigfoxpac.png b/static/gitbook/assets/newsigfoxpac.png similarity index 100% rename from .gitbook/assets/newsigfoxpac.png rename to static/gitbook/assets/newsigfoxpac.png diff --git a/.gitbook/assets/objenious.jpg b/static/gitbook/assets/objenious.jpg similarity index 100% rename from .gitbook/assets/objenious.jpg rename to static/gitbook/assets/objenious.jpg diff --git a/.gitbook/assets/objeniousprovision1 (1).jpg b/static/gitbook/assets/objeniousprovision1 (1).jpg similarity index 100% rename from .gitbook/assets/objeniousprovision1 (1).jpg rename to static/gitbook/assets/objeniousprovision1 (1).jpg diff --git a/.gitbook/assets/objeniousprovision1.jpg b/static/gitbook/assets/objeniousprovision1.jpg similarity index 99% rename from .gitbook/assets/objeniousprovision1.jpg rename to static/gitbook/assets/objeniousprovision1.jpg index 3225e85..fad756c 100644 Binary files a/.gitbook/assets/objeniousprovision1.jpg and b/static/gitbook/assets/objeniousprovision1.jpg differ diff --git a/.gitbook/assets/objeniousprovision2 (1).jpg b/static/gitbook/assets/objeniousprovision2 (1).jpg similarity index 100% rename from .gitbook/assets/objeniousprovision2 (1).jpg rename to static/gitbook/assets/objeniousprovision2 (1).jpg diff --git a/.gitbook/assets/objeniousprovision2.jpg b/static/gitbook/assets/objeniousprovision2.jpg similarity index 99% rename from .gitbook/assets/objeniousprovision2.jpg rename to static/gitbook/assets/objeniousprovision2.jpg index a1c6c62..f857a65 100644 Binary files a/.gitbook/assets/objeniousprovision2.jpg and b/static/gitbook/assets/objeniousprovision2.jpg differ diff --git a/.gitbook/assets/oem-universal-baseboard-ref.zip b/static/gitbook/assets/oem-universal-baseboard-ref.zip similarity index 99% rename from .gitbook/assets/oem-universal-baseboard-ref.zip rename to static/gitbook/assets/oem-universal-baseboard-ref.zip index f87290f..cc48d06 100644 Binary files a/.gitbook/assets/oem-universal-baseboard-ref.zip and b/static/gitbook/assets/oem-universal-baseboard-ref.zip differ diff --git a/.gitbook/assets/oem-universal-layout-1.png b/static/gitbook/assets/oem-universal-layout-1.png similarity index 100% rename from .gitbook/assets/oem-universal-layout-1.png rename to static/gitbook/assets/oem-universal-layout-1.png diff --git a/.gitbook/assets/oem-universal-layout.pdf b/static/gitbook/assets/oem-universal-layout.pdf similarity index 100% rename from .gitbook/assets/oem-universal-layout.pdf rename to static/gitbook/assets/oem-universal-layout.pdf diff --git a/.gitbook/assets/oem-universal-layout.png b/static/gitbook/assets/oem-universal-layout.png similarity index 100% rename from .gitbook/assets/oem-universal-layout.png rename to static/gitbook/assets/oem-universal-layout.png diff --git a/.gitbook/assets/oem-universal-schematic.pdf b/static/gitbook/assets/oem-universal-schematic.pdf similarity index 100% rename from .gitbook/assets/oem-universal-schematic.pdf rename to static/gitbook/assets/oem-universal-schematic.pdf diff --git a/.gitbook/assets/oem_l01_ref.png b/static/gitbook/assets/oem_l01_ref.png similarity index 99% rename from .gitbook/assets/oem_l01_ref.png rename to static/gitbook/assets/oem_l01_ref.png index 033ddf3..fcb2205 100644 Binary files a/.gitbook/assets/oem_l01_ref.png and b/static/gitbook/assets/oem_l01_ref.png differ diff --git a/.gitbook/assets/oem_universal_ref.png b/static/gitbook/assets/oem_universal_ref.png similarity index 100% rename from .gitbook/assets/oem_universal_ref.png rename to static/gitbook/assets/oem_universal_ref.png diff --git a/.gitbook/assets/oled.png b/static/gitbook/assets/oled.png similarity index 100% rename from .gitbook/assets/oled.png rename to static/gitbook/assets/oled.png diff --git a/.gitbook/assets/producticon.png b/static/gitbook/assets/producticon.png similarity index 100% rename from .gitbook/assets/producticon.png rename to static/gitbook/assets/producticon.png diff --git a/.gitbook/assets/putty (1).png b/static/gitbook/assets/putty (1).png similarity index 100% rename from .gitbook/assets/putty (1).png rename to static/gitbook/assets/putty (1).png diff --git a/.gitbook/assets/putty.png b/static/gitbook/assets/putty.png similarity index 100% rename from .gitbook/assets/putty.png rename to static/gitbook/assets/putty.png diff --git a/.gitbook/assets/pybytes-library-download (1).gif b/static/gitbook/assets/pybytes-library-download (1).gif similarity index 98% rename from .gitbook/assets/pybytes-library-download (1).gif rename to static/gitbook/assets/pybytes-library-download (1).gif index 6060683..e3baea5 100644 Binary files a/.gitbook/assets/pybytes-library-download (1).gif and b/static/gitbook/assets/pybytes-library-download (1).gif differ diff --git a/.gitbook/assets/pybytes-library-download.gif b/static/gitbook/assets/pybytes-library-download.gif similarity index 100% rename from .gitbook/assets/pybytes-library-download.gif rename to static/gitbook/assets/pybytes-library-download.gif diff --git a/.gitbook/assets/pybytes-library-wizard (1).png b/static/gitbook/assets/pybytes-library-wizard (1).png similarity index 100% rename from .gitbook/assets/pybytes-library-wizard (1).png rename to static/gitbook/assets/pybytes-library-wizard (1).png diff --git a/.gitbook/assets/pybytes-library-wizard.png b/static/gitbook/assets/pybytes-library-wizard.png similarity index 100% rename from .gitbook/assets/pybytes-library-wizard.png rename to static/gitbook/assets/pybytes-library-wizard.png diff --git a/.gitbook/assets/pybytesdevkit (1).png b/static/gitbook/assets/pybytesdevkit (1).png similarity index 100% rename from .gitbook/assets/pybytesdevkit (1).png rename to static/gitbook/assets/pybytesdevkit (1).png diff --git a/.gitbook/assets/pybytesdevkit.png b/static/gitbook/assets/pybytesdevkit.png similarity index 100% rename from .gitbook/assets/pybytesdevkit.png rename to static/gitbook/assets/pybytesdevkit.png diff --git a/.gitbook/assets/pybytesicon.png b/static/gitbook/assets/pybytesicon.png similarity index 100% rename from .gitbook/assets/pybytesicon.png rename to static/gitbook/assets/pybytesicon.png diff --git a/.gitbook/assets/pybyteslib-box-1.gif b/static/gitbook/assets/pybyteslib-box-1.gif similarity index 100% rename from .gitbook/assets/pybyteslib-box-1.gif rename to static/gitbook/assets/pybyteslib-box-1.gif diff --git a/.gitbook/assets/pybyteslib-box.gif b/static/gitbook/assets/pybyteslib-box.gif similarity index 99% rename from .gitbook/assets/pybyteslib-box.gif rename to static/gitbook/assets/pybyteslib-box.gif index 8e67966..cc51f25 100644 Binary files a/.gitbook/assets/pybyteslib-box.gif and b/static/gitbook/assets/pybyteslib-box.gif differ diff --git a/.gitbook/assets/pybyteslogo (1).png b/static/gitbook/assets/pybyteslogo (1).png similarity index 100% rename from .gitbook/assets/pybyteslogo (1).png rename to static/gitbook/assets/pybyteslogo (1).png diff --git a/.gitbook/assets/pybyteslogo.png b/static/gitbook/assets/pybyteslogo.png similarity index 100% rename from .gitbook/assets/pybyteslogo.png rename to static/gitbook/assets/pybyteslogo.png diff --git a/.gitbook/assets/pybytessigfoxcredentials (1).png b/static/gitbook/assets/pybytessigfoxcredentials (1).png similarity index 100% rename from .gitbook/assets/pybytessigfoxcredentials (1).png rename to static/gitbook/assets/pybytessigfoxcredentials (1).png diff --git a/.gitbook/assets/pybytessigfoxcredentials.png b/static/gitbook/assets/pybytessigfoxcredentials.png similarity index 100% rename from .gitbook/assets/pybytessigfoxcredentials.png rename to static/gitbook/assets/pybytessigfoxcredentials.png diff --git a/.gitbook/assets/pycase.png b/static/gitbook/assets/pycase.png similarity index 100% rename from .gitbook/assets/pycase.png rename to static/gitbook/assets/pycase.png diff --git a/.gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dss.pdf b/static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dss.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dss.pdf rename to static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dss.pdf diff --git a/.gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dts.pdf b/static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dts.pdf similarity index 99% rename from .gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dts.pdf rename to static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dts.pdf index d6972da..4b478d5 100644 Binary files a/.gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dts.pdf and b/static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dts.pdf differ diff --git a/.gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dxx.pdf b/static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dxx.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dxx.pdf rename to static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-dxx.pdf diff --git a/.gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-tnb.pdf b/static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-tnb.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-tnb.pdf rename to static/gitbook/assets/pycom-2ajmtfipy01r-fcc-grant-tnb.pdf diff --git a/.gitbook/assets/pycom-2ajmtg01r-fcc-grant-dss.pdf b/static/gitbook/assets/pycom-2ajmtg01r-fcc-grant-dss.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtg01r-fcc-grant-dss.pdf rename to static/gitbook/assets/pycom-2ajmtg01r-fcc-grant-dss.pdf diff --git a/.gitbook/assets/pycom-2ajmtg01r-fcc-grant-dts.pdf b/static/gitbook/assets/pycom-2ajmtg01r-fcc-grant-dts.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtg01r-fcc-grant-dts.pdf rename to static/gitbook/assets/pycom-2ajmtg01r-fcc-grant-dts.pdf diff --git a/.gitbook/assets/pycom-2ajmtg01r-fcc-grant-tnb.pdf b/static/gitbook/assets/pycom-2ajmtg01r-fcc-grant-tnb.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtg01r-fcc-grant-tnb.pdf rename to static/gitbook/assets/pycom-2ajmtg01r-fcc-grant-tnb.pdf diff --git a/.gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dss.pdf b/static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dss.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dss.pdf rename to static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dss.pdf diff --git a/.gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dts.pdf b/static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dts.pdf similarity index 99% rename from .gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dts.pdf rename to static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dts.pdf index 7dd316f..92dcd5a 100644 Binary files a/.gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dts.pdf and b/static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-dts.pdf differ diff --git a/.gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-tnb.pdf b/static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-tnb.pdf similarity index 100% rename from .gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-tnb.pdf rename to static/gitbook/assets/pycom-2ajmtgpy01r-fcc-grant-tnb.pdf diff --git a/.gitbook/assets/pycom.inf b/static/gitbook/assets/pycom.inf similarity index 100% rename from .gitbook/assets/pycom.inf rename to static/gitbook/assets/pycom.inf diff --git a/.gitbook/assets/pymakr-logo-1 (1).png b/static/gitbook/assets/pymakr-logo-1 (1).png similarity index 100% rename from .gitbook/assets/pymakr-logo-1 (1).png rename to static/gitbook/assets/pymakr-logo-1 (1).png diff --git a/.gitbook/assets/pymakr-logo-1.png b/static/gitbook/assets/pymakr-logo-1.png similarity index 100% rename from .gitbook/assets/pymakr-logo-1.png rename to static/gitbook/assets/pymakr-logo-1.png diff --git a/.gitbook/assets/pymakr-logo.png b/static/gitbook/assets/pymakr-logo.png similarity index 100% rename from .gitbook/assets/pymakr-logo.png rename to static/gitbook/assets/pymakr-logo.png diff --git a/.gitbook/assets/pymakr-plugin-settings-1.png b/static/gitbook/assets/pymakr-plugin-settings-1.png similarity index 99% rename from .gitbook/assets/pymakr-plugin-settings-1.png rename to static/gitbook/assets/pymakr-plugin-settings-1.png index 5509b7f..f4f29bd 100644 Binary files a/.gitbook/assets/pymakr-plugin-settings-1.png and b/static/gitbook/assets/pymakr-plugin-settings-1.png differ diff --git a/.gitbook/assets/pymakr-plugin-settings.png b/static/gitbook/assets/pymakr-plugin-settings.png similarity index 99% rename from .gitbook/assets/pymakr-plugin-settings.png rename to static/gitbook/assets/pymakr-plugin-settings.png index 4b5a4d1..51a019e 100644 Binary files a/.gitbook/assets/pymakr-plugin-settings.png and b/static/gitbook/assets/pymakr-plugin-settings.png differ diff --git a/.gitbook/assets/pyscan-new (1).png b/static/gitbook/assets/pyscan-new (1).png similarity index 99% rename from .gitbook/assets/pyscan-new (1).png rename to static/gitbook/assets/pyscan-new (1).png index fb8b5f6..f8bdf70 100644 Binary files a/.gitbook/assets/pyscan-new (1).png and b/static/gitbook/assets/pyscan-new (1).png differ diff --git a/.gitbook/assets/pyscan-new.png b/static/gitbook/assets/pyscan-new.png similarity index 100% rename from .gitbook/assets/pyscan-new.png rename to static/gitbook/assets/pyscan-new.png diff --git a/.gitbook/assets/pyscan-pinout-1.png b/static/gitbook/assets/pyscan-pinout-1.png similarity index 100% rename from .gitbook/assets/pyscan-pinout-1.png rename to static/gitbook/assets/pyscan-pinout-1.png diff --git a/.gitbook/assets/pyscan-pinout.pdf b/static/gitbook/assets/pyscan-pinout.pdf similarity index 100% rename from .gitbook/assets/pyscan-pinout.pdf rename to static/gitbook/assets/pyscan-pinout.pdf diff --git a/.gitbook/assets/pyscan-pinout.png b/static/gitbook/assets/pyscan-pinout.png similarity index 100% rename from .gitbook/assets/pyscan-pinout.png rename to static/gitbook/assets/pyscan-pinout.png diff --git a/.gitbook/assets/pyscan-specsheet.pdf b/static/gitbook/assets/pyscan-specsheet.pdf similarity index 100% rename from .gitbook/assets/pyscan-specsheet.pdf rename to static/gitbook/assets/pyscan-specsheet.pdf diff --git a/.gitbook/assets/pyscan.png b/static/gitbook/assets/pyscan.png similarity index 100% rename from .gitbook/assets/pyscan.png rename to static/gitbook/assets/pyscan.png diff --git a/.gitbook/assets/pysense (1).png b/static/gitbook/assets/pysense (1).png similarity index 100% rename from .gitbook/assets/pysense (1).png rename to static/gitbook/assets/pysense (1).png diff --git a/.gitbook/assets/pysense-pinout-1.png b/static/gitbook/assets/pysense-pinout-1.png similarity index 100% rename from .gitbook/assets/pysense-pinout-1.png rename to static/gitbook/assets/pysense-pinout-1.png diff --git a/.gitbook/assets/pysense-pinout.pdf b/static/gitbook/assets/pysense-pinout.pdf similarity index 99% rename from .gitbook/assets/pysense-pinout.pdf rename to static/gitbook/assets/pysense-pinout.pdf index 09efef9..031a38a 100644 Binary files a/.gitbook/assets/pysense-pinout.pdf and b/static/gitbook/assets/pysense-pinout.pdf differ diff --git a/.gitbook/assets/pysense-pinout.png b/static/gitbook/assets/pysense-pinout.png similarity index 99% rename from .gitbook/assets/pysense-pinout.png rename to static/gitbook/assets/pysense-pinout.png index 1430153..ea827aa 100644 Binary files a/.gitbook/assets/pysense-pinout.png and b/static/gitbook/assets/pysense-pinout.png differ diff --git a/.gitbook/assets/pysense-specsheet.pdf b/static/gitbook/assets/pysense-specsheet.pdf similarity index 100% rename from .gitbook/assets/pysense-specsheet.pdf rename to static/gitbook/assets/pysense-specsheet.pdf diff --git a/.gitbook/assets/pysense.png b/static/gitbook/assets/pysense.png similarity index 99% rename from .gitbook/assets/pysense.png rename to static/gitbook/assets/pysense.png index 25ee421..f421c1e 100644 Binary files a/.gitbook/assets/pysense.png and b/static/gitbook/assets/pysense.png differ diff --git a/.gitbook/assets/pysense_fipy.png b/static/gitbook/assets/pysense_fipy.png similarity index 98% rename from .gitbook/assets/pysense_fipy.png rename to static/gitbook/assets/pysense_fipy.png index cb31bfa..d71aef7 100644 Binary files a/.gitbook/assets/pysense_fipy.png and b/static/gitbook/assets/pysense_fipy.png differ diff --git a/.gitbook/assets/pysense_gpy.png b/static/gitbook/assets/pysense_gpy.png similarity index 98% rename from .gitbook/assets/pysense_gpy.png rename to static/gitbook/assets/pysense_gpy.png index cb79b45..9c7da77 100644 Binary files a/.gitbook/assets/pysense_gpy.png and b/static/gitbook/assets/pysense_gpy.png differ diff --git a/.gitbook/assets/pysense_lopy.png b/static/gitbook/assets/pysense_lopy.png similarity index 100% rename from .gitbook/assets/pysense_lopy.png rename to static/gitbook/assets/pysense_lopy.png diff --git a/.gitbook/assets/pysense_lopy4.png b/static/gitbook/assets/pysense_lopy4.png similarity index 100% rename from .gitbook/assets/pysense_lopy4.png rename to static/gitbook/assets/pysense_lopy4.png diff --git a/.gitbook/assets/pysense_new.png b/static/gitbook/assets/pysense_new.png similarity index 100% rename from .gitbook/assets/pysense_new.png rename to static/gitbook/assets/pysense_new.png diff --git a/.gitbook/assets/pysense_sipy.png b/static/gitbook/assets/pysense_sipy.png similarity index 100% rename from .gitbook/assets/pysense_sipy.png rename to static/gitbook/assets/pysense_sipy.png diff --git a/.gitbook/assets/pysense_wipy.png b/static/gitbook/assets/pysense_wipy.png similarity index 100% rename from .gitbook/assets/pysense_wipy.png rename to static/gitbook/assets/pysense_wipy.png diff --git a/.gitbook/assets/pytrack (1).png b/static/gitbook/assets/pytrack (1).png similarity index 99% rename from .gitbook/assets/pytrack (1).png rename to static/gitbook/assets/pytrack (1).png index b016715..4183555 100644 Binary files a/.gitbook/assets/pytrack (1).png and b/static/gitbook/assets/pytrack (1).png differ diff --git a/.gitbook/assets/pytrack (2).png b/static/gitbook/assets/pytrack (2).png similarity index 100% rename from .gitbook/assets/pytrack (2).png rename to static/gitbook/assets/pytrack (2).png diff --git a/.gitbook/assets/pytrack-pinout-1.png b/static/gitbook/assets/pytrack-pinout-1.png similarity index 100% rename from .gitbook/assets/pytrack-pinout-1.png rename to static/gitbook/assets/pytrack-pinout-1.png diff --git a/.gitbook/assets/pytrack-pinout.pdf b/static/gitbook/assets/pytrack-pinout.pdf similarity index 100% rename from .gitbook/assets/pytrack-pinout.pdf rename to static/gitbook/assets/pytrack-pinout.pdf diff --git a/.gitbook/assets/pytrack-pinout.png b/static/gitbook/assets/pytrack-pinout.png similarity index 100% rename from .gitbook/assets/pytrack-pinout.png rename to static/gitbook/assets/pytrack-pinout.png diff --git a/.gitbook/assets/pytrack-specsheet-1.pdf b/static/gitbook/assets/pytrack-specsheet-1.pdf similarity index 100% rename from .gitbook/assets/pytrack-specsheet-1.pdf rename to static/gitbook/assets/pytrack-specsheet-1.pdf diff --git a/.gitbook/assets/pytrack.png b/static/gitbook/assets/pytrack.png similarity index 100% rename from .gitbook/assets/pytrack.png rename to static/gitbook/assets/pytrack.png diff --git a/.gitbook/assets/pytrack_app_mode_zadig (1).png b/static/gitbook/assets/pytrack_app_mode_zadig (1).png similarity index 100% rename from .gitbook/assets/pytrack_app_mode_zadig (1).png rename to static/gitbook/assets/pytrack_app_mode_zadig (1).png diff --git a/.gitbook/assets/pytrack_app_mode_zadig.png b/static/gitbook/assets/pytrack_app_mode_zadig.png similarity index 100% rename from .gitbook/assets/pytrack_app_mode_zadig.png rename to static/gitbook/assets/pytrack_app_mode_zadig.png diff --git a/.gitbook/assets/pytrack_dfu_mode_zadig (1).png b/static/gitbook/assets/pytrack_dfu_mode_zadig (1).png similarity index 100% rename from .gitbook/assets/pytrack_dfu_mode_zadig (1).png rename to static/gitbook/assets/pytrack_dfu_mode_zadig (1).png diff --git a/.gitbook/assets/pytrack_dfu_mode_zadig.png b/static/gitbook/assets/pytrack_dfu_mode_zadig.png similarity index 100% rename from .gitbook/assets/pytrack_dfu_mode_zadig.png rename to static/gitbook/assets/pytrack_dfu_mode_zadig.png diff --git a/.gitbook/assets/pytrack_fipy.png b/static/gitbook/assets/pytrack_fipy.png similarity index 100% rename from .gitbook/assets/pytrack_fipy.png rename to static/gitbook/assets/pytrack_fipy.png diff --git a/.gitbook/assets/pytrack_gpy.png b/static/gitbook/assets/pytrack_gpy.png similarity index 100% rename from .gitbook/assets/pytrack_gpy.png rename to static/gitbook/assets/pytrack_gpy.png diff --git a/.gitbook/assets/pytrack_lopy.png b/static/gitbook/assets/pytrack_lopy.png similarity index 100% rename from .gitbook/assets/pytrack_lopy.png rename to static/gitbook/assets/pytrack_lopy.png diff --git a/.gitbook/assets/pytrack_lopy4.png b/static/gitbook/assets/pytrack_lopy4.png similarity index 99% rename from .gitbook/assets/pytrack_lopy4.png rename to static/gitbook/assets/pytrack_lopy4.png index 6794c20..83e150c 100644 Binary files a/.gitbook/assets/pytrack_lopy4.png and b/static/gitbook/assets/pytrack_lopy4.png differ diff --git a/.gitbook/assets/pytrack_new.png b/static/gitbook/assets/pytrack_new.png similarity index 100% rename from .gitbook/assets/pytrack_new.png rename to static/gitbook/assets/pytrack_new.png diff --git a/.gitbook/assets/pytrack_sipy.png b/static/gitbook/assets/pytrack_sipy.png similarity index 100% rename from .gitbook/assets/pytrack_sipy.png rename to static/gitbook/assets/pytrack_sipy.png diff --git a/.gitbook/assets/pytrack_wipy.png b/static/gitbook/assets/pytrack_wipy.png similarity index 98% rename from .gitbook/assets/pytrack_wipy.png rename to static/gitbook/assets/pytrack_wipy.png index a31b429..74ba557 100644 Binary files a/.gitbook/assets/pytrack_wipy.png and b/static/gitbook/assets/pytrack_wipy.png differ diff --git a/.gitbook/assets/quickstarticon.png b/static/gitbook/assets/quickstarticon.png similarity index 100% rename from .gitbook/assets/quickstarticon.png rename to static/gitbook/assets/quickstarticon.png diff --git a/.gitbook/assets/rmt_ex_1 (1).png b/static/gitbook/assets/rmt_ex_1 (1).png similarity index 100% rename from .gitbook/assets/rmt_ex_1 (1).png rename to static/gitbook/assets/rmt_ex_1 (1).png diff --git a/.gitbook/assets/rmt_ex_1.png b/static/gitbook/assets/rmt_ex_1.png similarity index 100% rename from .gitbook/assets/rmt_ex_1.png rename to static/gitbook/assets/rmt_ex_1.png diff --git a/.gitbook/assets/rmt_ex_2 (1).png b/static/gitbook/assets/rmt_ex_2 (1).png similarity index 97% rename from .gitbook/assets/rmt_ex_2 (1).png rename to static/gitbook/assets/rmt_ex_2 (1).png index 7059642..bd09e08 100644 Binary files a/.gitbook/assets/rmt_ex_2 (1).png and b/static/gitbook/assets/rmt_ex_2 (1).png differ diff --git a/.gitbook/assets/rmt_ex_2.png b/static/gitbook/assets/rmt_ex_2.png similarity index 100% rename from .gitbook/assets/rmt_ex_2.png rename to static/gitbook/assets/rmt_ex_2.png diff --git a/.gitbook/assets/rmt_ex_3 (1).png b/static/gitbook/assets/rmt_ex_3 (1).png similarity index 100% rename from .gitbook/assets/rmt_ex_3 (1).png rename to static/gitbook/assets/rmt_ex_3 (1).png diff --git a/.gitbook/assets/rmt_ex_3.png b/static/gitbook/assets/rmt_ex_3.png similarity index 100% rename from .gitbook/assets/rmt_ex_3.png rename to static/gitbook/assets/rmt_ex_3.png diff --git a/.gitbook/assets/rmt_ex_4 (1).png b/static/gitbook/assets/rmt_ex_4 (1).png similarity index 100% rename from .gitbook/assets/rmt_ex_4 (1).png rename to static/gitbook/assets/rmt_ex_4 (1).png diff --git a/.gitbook/assets/rmt_ex_4.png b/static/gitbook/assets/rmt_ex_4.png similarity index 100% rename from .gitbook/assets/rmt_ex_4.png rename to static/gitbook/assets/rmt_ex_4.png diff --git a/.gitbook/assets/selectdevicetypecustomcontract (1).png b/static/gitbook/assets/selectdevicetypecustomcontract (1).png similarity index 100% rename from .gitbook/assets/selectdevicetypecustomcontract (1).png rename to static/gitbook/assets/selectdevicetypecustomcontract (1).png diff --git a/.gitbook/assets/selectdevicetypecustomcontract.png b/static/gitbook/assets/selectdevicetypecustomcontract.png similarity index 99% rename from .gitbook/assets/selectdevicetypecustomcontract.png rename to static/gitbook/assets/selectdevicetypecustomcontract.png index 1dcf834..aa1b278 100644 Binary files a/.gitbook/assets/selectdevicetypecustomcontract.png and b/static/gitbook/assets/selectdevicetypecustomcontract.png differ diff --git a/.gitbook/assets/senet-logo-2.png b/static/gitbook/assets/senet-logo-2.png similarity index 100% rename from .gitbook/assets/senet-logo-2.png rename to static/gitbook/assets/senet-logo-2.png diff --git a/.gitbook/assets/senet-logo.png b/static/gitbook/assets/senet-logo.png similarity index 100% rename from .gitbook/assets/senet-logo.png rename to static/gitbook/assets/senet-logo.png diff --git a/.gitbook/assets/senet-register-complete.png b/static/gitbook/assets/senet-register-complete.png similarity index 100% rename from .gitbook/assets/senet-register-complete.png rename to static/gitbook/assets/senet-register-complete.png diff --git a/.gitbook/assets/senet-register.png b/static/gitbook/assets/senet-register.png similarity index 100% rename from .gitbook/assets/senet-register.png rename to static/gitbook/assets/senet-register.png diff --git a/.gitbook/assets/seq_dis_1-1.png b/static/gitbook/assets/seq_dis_1-1.png similarity index 99% rename from .gitbook/assets/seq_dis_1-1.png rename to static/gitbook/assets/seq_dis_1-1.png index 13c75ec..a89c0a6 100644 Binary files a/.gitbook/assets/seq_dis_1-1.png and b/static/gitbook/assets/seq_dis_1-1.png differ diff --git a/.gitbook/assets/seq_dis_1.png b/static/gitbook/assets/seq_dis_1.png similarity index 100% rename from .gitbook/assets/seq_dis_1.png rename to static/gitbook/assets/seq_dis_1.png diff --git a/.gitbook/assets/seq_dis_2 (1).png b/static/gitbook/assets/seq_dis_2 (1).png similarity index 100% rename from .gitbook/assets/seq_dis_2 (1).png rename to static/gitbook/assets/seq_dis_2 (1).png diff --git a/.gitbook/assets/seq_dis_2.png b/static/gitbook/assets/seq_dis_2.png similarity index 100% rename from .gitbook/assets/seq_dis_2.png rename to static/gitbook/assets/seq_dis_2.png diff --git a/.gitbook/assets/seq_dis_3 (1).png b/static/gitbook/assets/seq_dis_3 (1).png similarity index 100% rename from .gitbook/assets/seq_dis_3 (1).png rename to static/gitbook/assets/seq_dis_3 (1).png diff --git a/.gitbook/assets/seq_dis_3.png b/static/gitbook/assets/seq_dis_3.png similarity index 100% rename from .gitbook/assets/seq_dis_3.png rename to static/gitbook/assets/seq_dis_3.png diff --git a/.gitbook/assets/sigfox-backend-1.png b/static/gitbook/assets/sigfox-backend-1.png similarity index 99% rename from .gitbook/assets/sigfox-backend-1.png rename to static/gitbook/assets/sigfox-backend-1.png index 33da8c2..32478e8 100644 Binary files a/.gitbook/assets/sigfox-backend-1.png and b/static/gitbook/assets/sigfox-backend-1.png differ diff --git a/.gitbook/assets/sigfox-backend-2.png b/static/gitbook/assets/sigfox-backend-2.png similarity index 99% rename from .gitbook/assets/sigfox-backend-2.png rename to static/gitbook/assets/sigfox-backend-2.png index 9c1a84c..1bc3729 100644 Binary files a/.gitbook/assets/sigfox-backend-2.png and b/static/gitbook/assets/sigfox-backend-2.png differ diff --git a/.gitbook/assets/sigfox-backend-3.png b/static/gitbook/assets/sigfox-backend-3.png similarity index 99% rename from .gitbook/assets/sigfox-backend-3.png rename to static/gitbook/assets/sigfox-backend-3.png index 44623f1..dd6c4f3 100644 Binary files a/.gitbook/assets/sigfox-backend-3.png and b/static/gitbook/assets/sigfox-backend-3.png differ diff --git a/.gitbook/assets/sigfox-backend-4.png b/static/gitbook/assets/sigfox-backend-4.png similarity index 99% rename from .gitbook/assets/sigfox-backend-4.png rename to static/gitbook/assets/sigfox-backend-4.png index a1709da..650e703 100644 Binary files a/.gitbook/assets/sigfox-backend-4.png and b/static/gitbook/assets/sigfox-backend-4.png differ diff --git a/.gitbook/assets/sigfox-logo (1).png b/static/gitbook/assets/sigfox-logo (1).png similarity index 100% rename from .gitbook/assets/sigfox-logo (1).png rename to static/gitbook/assets/sigfox-logo (1).png diff --git a/.gitbook/assets/sigfox-logo.png b/static/gitbook/assets/sigfox-logo.png similarity index 100% rename from .gitbook/assets/sigfox-logo.png rename to static/gitbook/assets/sigfox-logo.png diff --git a/.gitbook/assets/sigfox_pigtail_ant_sipy.png b/static/gitbook/assets/sigfox_pigtail_ant_sipy.png similarity index 100% rename from .gitbook/assets/sigfox_pigtail_ant_sipy.png rename to static/gitbook/assets/sigfox_pigtail_ant_sipy.png diff --git a/.gitbook/assets/sigfox_pigtail_sipy.png b/static/gitbook/assets/sigfox_pigtail_sipy.png similarity index 100% rename from .gitbook/assets/sigfox_pigtail_sipy.png rename to static/gitbook/assets/sigfox_pigtail_sipy.png diff --git a/.gitbook/assets/sigfoxactivate (1).png b/static/gitbook/assets/sigfoxactivate (1).png similarity index 99% rename from .gitbook/assets/sigfoxactivate (1).png rename to static/gitbook/assets/sigfoxactivate (1).png index 2426b0f..281aa0a 100644 Binary files a/.gitbook/assets/sigfoxactivate (1).png and b/static/gitbook/assets/sigfoxactivate (1).png differ diff --git a/.gitbook/assets/sigfoxactivate.png b/static/gitbook/assets/sigfoxactivate.png similarity index 100% rename from .gitbook/assets/sigfoxactivate.png rename to static/gitbook/assets/sigfoxactivate.png diff --git a/.gitbook/assets/sigfoxbackend (1).png b/static/gitbook/assets/sigfoxbackend (1).png similarity index 100% rename from .gitbook/assets/sigfoxbackend (1).png rename to static/gitbook/assets/sigfoxbackend (1).png diff --git a/.gitbook/assets/sigfoxbackend.png b/static/gitbook/assets/sigfoxbackend.png similarity index 100% rename from .gitbook/assets/sigfoxbackend.png rename to static/gitbook/assets/sigfoxbackend.png diff --git a/.gitbook/assets/sigfoxcustomcontractstatus (1).png b/static/gitbook/assets/sigfoxcustomcontractstatus (1).png similarity index 100% rename from .gitbook/assets/sigfoxcustomcontractstatus (1).png rename to static/gitbook/assets/sigfoxcustomcontractstatus (1).png diff --git a/.gitbook/assets/sigfoxcustomcontractstatus.png b/static/gitbook/assets/sigfoxcustomcontractstatus.png similarity index 100% rename from .gitbook/assets/sigfoxcustomcontractstatus.png rename to static/gitbook/assets/sigfoxcustomcontractstatus.png diff --git a/.gitbook/assets/sigfoxidpac (1).png b/static/gitbook/assets/sigfoxidpac (1).png similarity index 100% rename from .gitbook/assets/sigfoxidpac (1).png rename to static/gitbook/assets/sigfoxidpac (1).png diff --git a/.gitbook/assets/sigfoxidpac.png b/static/gitbook/assets/sigfoxidpac.png similarity index 100% rename from .gitbook/assets/sigfoxidpac.png rename to static/gitbook/assets/sigfoxidpac.png diff --git a/.gitbook/assets/sigfoxregistrationform (1).png b/static/gitbook/assets/sigfoxregistrationform (1).png similarity index 99% rename from .gitbook/assets/sigfoxregistrationform (1).png rename to static/gitbook/assets/sigfoxregistrationform (1).png index b5080c0..a45a95c 100644 Binary files a/.gitbook/assets/sigfoxregistrationform (1).png and b/static/gitbook/assets/sigfoxregistrationform (1).png differ diff --git a/.gitbook/assets/sigfoxregistrationform.png b/static/gitbook/assets/sigfoxregistrationform.png similarity index 100% rename from .gitbook/assets/sigfoxregistrationform.png rename to static/gitbook/assets/sigfoxregistrationform.png diff --git a/.gitbook/assets/sigfoxtableid (1).png b/static/gitbook/assets/sigfoxtableid (1).png similarity index 100% rename from .gitbook/assets/sigfoxtableid (1).png rename to static/gitbook/assets/sigfoxtableid (1).png diff --git a/.gitbook/assets/sigfoxtableid.png b/static/gitbook/assets/sigfoxtableid.png similarity index 99% rename from .gitbook/assets/sigfoxtableid.png rename to static/gitbook/assets/sigfoxtableid.png index dd9e023..7dddf73 100644 Binary files a/.gitbook/assets/sigfoxtableid.png and b/static/gitbook/assets/sigfoxtableid.png differ diff --git a/.gitbook/assets/sim_fipy.png b/static/gitbook/assets/sim_fipy.png similarity index 100% rename from .gitbook/assets/sim_fipy.png rename to static/gitbook/assets/sim_fipy.png diff --git a/.gitbook/assets/sim_gpy.png b/static/gitbook/assets/sim_gpy.png similarity index 100% rename from .gitbook/assets/sim_gpy.png rename to static/gitbook/assets/sim_gpy.png diff --git a/.gitbook/assets/sipy (1).png b/static/gitbook/assets/sipy (1).png similarity index 99% rename from .gitbook/assets/sipy (1).png rename to static/gitbook/assets/sipy (1).png index 246d1ee..44ebd9c 100644 Binary files a/.gitbook/assets/sipy (1).png and b/static/gitbook/assets/sipy (1).png differ diff --git a/.gitbook/assets/sipy-2.png b/static/gitbook/assets/sipy-2.png similarity index 99% rename from .gitbook/assets/sipy-2.png rename to static/gitbook/assets/sipy-2.png index 0fcd18d..63e27be 100644 Binary files a/.gitbook/assets/sipy-2.png and b/static/gitbook/assets/sipy-2.png differ diff --git a/.gitbook/assets/sipy-pinout.pdf b/static/gitbook/assets/sipy-pinout.pdf similarity index 100% rename from .gitbook/assets/sipy-pinout.pdf rename to static/gitbook/assets/sipy-pinout.pdf diff --git a/.gitbook/assets/sipy-pinout.png b/static/gitbook/assets/sipy-pinout.png similarity index 100% rename from .gitbook/assets/sipy-pinout.png rename to static/gitbook/assets/sipy-pinout.png diff --git a/.gitbook/assets/sipy-specsheet.pdf b/static/gitbook/assets/sipy-specsheet.pdf similarity index 100% rename from .gitbook/assets/sipy-specsheet.pdf rename to static/gitbook/assets/sipy-specsheet.pdf diff --git a/.gitbook/assets/sipy.png b/static/gitbook/assets/sipy.png similarity index 100% rename from .gitbook/assets/sipy.png rename to static/gitbook/assets/sipy.png diff --git a/.gitbook/assets/traffic (1).gif b/static/gitbook/assets/traffic (1).gif similarity index 100% rename from .gitbook/assets/traffic (1).gif rename to static/gitbook/assets/traffic (1).gif diff --git a/.gitbook/assets/traffic.gif b/static/gitbook/assets/traffic.gif similarity index 100% rename from .gitbook/assets/traffic.gif rename to static/gitbook/assets/traffic.gif diff --git a/.gitbook/assets/ttn-1 (1).png b/static/gitbook/assets/ttn-1 (1).png similarity index 100% rename from .gitbook/assets/ttn-1 (1).png rename to static/gitbook/assets/ttn-1 (1).png diff --git a/.gitbook/assets/ttn-1.png b/static/gitbook/assets/ttn-1.png similarity index 100% rename from .gitbook/assets/ttn-1.png rename to static/gitbook/assets/ttn-1.png diff --git a/.gitbook/assets/ttn-10 (1).png b/static/gitbook/assets/ttn-10 (1).png similarity index 100% rename from .gitbook/assets/ttn-10 (1).png rename to static/gitbook/assets/ttn-10 (1).png diff --git a/.gitbook/assets/ttn-10.png b/static/gitbook/assets/ttn-10.png similarity index 100% rename from .gitbook/assets/ttn-10.png rename to static/gitbook/assets/ttn-10.png diff --git a/.gitbook/assets/ttn-2 (1).png b/static/gitbook/assets/ttn-2 (1).png similarity index 100% rename from .gitbook/assets/ttn-2 (1).png rename to static/gitbook/assets/ttn-2 (1).png diff --git a/.gitbook/assets/ttn-2.png b/static/gitbook/assets/ttn-2.png similarity index 100% rename from .gitbook/assets/ttn-2.png rename to static/gitbook/assets/ttn-2.png diff --git a/.gitbook/assets/ttn-4 (1).png b/static/gitbook/assets/ttn-4 (1).png similarity index 100% rename from .gitbook/assets/ttn-4 (1).png rename to static/gitbook/assets/ttn-4 (1).png diff --git a/.gitbook/assets/ttn-4.png b/static/gitbook/assets/ttn-4.png similarity index 100% rename from .gitbook/assets/ttn-4.png rename to static/gitbook/assets/ttn-4.png diff --git a/.gitbook/assets/ttn-5 (1).png b/static/gitbook/assets/ttn-5 (1).png similarity index 100% rename from .gitbook/assets/ttn-5 (1).png rename to static/gitbook/assets/ttn-5 (1).png diff --git a/.gitbook/assets/ttn-5.png b/static/gitbook/assets/ttn-5.png similarity index 100% rename from .gitbook/assets/ttn-5.png rename to static/gitbook/assets/ttn-5.png diff --git a/.gitbook/assets/ttn-6 (1).png b/static/gitbook/assets/ttn-6 (1).png similarity index 100% rename from .gitbook/assets/ttn-6 (1).png rename to static/gitbook/assets/ttn-6 (1).png diff --git a/.gitbook/assets/ttn-6.png b/static/gitbook/assets/ttn-6.png similarity index 100% rename from .gitbook/assets/ttn-6.png rename to static/gitbook/assets/ttn-6.png diff --git a/.gitbook/assets/ttn-7 (1).png b/static/gitbook/assets/ttn-7 (1).png similarity index 100% rename from .gitbook/assets/ttn-7 (1).png rename to static/gitbook/assets/ttn-7 (1).png diff --git a/.gitbook/assets/ttn-7.png b/static/gitbook/assets/ttn-7.png similarity index 100% rename from .gitbook/assets/ttn-7.png rename to static/gitbook/assets/ttn-7.png diff --git a/.gitbook/assets/ttn-8 (1).png b/static/gitbook/assets/ttn-8 (1).png similarity index 100% rename from .gitbook/assets/ttn-8 (1).png rename to static/gitbook/assets/ttn-8 (1).png diff --git a/.gitbook/assets/ttn-8.png b/static/gitbook/assets/ttn-8.png similarity index 100% rename from .gitbook/assets/ttn-8.png rename to static/gitbook/assets/ttn-8.png diff --git a/.gitbook/assets/ttn-9 (1).png b/static/gitbook/assets/ttn-9 (1).png similarity index 100% rename from .gitbook/assets/ttn-9 (1).png rename to static/gitbook/assets/ttn-9 (1).png diff --git a/.gitbook/assets/ttn-9.png b/static/gitbook/assets/ttn-9.png similarity index 100% rename from .gitbook/assets/ttn-9.png rename to static/gitbook/assets/ttn-9.png diff --git a/.gitbook/assets/ttn-gatewayreg-11-2017-2 (1).jpg b/static/gitbook/assets/ttn-gatewayreg-11-2017-2 (1).jpg similarity index 99% rename from .gitbook/assets/ttn-gatewayreg-11-2017-2 (1).jpg rename to static/gitbook/assets/ttn-gatewayreg-11-2017-2 (1).jpg index 64fad30..bd836ec 100644 Binary files a/.gitbook/assets/ttn-gatewayreg-11-2017-2 (1).jpg and b/static/gitbook/assets/ttn-gatewayreg-11-2017-2 (1).jpg differ diff --git a/.gitbook/assets/ttn-gatewayreg-11-2017-2.jpg b/static/gitbook/assets/ttn-gatewayreg-11-2017-2.jpg similarity index 100% rename from .gitbook/assets/ttn-gatewayreg-11-2017-2.jpg rename to static/gitbook/assets/ttn-gatewayreg-11-2017-2.jpg diff --git a/.gitbook/assets/ttn-logo.png b/static/gitbook/assets/ttn-logo.png similarity index 100% rename from .gitbook/assets/ttn-logo.png rename to static/gitbook/assets/ttn-logo.png diff --git a/.gitbook/assets/ttn.png b/static/gitbook/assets/ttn.png similarity index 100% rename from .gitbook/assets/ttn.png rename to static/gitbook/assets/ttn.png diff --git a/.gitbook/assets/tutorialsicon (1).png b/static/gitbook/assets/tutorialsicon (1).png similarity index 100% rename from .gitbook/assets/tutorialsicon (1).png rename to static/gitbook/assets/tutorialsicon (1).png diff --git a/.gitbook/assets/tutorialsicon.png b/static/gitbook/assets/tutorialsicon.png similarity index 100% rename from .gitbook/assets/tutorialsicon.png rename to static/gitbook/assets/tutorialsicon.png diff --git a/.gitbook/assets/uart_fipy.png b/static/gitbook/assets/uart_fipy.png similarity index 100% rename from .gitbook/assets/uart_fipy.png rename to static/gitbook/assets/uart_fipy.png diff --git a/.gitbook/assets/uart_gpy.png b/static/gitbook/assets/uart_gpy.png similarity index 100% rename from .gitbook/assets/uart_gpy.png rename to static/gitbook/assets/uart_gpy.png diff --git a/.gitbook/assets/uart_lopy.png b/static/gitbook/assets/uart_lopy.png similarity index 100% rename from .gitbook/assets/uart_lopy.png rename to static/gitbook/assets/uart_lopy.png diff --git a/.gitbook/assets/uart_lopy4.png b/static/gitbook/assets/uart_lopy4.png similarity index 100% rename from .gitbook/assets/uart_lopy4.png rename to static/gitbook/assets/uart_lopy4.png diff --git a/.gitbook/assets/uart_sipy.png b/static/gitbook/assets/uart_sipy.png similarity index 100% rename from .gitbook/assets/uart_sipy.png rename to static/gitbook/assets/uart_sipy.png diff --git a/.gitbook/assets/uart_wipy.png b/static/gitbook/assets/uart_wipy.png similarity index 99% rename from .gitbook/assets/uart_wipy.png rename to static/gitbook/assets/uart_wipy.png index e436684..8a009a3 100644 Binary files a/.gitbook/assets/uart_wipy.png and b/static/gitbook/assets/uart_wipy.png differ diff --git a/.gitbook/assets/universal_reference (1).png b/static/gitbook/assets/universal_reference (1).png similarity index 100% rename from .gitbook/assets/universal_reference (1).png rename to static/gitbook/assets/universal_reference (1).png diff --git a/.gitbook/assets/universal_reference.png b/static/gitbook/assets/universal_reference.png similarity index 99% rename from .gitbook/assets/universal_reference.png rename to static/gitbook/assets/universal_reference.png index a232c1a..c7c9cd5 100644 Binary files a/.gitbook/assets/universal_reference.png and b/static/gitbook/assets/universal_reference.png differ diff --git a/.gitbook/assets/vs_code_icon.png b/static/gitbook/assets/vs_code_icon.png similarity index 100% rename from .gitbook/assets/vs_code_icon.png rename to static/gitbook/assets/vs_code_icon.png diff --git a/.gitbook/assets/vsc_config_step_1-1.png b/static/gitbook/assets/vsc_config_step_1-1.png similarity index 100% rename from .gitbook/assets/vsc_config_step_1-1.png rename to static/gitbook/assets/vsc_config_step_1-1.png diff --git a/.gitbook/assets/vsc_config_step_1.png b/static/gitbook/assets/vsc_config_step_1.png similarity index 100% rename from .gitbook/assets/vsc_config_step_1.png rename to static/gitbook/assets/vsc_config_step_1.png diff --git a/.gitbook/assets/vsc_config_step_2-1.png b/static/gitbook/assets/vsc_config_step_2-1.png similarity index 100% rename from .gitbook/assets/vsc_config_step_2-1.png rename to static/gitbook/assets/vsc_config_step_2-1.png diff --git a/.gitbook/assets/vsc_config_step_2.png b/static/gitbook/assets/vsc_config_step_2.png similarity index 100% rename from .gitbook/assets/vsc_config_step_2.png rename to static/gitbook/assets/vsc_config_step_2.png diff --git a/.gitbook/assets/vsc_config_step_3-1.png b/static/gitbook/assets/vsc_config_step_3-1.png similarity index 100% rename from .gitbook/assets/vsc_config_step_3-1.png rename to static/gitbook/assets/vsc_config_step_3-1.png diff --git a/.gitbook/assets/vsc_config_step_3.png b/static/gitbook/assets/vsc_config_step_3.png similarity index 100% rename from .gitbook/assets/vsc_config_step_3.png rename to static/gitbook/assets/vsc_config_step_3.png diff --git a/.gitbook/assets/vsc_config_step_4 (1).png b/static/gitbook/assets/vsc_config_step_4 (1).png similarity index 100% rename from .gitbook/assets/vsc_config_step_4 (1).png rename to static/gitbook/assets/vsc_config_step_4 (1).png diff --git a/.gitbook/assets/vsc_config_step_4.png b/static/gitbook/assets/vsc_config_step_4.png similarity index 100% rename from .gitbook/assets/vsc_config_step_4.png rename to static/gitbook/assets/vsc_config_step_4.png diff --git a/.gitbook/assets/vsc_config_step_5-1.png b/static/gitbook/assets/vsc_config_step_5-1.png similarity index 100% rename from .gitbook/assets/vsc_config_step_5-1.png rename to static/gitbook/assets/vsc_config_step_5-1.png diff --git a/.gitbook/assets/vsc_config_step_5.png b/static/gitbook/assets/vsc_config_step_5.png similarity index 100% rename from .gitbook/assets/vsc_config_step_5.png rename to static/gitbook/assets/vsc_config_step_5.png diff --git a/.gitbook/assets/vsc_config_step_6 (1).png b/static/gitbook/assets/vsc_config_step_6 (1).png similarity index 100% rename from .gitbook/assets/vsc_config_step_6 (1).png rename to static/gitbook/assets/vsc_config_step_6 (1).png diff --git a/.gitbook/assets/vsc_config_step_6.png b/static/gitbook/assets/vsc_config_step_6.png similarity index 100% rename from .gitbook/assets/vsc_config_step_6.png rename to static/gitbook/assets/vsc_config_step_6.png diff --git a/.gitbook/assets/vsc_setup_step_1-1.png b/static/gitbook/assets/vsc_setup_step_1-1.png similarity index 100% rename from .gitbook/assets/vsc_setup_step_1-1.png rename to static/gitbook/assets/vsc_setup_step_1-1.png diff --git a/.gitbook/assets/vsc_setup_step_1.png b/static/gitbook/assets/vsc_setup_step_1.png similarity index 99% rename from .gitbook/assets/vsc_setup_step_1.png rename to static/gitbook/assets/vsc_setup_step_1.png index 599ea14..27432a5 100644 Binary files a/.gitbook/assets/vsc_setup_step_1.png and b/static/gitbook/assets/vsc_setup_step_1.png differ diff --git a/.gitbook/assets/vsc_setup_step_2-1.png b/static/gitbook/assets/vsc_setup_step_2-1.png similarity index 100% rename from .gitbook/assets/vsc_setup_step_2-1.png rename to static/gitbook/assets/vsc_setup_step_2-1.png diff --git a/.gitbook/assets/vsc_setup_step_2.png b/static/gitbook/assets/vsc_setup_step_2.png similarity index 100% rename from .gitbook/assets/vsc_setup_step_2.png rename to static/gitbook/assets/vsc_setup_step_2.png diff --git a/.gitbook/assets/vsc_setup_step_3 (1).png b/static/gitbook/assets/vsc_setup_step_3 (1).png similarity index 100% rename from .gitbook/assets/vsc_setup_step_3 (1).png rename to static/gitbook/assets/vsc_setup_step_3 (1).png diff --git a/.gitbook/assets/vsc_setup_step_3.png b/static/gitbook/assets/vsc_setup_step_3.png similarity index 100% rename from .gitbook/assets/vsc_setup_step_3.png rename to static/gitbook/assets/vsc_setup_step_3.png diff --git a/.gitbook/assets/vsc_setup_step_4 (1).png b/static/gitbook/assets/vsc_setup_step_4 (1).png similarity index 100% rename from .gitbook/assets/vsc_setup_step_4 (1).png rename to static/gitbook/assets/vsc_setup_step_4 (1).png diff --git a/.gitbook/assets/vsc_setup_step_4.png b/static/gitbook/assets/vsc_setup_step_4.png similarity index 100% rename from .gitbook/assets/vsc_setup_step_4.png rename to static/gitbook/assets/vsc_setup_step_4.png diff --git a/.gitbook/assets/vsc_setup_step_5 (1).png b/static/gitbook/assets/vsc_setup_step_5 (1).png similarity index 100% rename from .gitbook/assets/vsc_setup_step_5 (1).png rename to static/gitbook/assets/vsc_setup_step_5 (1).png diff --git a/.gitbook/assets/vsc_setup_step_5.png b/static/gitbook/assets/vsc_setup_step_5.png similarity index 98% rename from .gitbook/assets/vsc_setup_step_5.png rename to static/gitbook/assets/vsc_setup_step_5.png index a5df897..a96bd8f 100644 Binary files a/.gitbook/assets/vsc_setup_step_5.png and b/static/gitbook/assets/vsc_setup_step_5.png differ diff --git a/.gitbook/assets/w01 (1).png b/static/gitbook/assets/w01 (1).png similarity index 99% rename from .gitbook/assets/w01 (1).png rename to static/gitbook/assets/w01 (1).png index 1f024bb..a58cbe6 100644 Binary files a/.gitbook/assets/w01 (1).png and b/static/gitbook/assets/w01 (1).png differ diff --git a/.gitbook/assets/w01-drawing.pdf b/static/gitbook/assets/w01-drawing.pdf similarity index 100% rename from .gitbook/assets/w01-drawing.pdf rename to static/gitbook/assets/w01-drawing.pdf diff --git a/.gitbook/assets/w01-pinout.pdf b/static/gitbook/assets/w01-pinout.pdf similarity index 99% rename from .gitbook/assets/w01-pinout.pdf rename to static/gitbook/assets/w01-pinout.pdf index e70d476..95ee5d1 100644 --- a/.gitbook/assets/w01-pinout.pdf +++ b/static/gitbook/assets/w01-pinout.pdf @@ -1067,7 +1067,7 @@ s @^c9xwoեowVg^7^ͿԷCͧarWL]SPO}~wLz 3?HM'{!ZpJ R)8ºӨ(N)i%@iI0|}lM1HB6>`)N:?h3:dqP= G6|Co A= ixUz['a.0#%Œ#$ҙ,@;0;BW{c1v%G jx =g&8; u!vdgvggXgݹ3q,|/>Gĥet0'% np C.^.ÅH =ŧ"؃2[dd@DO@ ^ZzK|" x@aPPF#>{ĥtt s/>h ZYBuˣ:^DT+Ovn`򐊧) ՔMM\ -[8聳5tA=&`SN]8ة3qX7;q#{%5ֺP)`dтfgLarjF 3EeHfVY0[{bjvfbcPJm5MA[ 5!TAAzlZc+=4hTĂRJnZhRe+vXLId!$sg,>xK,\URu{]#ߪ.4, l%EjHM9$!h@ػ4<[yϹHUO޾"|ڳOqkvԺ50oC3;n\6?W\k:UQFt]RUT$]#+HrDW UZJCk򐆱8R.ا 0@ I{#ߣq[kw,Ye4l˚k[QiЙ&n{tF"S:j7[`4O-%Y@ %Y01'*oĝTFV'jSchM)Q6'x+%cdJB B <_y=<#Ox{ʢa8sʮ@H2pC6҇\J¦`L\R& m q&M¸0jȾ?i ߸=_+aq+0';~0<4{P2;q50,ik]ܶ34Ж%%$ K#KP=Հ2Ȓ |U;8S9X=sVageAYP0q O◟YPvJ8g ̾&#&'qD$$0qSVr$Hgq.A%n qQ #H(⎑1&dz6zIx;A6;yή_4Ɖ_rǴ>OjIJm Ќl̆Žaq}\(4|z><m^"G␛6ۼVf';ÇOg| /Sqή29_9GVNIR)dV9JGH k\ G#r*gD +[8聳5tA=&`SN]8ة3qX7;q#{%5ֺP)`dтfgLarjF 3EeHfVY0[{bjvfbcPJm5MA[ 5!TAAzlZc+=4hTĂRJnZhRe+vXLId!$sg,>xK,\URu{]#ߪ.4, l%EjHM9$!h@ػ4<[yϹHUO޾"|ڳOqkvԺ50oC3;n\6?W\k:UQFt]RUT$]#+HrDW UZJCk򐆱8R.ا 0@ I{#ߣq[kw,Ye4l˚k[QiЙ&n{tF"S:j7[`4O-%Y@ %Y01'*oĝTFV'jSchM)Q6'x+%cdJB B <_y=<#Ox{ʢa8sʮ@H2pC6҇\J¦`L\R& m q&M¸0jȾ?i ߸=_+aq+0';~0<4{P2;q50,ik]ܶ34Ж%%$ K#KP=Հ2Ȓ |U;8S9X=sVageAYP0q O◟YPvJ8g ̾&#&'qD$$0qSVr$Hgq.A%n qQ #H(⎑1&dz6zIx;A6;yή_4Ɖ_rǴ>OjIJm Ќl̆Žaq}(4|z><m^"G␛6ۼVf';ÇOg| /Sqή29_9GVNIR)dV9JGH k\ G#r*gD ]ū][Ԅ-&-LlAjĎo$4Į v5{xc? ٌLk9}.e3I6{By-;P taȜ.\ cQ)FPIȽmrY3{b @@ -1177,7 +1177,7 @@ G Rd%xŸ.OWUjt%\ &BILkج§I8OGk~ :n:#g$`qFo΀f|4i#i3~t+]V]=HPF uD}cNؙ3~8Q_4QH|^I\I\\+\%VWon@o~r?2ΦrT*7Ң--ؐJh䁩tޖOA4t?_>CiPʁ7S`);IY r69>N[S h3i ʃNC"A̙4ٌd?ўItn.-: I s)a>%Υ/$ 77WWkG7d֙93Y~Sa㢰uQ\|Y(qY㲴}Uq]\eU\WmW#n]2pshY%Uit^p(uݣj?U'!NA1hR&Iu&i1ORڣeҍL||4#[_ύ֟P cTNкK+a &Sz. -CL(ͷӛ7=7<%S0w$Ý7\h|ZD ֖dl !6%cUle,b,Dkf7WDk&̏5trsbSze89w=p~.uQ%,TII9Icp5 T|nX=^}+}.DCmn>tԾg?~"^~BS-?3s[qߖ<7]AݩcmC<ȣ8NCh[FlzP_z 9m6n?\(Ud"Zuw^ +CL(ͷӛ7=7<%S0w$Ý7\h|ZD ֖dl !6%cUle,b,Dkf7WDk&̏5trsbSze89w=p~.uQ%,TII9Icp5 T|nX=^}+}.DCmn>tԾg?~"^~BS-?3s[qߖ<7]AݩcmC<ȣ8NCh[FlzP_z 9m6n?(Ud"Zuw^ ;uSlmkc:QǘKo8 _ #>qKw5ݍGݥ֮ {r\u _OyW>}kL>5>l~%V x*c>k#>7F>mD#:$MHuH`Џt@Bu$+>Q *IA!HS"\*eɄVe^ @@ -1211,7 +1211,7 @@ a Μ̠ z̘TgIiDO*u=tRvm'f) ;քz(A:yOdt@p!DA*v|5p]Uĸ^\cRhcM\;[IJ]F%nM5⁡If1ӎO3އB=B?g74Lbm\Rcjv6uu#&8cĠfot0A&Z5Ijdkh 9q\ĕq┆W"mƘ1„aLDq9 #("#灏q'x $EI  QeckNhWsDphsiM"Bh*$N8&qx.F&Т݁ csR~yGAyFAiqV 3Z” ]?_냰aٞX>6o{Gpsr=3!|a&kRiC47s!/,azFMhz*j@ K.J.Ӆ^g=vdgzQ0LSZ# QA%%beW@[}|Oޚ=AnSz 8W_EH_.|Ϡ}l>CcC/6z%Lmg46x-3>. o_[{k+>W--ܣ +h, sgnn,5=mO-QZShNs vь=7wD@cL!O[3 3wmhM"z346!^x}HYS^+=ڣj}'Q UD#KKU,YiI8kNP`,YSx/E]0D !htDa<"7Qo0HŒ^DbLtNBpT[g( f2tvim )? M 4Ɵ/ez5JquLEWycjOLyM=DUwTcQTuM򣹦^NJQ# -wM+1UT*\(\U* +wM+1UT*(\U* 9}X#|4~e@g07yҘ7]'07\q*]"1\g#l[.EsB0 v܏9$1;|C~]r ^%Hh8tAΐBSl /ҋ Pda@z' RFn-ܱ#&u1'qI(Z4Ьci 21&J (eSbJTi&a]/b%=EX]tPe0+O.^&dMj5MJԔ*P&t8P$tCjMyFi2-i-e:LGn%ۃ<幃<D@H}_ @@ -1361,7 +1361,7 @@ Hݮ {MXTNj>ODd)D\X~_3&}<߿m?4{Q* b3B$gR ϥČϡ$q]^idY屲el+ @MBBPF%hBMꀬYoՌvi<tϽa:sϹRB rg̎dz(;NBNP{j'X>0 `& JLg3)̺'99`& Ml_n yq4>zy [(ANCF~Ndhz#9L@6)ddbd*s69:˜m]).\f^>an9;,W,_F^#O#݂oFv.F x"ˑK^A egCaoڷ˕Fr!탘Gr%_Qe|y=*/r< \kb$G?IB$+͚amvv]h( Yޓ=ޗ=\qd@q*Dzwχ\qǍ\ndIT8cƪzBa4kתJń1oZT``醿/Ѝ!`(i-]Wn@|g ݘ.gJ4mLTI8A#EէhcdL/W Z oC$SL8+\Mes6aD\s *8̢[%t>I7jIY)jV3a-1M7o ħ\|'c毸9ŋtQ]jG~8}uxk/؋B/wy%FK"8Ԉ^ޚXl,y!wDkцGs]/HcoťB%p^ ѡەBܛ.B-| `w$55XP Pݐ `YBHLc5WsUTwUu5{EsV5wEušu'Q6܈iGM;b:D3R-7tR^8]gmZ.Hlvj[m'v[6մ&PF-*)hBrɩ1F11NTHU2jIDNVut~wޯ~~o`@~?~6" j0'4ğKcOC$Q҃I)n ~97(IUb()a b'IOx+ڇ[32Q 'I|B$a{Ks7'z/^;ǽ785S7Ae9.J/9nQ'5ex5_P%7ȷBAХjF1)i);>VC-tֱ'6&l!" O%78II(6xRvކn*nZ%{K28Zg)x:D-L\'"X.DJMIN\rHIu1ӌ '#ɘIC%Ŷ)K V\I6)NLt oEn֊\I廤#B7Ok@:Z 1 ؍DH[_5O^ [T_=ϽoWy}GX{򼰴௕ r0_v`݌˛&DpiAK:JZPܚS-dhhHdsAs<@8VsNJsSsnff9'ELsjeIWjlBEA/Ҍ^IL|ۋI4^HԦdRx1 +,q%jt=Z֢]pWѵV֎0Ub+l{i^ni=\ԵRTˍeNE'(]H[{! nHrC8+tN X1etˀ 1P6Q]Yds.V(,YKaP`K lDz K(yDS\݈;$a\UPم "AP$v;Sq>T_=ϽoWy}GX{򼰴௕ r0_v`݌˛&DpiAK:JZPܚS-dhhHdsAs<@8VsNJsSsnff9'ELsjeIWjlBEA/Ҍ^IL|ۋI4^HԦdRx1 BBROc6C2VG\ʀ.ro _RYP!K]Kk&3Uh[ǦAߋ|A|Yu3W*SHE:'X}:ysL*tULNWPQ *HPHHfJWt WT,Q)YS%LD?R>@)o0{bb{c,ጹ?ϢYc4{|h YHyc? sF01")ŸӧY73$> NBP$:sL'1uD].y6qx G?a>@?n1zLX (5x8gޘD(=Q;"ݑ}WHA~s joBh6q,;B| !/cU{3:o% &w 7Fa7p17Q DV]O\?E#~QaGel&nvY}S۷^ïݹU#v/6 @@ -2066,7 +2066,7 @@ KP UfJަvCNپm9*-{Uw\l. rN ao f`A,$=/ .ll(\9Ȓ,Q+z.rE}+07ͽk\\&U{W9qS߿m{e]%G2V_STHzl[?? ~kяt<ȆOHƐ{ac%# cE# b .QJ!de-$iAQ ڡ[K:^;#NQ TNẺ8<0:m q"L08!B} l/ ׃<z  yU-AaN sń(BfB|?@BXaH"x-$Q߸oS6Cq ̑d|]؏JZiQi@"0&b0 -Hgy3 QGوJz2_bo-<x.@=`GO,9FQeSp+S|̎=)2;c|P=9@=̃@M@H}>Pghĭ'ev@hCz(s?܋f>4xG^ne72l0g&}OC6T_i 3:/(讏󐢗Ⱦ œ*yJL5.I)Lwݰu`;"=^΍WÎ<t{8in ͍@74"jUU\UiIv\=!Z`5oCh 0xWﶌmAu0N^9 7ܹ*gbx'3[ !`8M8}7Y﴾l M2_bo-<x.@=`GO,9FQeSp+S|̎=)2;c|P=9@=̃@M@H}>Pghĭ'ev@hCz(s?܋f>4xG^ne72l0g&}OC6T_i 3:/(讏󐢗Ⱦ œ*yJL5.I)Lwݰu`;"=^΍WÎ<t{8in ͍@74"jUU\UiIv\=!Z`5oCh 0xWﶌmAu0N^9 7ܹ*gbx'3[ !`8M8}7Y﴾l M4I/f~z`!UY2/^:]y}YYLU/P) @@ -2608,7 +2608,7 @@ P~ _%-oKif\[3L \X@%UMlm#غ*@W-TJV`Pb#$ V.Kۧ AXpJlDق+V()'qWrS|&3 `J˧V0ᢉ!p 2V|>ia@e\yY-Uy ]F̛Jy XqG&A.l"{[Y#{ ~u4x5ֿ滶gFE JvPB3]!;sރR\ #oT|z߁޷C~:kP?49 ;G71׿ݤn7K:>x çhFg59!=5GMZ&AiB 536hV&ɠDКʬv1$;O }Rh6N!bb N}-zx:o ! -ČoVa F_ <#9% !CRЉ1xb !b HOI"aڋɕ`HR+K~=f-G%Ɖ8i5 [#D '' Ҟ)ƞ@R :;V۹3WƊېxх\(n\Dݘ!$8%{)K~BѲ.Rd Saʯ3Yo #Iۏ9vwd.KxY[dAJh#sb)11'XфI&\F/XWWeKFdKdHBDIFBHՎ$Tᷙst+QEPQQAr @IHD:}fjaO_gU_o'yp/!<$0;#»#}]ܻC ?;\;)GH{B#qR)q +ČoVa F_ <#9% !CRЉ1xb !b HOI"aڋɕ`HR+K~=f-G%Ɖ8i5 [#D '' Ҟ)ƞ@R :;V۹3WƊېxх(n\Dݘ!$8%{)K~BѲ.Rd Saʯ3Yo #Iۏ9vwd.KxY[dAJh#sb)11'XфI&\F/XWWeKFdKdHBDIFBHՎ$Tᷙst+QEPQQAr @IHD:}fjaO_gU_o'yp/!<$0;#»#}]ܻC ?;\;)GH{B#qR)q pgMjI |NdKDêփN$):3xugITmhaM - 0-e/ PQK^B0E|CA{2^lB.X>}Zx+[C|I ͉| >ƃUYe"E<U|yG-;|$!L4!,)Ii039RC:G)L\;!\EjA 5a6[w;揈Pd' XE^ *rhd_!ʈe+@]Vu)4a(ӥ#zChs]?b,.rX/B;/x8(a2+myKo"Ax!PW~%3ݬfz({1:^έ\A!B27n|F#:'N;꣜%g*nH%cXe%c#}?s~8|utf21tb:[zD\/>FI(7.[HQTͼXy6Yo^$ME6ڛ3 *Q]#kNkF봴Jaic*1JZaXA(+G)V J$,32,= 2TVRCHAJX0#Z.Q5 DՂd5Dz!Y | *A$< *(ĸ8qla)W|󰴘e &|Dq`8#!|Lcj #|)M` @@ -3521,7 +3521,7 @@ oĈ  Ӧz4a)RB=LUIQ/^n.abbj1wLh0{ow w Vq1ƎSc+m ( DQ#s(aŭFrpp0bX*5p}+!9YjH+Jr( -Xl E *40S *b`W d@L5@(רIq>W=aܺۃv.]\htؔӎvÆCkΰb?[EF`ӓ؄ Zi)Щ[z8IDJ1V݀5ō5nLi9y#  endstream endobj 171 0 obj <> endobj 174 0 obj <>stream +Xl E *40S *b`W d@L5@(רIq>W=aܺۃv.]\htؔӎvÆCkΰb?[EF`ӓ؄ Zi)Щ[z8IDJ1V݀5ō5nLi9y#  endstream endobj 171 0 obj <> endobj 174 0 obj <>stream HWGǿ]ݯ$D#AѸ/ `h\Ƹ&jD "If&1&3.qFs2?0?MϽֽu?^Ug/JD3vG+شzS8ǿۍq)v2n{gJ 9hZ x:$'&8Z Ƀz&sG}|S24aXɼ4{J쒆r/MIl=x7-5#Mo ~(}/8BSPvH 4DQjB$bG!y]QI ۿa3EMӧi4M7M, ԧާL9ߴi>EU?էW*>mE6sv4ThAdS 䁥4)be~' XWe ~p2i^S߷O؛?O}уO&0ŜF.ߝ_ԟI>[?L'^n󬊟?+-io axG~ z r&(*:Ց%0TCdM2d t,(*kt@kL[ @O`{ÆO*)EQF od=g::76_6F3v\(5aZB1:ni Vr@dc⊜=xn[趭Ó4o/ں.ViJcK֫oBŏV-X}QPr7 VѲb\6_6F3v(5aZB1:ni Vr@dc⊜=xn[趭Ó4o/ں.ViJcK֫oBŏV-X}QPr7 VѲb\b麅vh?fp[י-PDӐ?ʧB_P"tExsSASwn<oT+'~s1O^BjҌ#7F=.!ɚT0EBMnc͟(տzw5MÄK, Q Tthhhha*%1`ܻ?PAc.?}?!U V>Y(5OOWѿs:Bu1YgBZTHj,+*䟫 E4T#&5p,ȺeV n-g緢4>TvejǤXr |Ce@\o]/>q{>3?QBڹ}om?JtS[}^J:46>Q~~؂֕S"-ЬBXE9|ԛcY7` M4UMd ! @@ -4109,7 +4109,7 @@ f (9Q4DT mUx+sKzm-:(Ư\uxmCIԡ$*V!Ci$a+'zUxK-Y QJ_{&ouzwQ %1MPrⱁFm5 X[C"."Q.",As(,#`q[89_u0<1!v$~ [x`I*]Fh ~Jb2'讛F=R˩6&gcQ򁥭iFj`(m#mբ0vOO=hDYb502JptaYLBH&P{ why>|Ckշ'B 6zJ( Gqef@x Y%d:֢~\YvR~JAc>!E 퓖j` ,530Ze)Gc4r@4 B3#will!)1l)UA_ENJNG :QDVB8ǡIHDsCi'vjD  -<(Q*‹"\(Dq˫HQ'Ҵ):&r8;Qb2p|*}Y,3No1@:=fø<(_|Z{*NЌMm|aRژ4Ɖclc*g"t1ˀFd5a鿃Z:=b~yEQ0i17^ *ZbQ(HhD +<(Q*‹"(Dq˫HQ'Ҵ):&r8;Qb2p|*}Y,3No1@:=fø<(_|Z{*NЌMm|aRژ4Ɖclc*g"t1ˀFd5a鿃Z:=b~yEQ0i17^ *ZbQ(HhD v$Ba/%Ŭd5p:u! B1T$K7#FT]Mv5,(hqyN^(&QIu`e{oɟ|O0IJ`nD:JDw8&nb>i? DQRxL} 㹃'*,QeȰ +,XN@T!vP7(z>jfu#9Fdh#QcLEm,56دYUȀj]);Thq"_]Qt}ˎ䂼AS<䂼o>X7CowE` U4'K4~"re.q`l܍wf1bŘ"3$o-U@4hba۴YoXy//:rCxd%\yc%xJ,Nƛа 0Tq*O"rmõ#M`]uUܩȃ%Ĵ!_U:`[w%wF`;ڥ1ڞp18g9xB KTdD9w|[CvPZp5D`O5oL D-뷓DW'o!| )bdq@Dab{mUō˸ >d%I8<ĕ:ȝ@JKjkذէӐ|:Rݿ@CmQd18hKXc]iNZ۬'+o=p8@XnwTd;}%f$ag'jnwknmLF`04ZM7ӎHg=!\m0`M7ϹJ~DYmNNDYKs J/  ӡunш:6DrI&YgK6]6Bj<:] \aH ~?)Qp.1Y$=i\NVh t,eZq& @@ -4535,7 +4535,7 @@ p ;!a;:4 ۷IC:J;i=p( n䦽Ĝ1y 4cHK\& pο%"yE=H 33HD6XgsϾ!QUqؗ.8&l7\l@ƙc~3k0U9 ̪B2=Gӳ(L":r{Fs;$R_QD+P=s R~fuӸT\6#8j<@3`\GYT:BbPDHsU':p|=N9a)&B^~%[NX a"Ǚ,?P1lXP[^ Vg,X0/RkAb1mgE m}cMZ%ЎwN)y_a'26(v8ed(%О*.CV: 7{ 㟕#>.a83f@*aւ:3fW,"pu;l1\5\;lty8A۟"oT[E%pU-haTq"[š]Ô+g]g$c$Ù@ynRW,IҘm#tȟsvh%V+kRH -b?iBg$]Tjΰ'ij (TDXC q)9B6P aS51*[3~8DJ@Rr*Αb r>gU;juPr$}m󹒴Up'jۨ5(.ʷ5ƉCFl3NvGkh37͉MSZvvZuiVo3-Wyf[pPվPi}qca*Ʒ wW#Jc ĶeJr\"l/Rƕ=8.V6$~P*xvٵT;nKa.j c'Sgk`Zhbǃ/^Ua1uSw yv:twh߀FU^`9Dwe\Gr~>#xF@=C^{ ! 4, b @` 0;yn&-]Հc,)jbSɮ.%eGƒ',Z5ؽ3B^|3y%$qؽ$g,![gn>S9PMz?S_px;Gꋡ{|4:9 Ef3/NǵMCSݪ9FlԖޝCn;>h8{ͧ^5g|(Zk[ IDmh^Xm#'P9gy#.'e8gweTo86iMOl9h`!g٭&5vݢgѮCwO pdcR1!!=j>.{D~._yР|IU +b?iBg$]Tjΰ'ij (TDXC q)9B6P aS51*[3~8DJ@Rr*Αb r>gU;juPr$}m󹒴Up'jۨ5(.ʷ5ƉCFl3NvGkh37͉MSZvvZuiVo3-Wyf[pPվPi}qca*Ʒ wW#Jc ĶeJr\"l/Rƕ=8.V6$~P*xvٵT;nKa.j c'Sgk`Zhbǃ/^Ua1uSw yv:twh߀FU^`9Dwe\Gr~>#xF@=C^{ ! 4, b @` 0;yn&-]Հc,)jbSɮ.%eGƒ',Z5ؽ3B^|3y%$qؽ$g,![gn>S9PMz?S_px;Gꋡ{|4:9 Ef3/NǵMCSݪ9FlԖޝCn;>h8{ͧ^5g|(Zk[ IDmh^Xm#'P9gy#.'e8gweTo86iMOl9h`!g٭&5vݢgѮCwO pdcR1!!=j>.{D~._yР|IU ^|D(b>;Ԓ@xT7KԇoE®gŒd39XMV*:!^z/14}˶\S$;ۄ5o%#Co ʰy.U.8T^I>kи(MݫvɈ7ƯTq |a'oǡz'q5 eu m恡m~Blk-x4MPqj9g-S%+GRvAB, o 2&1mИ :egFh+$ X4TjBc <5&4ݗi.{L|Kw(.;'_}nPڠAqȆő & ̌=r P6! CCX&W?Ć8U}o(~;m3+vd_TW@qpVYP&Ņ(NAxMq#P\ȪT"bLWpJhC^P8&Q¹lx5-"UmUh5DOx1 P2;q2g+X 'qZ"1mN"8d8Q['㈸M*Qc^ ^c[lkh'']|HQ+o|ќ"OuxrFxŲ+% 2M}Qk |EZF{$8hM+tKb7(~]V.bg{,Zُڄ^'~ڣ|HMzY;\I`XIsOì#%N3nzC(CW)XNEUS+se6sDWx]Nxl*Yu6aW¨IŮ,t5z)8Ts[49ejvӷde ) T'DCkkez wb)-~vX q65SRiӲ^)<E%$ںL0.>jQ.Ȉ}}S[@J8WD>vyF-Q5C6;x0!"dW?F-z1?֧e-B%|$+ف35SccR`HC9#MMpZ"^rmHkER.!|S?@6.\=r}{$˅9oǃr'$Il>} ?-jW-c?97ՙQ]u/&G9^ݠMwoخ7%-6 E)RvMp\Qzd_M&Re{4/[ bT]6>bnrm*|`O!x[ѷD ʨ{ײ;ɮ,7{Pm [:#*_{>tyX M`52Ms,o` ieGHH WjxG޽Nb"ܟkC1/,>eWN+uf:k+㕵#~5"N*cAC7Nk_CTv7o.XOԢ#cJ GiH(-%AlCb!2ЎB)y׵r{z׋s\=(m_AZ¨ !ޤ[Ep=[ 1tWԚhƾl+odNro1 6wk:o|̻pA0*;(߄ۗtr{g̿j;9ﯯns:+mYE1 seNҌM-5bQ1 P۬MR:[1}Thdp]d95+I?r«Ҝã-̌W?$w$YΤt2ybR?10x+hYԿ䮗l w۫'$W4֍TTL_[Ff9jC]]9 KX;-,<:]$~G](?̆0|A;5JdrO}u5yovP$Ydg~TYāa*Æ UMJSWfa~ɪ>C5>~ڏ(jЗ:3m=_8r6Km Mm*UЗ tTIjVyagkD\W]JAސdn$|kuiBea6Թ ?9&fi>(5{Oʐm @@ -4933,7 +4933,7 @@ H f WxéeNJD}՜7VsG+h; WUqKv3_WzGMg_黳x^87fhLgn`c [6 ~i4P?ԠAhԂ&Aj90m$1/..\vc%1FmR`+L,oCn]H0iC$H MI<qXD Ã1r2bVcB 3~X2}wI JBqMc2:IFʩPle2Ls"lf2lctK+d[B04M@g ۞I7.y?&&{KHs}ѹ3 J2ҸA[~e'X1.Яe4fVz(lvڔ?~Fl7Lh  CN%hc^W,z9}-1w5Է~' =\G5ڮף`dkj G}Od8OY{ 3O%^Jٽ BWabHq81X#IfY;yz8ROSf9~DTRRKjWks{v&3Vя[|M}MOπ gz6i`=Ȏ؎r8;>_(.NJph12hY"OkL\RȐa 7hYЯD n.IVՑ2,Zj.lea$VnЙɞe cFtIOM:hhA!n;%@&Ѵ&IdXɌ  DPě(\7=Sg59 Jo{׸:3d611H/i~Fus :z>]ג5s6dԛ}=d2nԼحL#9˞ -d:rgx9[\(_nW;xV/hc#+{(d$SwDTG9k1Ӑ:HR0 &uً>Xs_8)f1x@l_#f(9bgxt17a=Lnȱ$C0-KM|3.nvkѬTwI23K8+آDŖmز3k3Jm 1`/wb exy2p0ݺj7굽zchS~+1Nr8JWʵr,][-[UѲgb푂3ZdbLk Hg(d5M;YsN@f<&Rg% &jKx+xy_6X-"yoޱ _FŨqjuϻԭIGٻ#KSwwA4]]6N߂_Qy`2NidcsiT'UƫbD[k["dGûN:D93h k3@C"AXU7OL%$3" M"0d3ɬzUTtp=;GTxjrV5hn*\NR6C2sQ2 L;nMgA3`ɢ;0ʵ]=7?c:Dh| 9]@;#RFK,YM"67|V멢UFt2;W@ST懻tJ'EOoV\K25O͜wɔuOU;)k2sO6M4@.?\;Rs'̹#q0Xf ԩ2 {ץ8ەj9-+n@0hT +d:rgx9[(_nW;xV/hc#+{(d$SwDTG9k1Ӑ:HR0 &uً>Xs_8)f1x@l_#f(9bgxt17a=Lnȱ$C0-KM|3.nvkѬTwI23K8+آDŖmز3k3Jm 1`/wb exy2p0ݺj7굽zchS~+1Nr8JWʵr,][-[UѲgb푂3ZdbLk Hg(d5M;YsN@f<&Rg% &jKx+xy_6X-"yoޱ _FŨqjuϻԭIGٻ#KSwwA4]]6N߂_Qy`2NidcsiT'UƫbD[k["dGûN:D93h k3@C"AXU7OL%$3" M"0d3ɬzUTtp=;GTxjrV5hn*\NR6C2sQ2 L;nMgA3`ɢ;0ʵ]=7?c:Dh| 9]@;#RFK,YM"67|V멢UFt2;W@ST懻tJ'EOoV\K25O͜wɔuOU;)k2sO6M4@.?\;Rs'̹#q0Xf ԩ2 {ץ8ەj9-+n@0hT 8#)m4a`K’REmh ˒E hFc$W3tŒAұf1B%a2\ | &GX]I2~M4aIԌIzEQ5et~3F%@yhLZ#| I P;p q~|_ds0Q׿"|F2% a| |3Of dHnJ_PQ̀ȃTْZ&T| B<3D<]Nj CqQn#d2GɘlTF2fDh&66ƈL&ALBe[wHe_Izo 21oUBƄ`\cd Iiľ}# f^bd%ظPM+Gcp#a/ìa&3%j¾. iqWt2S5hA1t_/s(`f$RF'H {ha&uF1`/F;^ #|0EK&&1-co`I D ũkYEK(i!y#X^{fWlm4_Ÿw5+5t5`2i܅D$=3:Z~/G:b\jee^r1f{=t#axw3iD}qѿ># >XWib%_ƥ'!Ö%캗! @@ -5034,7 +5034,7 @@ S AoH۠)>d_3_q*(gq~3s/{8!NWzða4cڗf{/L`W$[ff{7H ywG2 ~!=0 ׸(/&Rp .eZ`"VHѣғz$£X{v/ݵt׷(AZnݮZeBIJ (]'v;½[Sψ0\Y(2fe.B|HPfjc;ќ!8}Je6VO 8GjǪ 8ؿn̥[sLv&s"㮃Lڑqeoa3G&q%[x )hdJ C,v8Tkt̕%RTI4=wc/##KL 3SuS+p]ffDaNj0$ś)e48I8`McSQEl9y,a)_&x%bTk`i~uΘḒ:Myq}5}lQ v,' )L˴"c,%PwCS:"uq"uLDиRI&SK *KҸ?,,DLf"O8$rdP0<"RMZvc⏃!֤m2PvcR# ~I"Q-+d6׺pDM2|="JH1Fԗᨛ|,m&~1aX#9 e„.>M%o0B%;:`/ 'Tl Ðp^?L'qhe?҄J -ɔoW5%fִ14ϋ3t#LVs֝tIIBctLH)+ g4Ald G1#x~gCZh?t~Þ_s }!>5PPq}:3lZqŧjN5\(KCnDeHhףQLJx}ӤM/@K2qsh!9t0 +ɔoW5%fִ14ϋ3t#LVs֝tIIBctLH)+ g4Ald G1#x~gCZh?t~Þ_s }!>5PPq}:3lZqŧjN5(KCnDeHhףQLJx}ӤM/@K2qsh!9t0 J ;CE)Cťa*3g/H}>o*Ϩ2U0fb,Kf#6`}GIc$kǽ&L[Z4ݥikNȼsH J.UT o&-A簉|T24o ѥy_i6cH xλ9N켟g޻yx}A& hd(@M%`Yq%Ƭxcdz5W@`./)A u9lqs vg+P2S1+uyBIuO??L S#:B.WFA5h۶d8LoXFoxfDLf~.@/ҭanDĈ9Eol${:,_:ᩡpOuH 2EDE3#3;/NM3'$`x>)p6]DTd*{5ʮpީl:XS Tb4 o @ƞnS&DدҚi?a0-G監9lw>.ݧ;[/ںs'lǒXmfdg/CxvDtc8 [ukĖ?uOޑܒL8`;6il6 |ɚde̒'6mg28U"3q|ŀ`|5EB>)33-YKD|FJLF*d̑| ٿ),Vi\dR!͟ϒ;R|*Wse1d>)^΢ f\SukP )g0 gH-3Sg*WS%df0Tb>s1ygqIr. "e&&3Λ2uaka2,1hL`2ͰzË\tc,_ Y2Y*!L Scȱ^!c5}hXǴRFhf hP_R$AR0!H= 5 2fj-DC)I$zeԚ4+P$;j[8Rbņ1У2C5j7-T*% al#ڈ̠X& -&3Ap )wi차tL-KXCّ`f,ȏ@9qBN%Nt_i;:UkI1Ȁ*!ڗRe@,i0Ԧ$]8n&7qLrcR.i`7 d{Ǵfxxz/uO吙{@f|>2HX77Bk ,r}(Ufʘvedw{)pfqILȍ!׽I˜ q+Cf@Z(Cf͑2]؜ Ӈ&x43tžkrsf V& azlWd]%.˲wɶDKHC3$zY&w]"V,%j 3QE/y#c{#s;.f MםdB_Kqw~Q$~21eP 1gj{w d\(y2nHe4 ;ĥT4$7ѾܻD%2.-Y~P̛%M#K\-~ .{'ۗd 21{yc_{cÈ$*kbd޸^#ڗ,KWd\z~y~a,CɀE,.RCʐ9zDɊ%͝2~άkR-ٔhE2O,OP#%g\d%l>uX!lPK &#<ʖͨ280d3t=;ϝ//-+/,+//;Y >[?|~{kf+zCyh[ʇ-OKҸ4mɲ0,YiOYL=ޠ}dZ +&3Ap )wi차tL-KXCّ`f,ȏ@9qBN%Nt_i;:UkI1Ȁ*!ڗRe@,i0Ԧ$]8n&7qLrcR.i`7 d{Ǵfxxz/uO吙{@f|>2HX77Bk ,r}(Ufʘvedw{)pfqILȍ!׽I˜ q+Cf@Z(Cf͑2]؜ Ӈ&x43tžkrsf V& azlWd]%.˲wɶDKHC3$zY&w]"V,%j 3QE/y#c{#s;.f MםdB_Kqw~Q$~21eP 1gj{w d(y2nHe4 ;ĥT4$7ѾܻD%2.-Y~P̛%M#K\-~ .{'ۗd 21{yc_{cÈ$*kbd޸^#ڗ,KWd\z~y~a,CɀE,.RCʐ9zDɊ%͝2~άkR-ٔhE2O,OP#%g\d%l>uX!lPK &#<ʖͨ280d3t=;ϝ//-+/,+//;Y >[?|~{kf+zCyh[ʇ-OKҸ4mɲ0,YiOYL=ޠ}dZ LQAtX@ed[뚸ot%ZDֶ7%Ɍ^'%1\%cd vᄅ1ԸD@&n3gC`z6 (/k5E3tHȨ#(L\w>ʎDH9h] & 5> jػjaLN&& hћɐxfD8C p3p-jǍۑdP",C-KyYxmȟQL6ReƒTc)_-O'Kbʷ%iMє)"9QbHFU{Bu&UwBq%ORYHǗ01o1㩕C̉x)|d6W1hJ-5 @@ -5576,7 +5576,7 @@ j r-Fa_mIג(&/t2oȌ"2,:GvjFFw#c ,RzwF|2Df2ҵD+d/XdH&C]<2cR"eV'+Xޏ²Ca{bОq$G!Ұ?VY)io3z'ޝE5,Kw\'rg;hد01CE˷fF[FIu*LN1(z R*!QMʯef v )XEK|_G/2(d` {1}P12C?7 #:gա/Ɍ 3!R2e.ܧB~[K}:t{~,497njQ@6;;.Jt3d8C&~.( IeYҦt&K$>GkH툌h)a|1Y{H\1;>INdEK3.94> dƓzS@Jx_gdBH. @FL-.F {2<lqZ}=# u^SdȈ2'K$Y,LR*.k|;%2˕{/,W(@vtZCRv ׈󥢥5.lTg8IfKWB5c2(И+̐YtQDbABaShryK+ASX"r.ekt5W2cZRpfWw%~93e˘I0D`a{kö3!L7İqɊ"kl~ x7cDC()T`}/WkK_ˬ|ܘUiYwiUn41+kӟwO`h_aɈ=f;JLSXOUg|#yn/$M\A'wdF̃E]aTu*s#g; hf 3{ ќ.k,zxwȟ/ |&?AU8qJ0.&;@s282]e/Ф/f3GuMLaĘ'?'a3}D_3^G׮$D2^wc`t"x##f B؎_MŐTxI TMn2~2#~pҸȵDV&r6{$2@2$5\K;{[r1 bs'Ncj&C#IK{{a݁CHǐJڏG:"P5\_1FV|`n}^=\v؂o:@|32yT&w[scɲÎM;샺1 8CL@7d6_*^iRԤ+x2RUk8Pd&$f ewIZr})4FʀȽK 3o&Kȓa%M2$]rp8/,no2Ɛ8~C*[$ޥmlXBCWkU,aC$mJs[-.Ԧz(cdk07p8׬L2A!CEJe4 ˛YM"8xuҲR<SքAv Mܲ@Γ!2 /K-[7DfXcHULQ"@KdFb61Hfն qQ35<⯞Kl&χwoX|jo"O@"Odd̊B"} Z7,Ɔ0xv#d`_CAal0>c_ޓ@g&22Ȑ 0. t)PZ hiD]KƄ+Df*+rb塐ُG?f 2dFcCgryo'|reyD -ġy%ȿ7n۝~H[w˓"L;R|ʗ$v9<.rw(u$˛:)F M uq ic!eI2=B7icz|`2ZRM?+!ޭ0m {pa }zvȗ% Qs#܈&@~8FuI-`~*ѹ[HH^LΡ~Sԛ8GL'~-*קJ/˜ro?bdP~Mژ c]N8ڗl(~FY1~%2cX68樦dFd ,MxgS)$B$3cqh,xb"{̌ظ3:I#:^TKcgghj3}L$ʟqdǓG\(][4!mѾv}_H]Ȏ 7.Thu] qF5Έ֍uƛ !@f"̬?M"Hbf d{_RG12hY +ġy%ȿ7n۝~H[w˓"L;R|ʗ$v9<.rw(u$˛:)F M uq ic!eI2=B7icz|`2ZRM?+!ޭ0m {pa }zvȗ% Qs#܈&@~8FuI-`~*ѹ[HH^LΡ~Sԛ8GL'~-*קJ/˜ro?bdP~Mژ c]N8ڗl(~FY1~%2cX68樦dFd ,MxgS)$B$3cqh,xb"{̌ظ3:I#:^TKcgghj3}L$ʟqdǓG(][4!mѾv}_H]Ȏ 7.Thu] qF5Έ֍uƛ !@f"̬?M"Hbf d{_RG12hY e)tt^υEldq$՟(Ld/5_?[0`2$¹1PP6p*r5/R򗥲+-U(@a˴,9vcHÔoJYeRzL-epKo|tX-\.Db{)׀// 4Rb)U drr/kJjxv| s\Y J#xrC%"3f(Wb !}acZ?Ӱo dal\76K)`/2Wښo-53ge g,@_?Xϡeõx̃"a,#Οj61^il>Y 3`ezة}7t0AEGS\6aLf_ӈvivXn#Qgr0=mHfa_[{j/ACM+*ۗxo,YB02EV![1&a&:4e%ꂦlb*S `U_Ac`nGLj#q-ce]SGfΝZp%èX a|ޙwӥPI8fMZ\bEH6 0DF eh/On.d ]ϦjB_C̽jc[s2lИY,|5LR03I4,*No'r7؃O5Č#>J`4N ϱ3½X'xxVG/}2APJiqq3P AG6C*@ڙX+9IQ"|LTx=DuK @@ -6887,7 +6887,7 @@ _J . U*C9-0k2HALA2h>dQhGDGKpLN.i# 6HY0 a bXIjM`8 mrטLl$`e0řj@:q4&iBhW*Ӏ$dO53mᵾ|^CSzTW3m]'3)h$= s -u"m\_zM (|P4/B 2\(_-SkJZd&s) /9B]s%aeOQsWBU5]C׭ 1X$^7$[>5_* sAxLAg{Zmt A?R-(p#:TZd[? !%U$;tG*ZC $tU12AN~wjwI"RVDJH!PY+2*CgQhf W{mX9À(- yiȢ5y,ޜҝR0™S`A*BzS` HYMaz3P 0{uh$ LF%NƊ d#TaLXf>VO Z"չ( d }BYp:ޘbS6͙DC k|f Dm.V2l*K@9#*Tה2RU @f0\C6?043` d~ʺpQbLj}dZBE] O%2= ~WLe` cj|B1{rpe3@M&:ٛ5D_hiFw" f,:W7gRrFǒ:lcquI s&;%dPsP/E2ΘcqDIML}S9yuP1RGaqD~RAi@4C1G!QbCHe5_* sAxLAg{Zmt A?R-(p#:TZd[? !%U$;tG*ZC $tU12AN~wjwI"RVDJH!PY+2*CgQhf W{mX9À(- yiȢ5y,ޜҝR0™S`A*BzS` HYMaz3P 0{uh$ LF%NƊ d#TaLXf>VO Z"չ( d }BYp:ޘbS6͙DC k|f Dm.V2l*K@9#*Tה2RU @f0\C6?043` d~ʺpQbLj}dZBE] O%2= ~WLe` cj|B1{rpe3@M&:ٛ5D_hiFw" f,:W7gRrFǒ:lcquI s&;%dPsP/E2ΘcqDIML}S9yuP1RGaqD~RAi@4C1G!QbCHee EKf/;vc~A 20aYqv4j$$n2w]6$ubfKRzݤY=fR kFʨg0^FbK(e^IWcj4 à ςÐƼ1˕<h z1UfF3} }!ᙾLeL 3s}44}~Au̬_ûxfl^S {tgڔtZ? y-@fOG3-K,+@̐e:~5XNfgMyLJIT1f5h t;ÛӵJY~ @5e+9'%:nj>3  px8&z:LqBnMc&z&8ZD_|]Lӌ/h ̚"/ƈ %c~d`Yu&sQB#/I0f 6G^3Mm }A`^M1w%ۗ&VhxMo".u}gwID2ݑk.$.2+}`",sW@&{)$wE Zd2QL^*afly3zv֛7ۯf^No7;;ljgrgjgjej{jɤLk=̓.u~zS+d6Zth%h5Lî'ӻxۙ iV#]q.n'm&y&&)MVk"rJkjk؎͋bOϷїl#$_l;۩7۩XvS1RlY -B>C}C9+L^sP29bdL4+E+FL:Lī2k9n.dɬ/:F75MLZ$^[GʯAc~ܬti]Jm$KlYnܩ'_(\Φ2g4B}_i4s:V6ǘv-I_|SǐǤN\(c?bAx2F[ +B>C}C9+L^sP29bdL4+E+FL:Lī2k9n.dɬ/:F75MLZ$^[GʯAc~ܬti]Jm$KlYnܩ'_(\Φ2g4B}_i4s:V6ǘv-I_|SǐǤN(c?bAx2F[ ZBT[zg1LY~'%a/q^o4!D2ڿc^m5o׉{)j%Pxy?ǢpLY_2-t-ZStS9ƔdjX_jjvuwxk ?iS*K2R*̟۟ Tɚ:al͕BLE~ I ȋ8\*dN2pBH3U1x+1"{pc#3$kTݒn Nŗ4ToS|_fz Sl;T/qXTn,Uwаhjԭ6}-QƳ}"=XX @@ -7001,7 +7001,7 @@ Y LoCo®gC{ Nf@ bėZ2z>.k WD |{T.f܉(d-JFI}谒d>0!h;ꆸ$5fWsZajiy2dw!75h(@{ތ?NJ4y~1äqN^dwIFA4ZeROwR% 126ʘ^RRo3drXY0;̍  \ +tf1Tش'RDB}?1qݸ$&x}&Y#d.\̶rrbrJWlh9@}@̯֏oot?ZB͟MCN$N -7xcJ"Hjə:lԿTo^;ú)R-K[bd͗k_~oUfHGC X_^;9 ψ+8_}].LtcRTޠ7N/_xʗ S(#3Y<.N:ӹ&L29#T:)U ,s! 52W4|i?aä3(]s}k?51m8SUPUS2U,$JH+!ј4p¾|M \(˱Hb867x,>s>J)FԘ1Gh)֣) HXb.5G#qԚ*umJ5řъ@yDK8oGyqXcS6'*@ڊS{JVpDm,Riz`H-!89B9{(k?I &clpjul$@-{睩|n\٪>~6n3[̟'LUv:P}yʨ[N:5-beT,g[9Wbђd|};G?ًzc4tH Z\;Vɽ{/n-gZ8dzj 2M`eBѲ̟jG7Gґo; W25wBȶ"?Ϋ&lZ.Zeܬpr@iS wOuNpԤۮ[`θ.䛀xr)nRhA_zw% l?LC5t I]s:Q8(g~hm؄2-_!&+\"T)]*Wҕ|._׮WUMhnrɰ4n}~e߲ fxj_k'SW]JT&ce9!.hy*ZR/.ꉈ&տlsWMLTl@v6SCGi~6ߝ' kg^:gjWBe}Lup PavMP'?#NIΓl{ƞ;GO_ +7xcJ"Hjə:lԿTo^;ú)R-K[bd͗k_~oUfHGC X_^;9 ψ+8_}].LtcRTޠ7N/_xʗ S(#3Y<.N:ӹ&L29#T:)U ,s! 52W4|i?aä3(]s}k?51m8SUPUS2U,$JH+!ј4p¾|M (˱Hb867x,>s>J)FԘ1Gh)֣) HXb.5G#qԚ*umJ5řъ@yDK8oGyqXcS6'*@ڊS{JVpDm,Riz`H-!89B9{(k?I &clpjul$@-{睩|n\٪>~6n3[̟'LUv:P}yʨ[N:5-beT,g[9Wbђd|};G?ًzc4tH Z\;Vɽ{/n-gZ8dzj 2M`eBѲ̟jG7Gґo; W25wBȶ"?Ϋ&lZ.Zeܬpr@iS wOuNpԤۮ[`θ.䛀xr)nRhA_zw% l?LC5t I]s:Q8(g~hm؄2-_!&+\"T)]*Wҕ|._׮WUMhnrɰ4n}~e߲ fxj_k'SW]JT&ce9!.hy*ZR/.ꉈ&տlsWMLTl@v6SCGi~6ߝ' kg^:gjWBe}Lup PavMP'?#NIΓl{ƞ;GO_ ^t6eP-`443؈oI#33ۺMv.% H$@Ӕ#MOPx9*%[h8ۮmemKƘJ!)0;0Xf5#Sù㙑ܹ<C݆<0fV03#4Ϙ2g(4i_6ҠF7ks"48M4zאku| 2hKAOA%$R:)^C232}&m&Z LQDV-DDe3P)1JPJ4d)B.)A f:D|U~s`y(#ScddlNO{$0e5IRPä2-.gf dZLAfG1q{|v:& f؅ qFbC [*¦-̺ _9[?t_2)C! /ʈ˲f,}E2}Ktln2[)m~D3MlRޘsBWn%uji)c% e@Z5'k/ MϰE5X,&tacen_jᐙV||ng9ixgnPL5:MըYPZ\ }bTW4Y`2aycd?m158[m"@C_W,ikɸQӋ,~mtiWfP`җ=Eq,_#%,yɨW31s8Է3y)M?W+/KPf&ѵ}2^4=]1: _"KwKSj.Cx5Fg%ly%'o.1]4.]ҥ 2DAfhI4 kfbp EKFd"lbd$}Vc_$"` %>.%r}3Enkr2{"Uŀ+mȨk<R Ec~pfюtd n'''Pc<^>BJKkd$mG,y.ވN=fviGj<H4dS}{ݙge8dvOwW"IFc~wϷ[䫝 {3AB}``[CV/p TaQgJpi5T.a_B/,˘,0Hd{HᅯVht.9x(yLW`iBU42;V`?n^2j1]1ߥ2z&ɦiШ4F !C({3bQdHA І\r/YQ2Wy##i|my!CUG(FJ & C/ݟ!%̮щ;`K|J6X6͏6O6 k[~5LmL>ytj1;/hD?!>k@1OVpi00.iK!˰2qV9yg+˺%]^~AQaAA~^^7,KHlвR'RzvmVd4>'. l0B}ɐe0!bd,`2PXU&t_fTUnXDc(@Fmv IU/95uPc} ;F߀߫Lh#a YHeBo;ۛT޵h#6Q!f3>ه03l0Bc"ûdC'c tS̰-K|2ۑsKU;A@4A^9E~4HaH).WFD;B'&x͘GŒC[%}`~D)ʥQvNT#HxD2lF#[zM#2qw@F2c,!4&y%1p2dIh̦(I2ub2$]MYyb +)O&ɫȾl`5R*ge8NBiκإ3>ه03l0Bc"ûdC'c tS̰-K|2ۑsKU;A@4A^9E~4HaH).WFD;B'&x͘GŒC[%}`~D)ʥQvNT#HxD2lF#[zM#2qw@F2c,!4&y%1p2dIh̦(I2ub2$]MYyb +)O&ɫȾl`5R*ge8NBiκإ( WȜÔB}׍:J, oͅw 013T cv9 8CꅹT|k*5Cc.[ohwkH] ILL&r0 H4a ]dʟ)_9\"UʥS!5~&ҕ][?_Wn+F/h |o\1dx/T1ƸNNq6 WJÓ;W!m d0gw3RȜ$e֠1ꆝqa׍ WPfXNo-_[\Z|aglk;1r+V1 ii+tXPfll-9DGK–_ sNU$5~.`0;~8dU 㱝ObxN<5oؠV !s˵1X̘{vkd@c MkCPA==( Kd3dd:~6̽ۋ!F&QK6Vɾt0eMȐIލ5SM;ٍĪhNTwll$&C FF>ބZx#۔sAJU0p8LE12h\XU0Wen%]WJA\2=a$u1NDW@`HF|&WI!A FBFPSdI @@ -8298,7 +8298,7 @@ E(dD  d2|:>Mϰ=2[C' V);OS@fPOf3/l&z#W汛%w%sH-Y][CT{ \c иΈ2_Z |Oar6e A 2SHiEn[6 C!ЯgX~lE^c:2 cб{9@77ayt<3~HA >#w* di! ""35.Dp&J|&3| M;=JDc:(cے:EKd3HXf :gdj![\nO ;8a;eqDGѧȄYO nFaGdyB/'d& =u'ɧ$ -I!\+g99$&׮o@r})b2p\(rwE"2o٫e1)l%Δ2 uK)gZ+aWBiZR wj,s2mU0(=au(wER>C2-Ԏ g7#U|dJK0<2> 4(1&Ԉ]8*4k &dtCB"s^{ T:c(4^O_j!y h F)M JWƳ^xsm(6u-c.^'OSDI1TŔ3 5ߔhLea?C˴lŶpaεu0ST^K(qkռ4+)ѷq%6+NPpC7s8mwi!aZ3V'LI8Ӹ]K^L>b,ܼ yL[k/PunpkC0U @@ -8313,7 +8313,7 @@ g7#U d0\'éCɸ8~~n2q!۞ dC~\(y9$1y)]*)bZA餛;Se tͨT-Z"e}:'!Iy RȰ =oLfk1d3tmL&CXu֧b6ؔf/=!ƅ̘"qB1c`n*\es29ՅTs!Do~$A9,fҭ RJ'mJdYpYdF* "d\vB}٤2&"0(dpʟӾ]hЫo~f懟jLǟ[?OZz#~ TΕsU:G%u|R”$¹W`p ϖFʐwyQZ:RT !-dkʤC7սޒފѓ2&AqA>"eD&n,)d +G\8q& ;#+!w%#2~}[S{dvFQv F8!&?M3>2q!۞ dC~(y9$1y)]*)bZA餛;Se tͨT-Z"e}:'!Iy RȰ =oLfk1d3tmL&CXu֧b6ؔf/=!ƅ̘"qB1c`n*\es29ՅTs!Do~$A9,fҭ RJ'mJdYpYdF* "d\vB}٤2&"0(dpʟӾ]hЫo~f懟jLǟ[?OZz#~ TΕsU:G%u|R”$¹W`p ϖFʐwyQZ:RT !-dkʤC7սޒފѓ2&AqA>"eD&n,)d ĔoSqMbkbЕc)ѷ$vlvbttBG2sNn>C1dVM4O_^J~D21L/'-SO6vmLK }T;Ό3u c2&rMseͷ!ɷ,жz!6?-"edYht6.楫]K$֯|+q,euFh6`M"a@v}Ӿ)4-/C"kP#ӺI`2Mj<Xh HdEʐJQ t0"!,U𩿗D/ )qTNV㬽sv?&7t2ܕKog=ʲuϒ dyAzKCz'31R.I\7s6w&E׷uQbΝ'n_~}hBr?Nsxa +W77ξJ_䓯4?3'$*O}k/QB4Xu8Ew?5k2 v@0D(2PLj I0@7@$SUU'6<$}LTYNSG.( _I2\B!sx:DM6Uf;9[K=x(6Z~żD2PX8s(Ο6w~e\>3NcC9Z:\:0fk[k#CN(fw5O+=2bbhvԌ5"WVҚ\0JXaU X&,imbY&ɾV_ d KRn9'aL$1!Qz!s$1JZ}V*' ̪OdH#}K> @@ -8686,7 +8686,7 @@ A ^s s#s9I^GIؗT ÁL'w]0ҲޑĈ_jњF1H!^&rBu9A 2dDߌn_Ao3T,9xz5.Y_[ELlJHHƍk6+.>W&sky42΁eG ų~faCXv1U'Z U:,%̙̤%4 %hciklE=A1<%5.9Ȑ1n"PX!eߴoZbӛ1$BFE\rFF!_G?]D@?9 yM@ ѾsáM[fsEX1E{,PΐTƂv6JFD /mFv*x[$.Qud>w2d`Pqcx/ - @vy˫9I!c LaѹINi*LG-#Q -d)`W0VX-) ȦtdPx^?~uR>b2~* 7w91( 3B ћ>j\Wg%Ł`x} XfO#ƱnD"fL7.[V#HVE*'̢fjpst)^7 1 X7y2c&r!p&d&K/b 'Ehhu"VB ;!ff^lk2ulM3 Ԃ]%GL\[bjd0BU Wak*+Jy"6TpW/Uf -N-@ 3Kֈ=T2K%oט(&5˗ڗU@ʚl0a'f1M@ d4\(,s61E܂|p/2~b@iʤrA6-؂/.&W`jaȯD'0b'ɋu1XJ;k˹eaHctQʬH3 ECrӐ0hOm dE$C;:y۽u?^{~֝ElY-e8v\so[~Y,v ~]ϼ>˽9O>O֓'I=zT"^?䡢%G˅Br!X0UI*S(}T*uH4ªc>":r@_O^> K]J_ÏA4V+$(@F\*i m ΙD!KCO}\A+li0._I__|x +N-@ 3Kֈ=T2K%oט(&5˗ڗU@ʚl0a'f1M@ d4(,s61E܂|p/2~b@iʤrA6-؂/.&W`jaȯD'0b'ɋu1XJ;k˹eaHctQʬH3 ECrӐ0hOm dE$C;:y۽u?^{~֝ElY-e8v\so[~Y,v ~]ϼ>˽9O>O֓'I=zT"^?䡢%G˅Br!X0UI*S(}T*uH4ªc>":r@_O^> K]J_ÏA4V+$(@F\*i m ΙD!KCO}\A+li0._I__|x 7|M~=ZJCԅ+%WOY*X43'gڐA)6 f̗` } 9@/6,K{5TcC*C}L 3{Ut&  2s[eyiqS ؋a;;;#+کA{l\=1 DfLcSPŹ3oMI)!Ot*LR cxe%YIbM (fylVBoy)A(&Q^ {>IL&YwI!Su0&]M/c[3Tհzz~K|M$>YJd@c"+zHP͓9F8EC'޻ 6.QU/ƀ@6CUlb",PȈ[Πǥ)L*CdJ/K҉t . PLQ7h'c;XV ݥsy$&MGc{!)U&a3&(E,P0)F@&N%8^ njq=E'!1?ֻcW[$zZRLTxM1BʍiagQi\Zf`ˌtJūϙij' 2~ih5_U1Բ2,A+Z ̌tF\d%PiԵQCu-u"O]3YSFE[9u 0YqhY'I Eʸ{K;p;P2JtL} d`20`1)n:aAL.jiuȾQ1#c#W @@ -8943,7 +8943,7 @@ _O =*J% 1^B*"j̼)`F5*sy Iew iicR17!3!+MԸtAg/8̘!hYxd Xd.?[!&rZHe8g2~xu98 Z#p[$>$S5*" C0f!B}=ߘ~ ~j<1y1:E S!{j=xgO-`21+ф"ѧS?:He8g2~xu98 Z#p[$>$S5*" C0f!B}=ߘ~ ~j<1y1:E S!{j=xgO-`21+ф"ѧS?:}P]K~0ە) żSߩroչw4.k5M<dVkcƑmxEH$CXڡo, @@ -9007,7 +9007,7 @@ s G{p gY0K";Rmez{.6Ԗ: `-Mj[P5ElM]eo݅Ԭ+*sfY )Yb7#, o]]vwpfr2L Kjƿ4&XeMYU|-_Tŷ1v3=۰o/Bb{!oۺ)mob K| (^(_X~+-h_'Yܦp`[ GA>Τ%̅T{M~%{Cc1DcPu+aΩ Ȍex@&~&$i&V@\JߍI Jŋŋo/υ' c#*\pٷ<FiҜ3z1̙Ϲ/O_rǘɗg>>J~J}Ěܗ /㒕 XkfޝGЎ}}LὋ 㧯PZ=t u;^9^gOX6_`YڸfC4暓{-![2z Pv^.$LʐT&sg2}kbKKR/mȸ=MLI--} ԅ#eu%ywMK U 1+ڳ3[޽s Y(.kdȔdv0Nc^K(L뱄baL20+Q{ۗV)C#0hfJ%{5ltKnk ޥ0D2bd i1qeZQi-Ȱĵ14e-F04fШa-&P&8 $1`/ZOƓrBΛsbV{B=UmūH'SqKqVtR+,MZ"2~w 26{u*MZ!aZ* \"v1*jjI߀àcS„VU}Fd3p[SD= [8xFiSYkUZbR 2d`2l4&guH"1DW݊X)g*b%;ia{z p 2dj0 [ [ghpABG3'H?C$|F嚙rb8춑=z{m}CcҘ772PN̝{b 3vV![&j%L?D2$#?4'dfDq%7.{F̨ 龐Ͱ{#*DTͽQ^:K Q=E`TlV#vY>6CCs2蓁2 3y8IgdLkT=@tLO +!1H()pLٴSHSGlMNLLCRnŘ1ddh R*SA!yi"ǴL1P9HU/:l i/u-qL;bwYk>Ж(gzǚ<xg*uBM&XzW$5 >^kgY$57F^c9]J /EO5#g0Mş_Q|[瀂 -^zhöN!,<$"[cZMb~pIȓ% ێ0 ݹ9v@~A@NeAG=> |iL;f\^<|1C]OreyPBd1'9) O i.vWD[@v9utTi;e'0c_hH6zf~i)BcױWɻBdOX?~F>ߡ:h$ȳH2,RZ@k}ig$dGȫ[fEQrLe]u\o6>K %!ltnT{ܓ+Ƭ1/dۣe1ܪ09p8?&K13/M=0&nU\|TL{z\%a~b1;8^;VUNJ!yW$Xch^$o5U)>S6ɣcA_꘎CB,P<&V_)1-Ӓr=4;\M3q`6D3@Xăr  \(,Hlmpb+\2BĶ',ě0gN_4b/}$ >n!xȔoQvIDkbWs`œ #K;:'+ekN2z?6(3|&,T`aa:Sɳpr"O 8fw? D]bv41hPfZ^% lKL\+6uQCB#Aں +^zhöN!,<$"[cZMb~pIȓ% ێ0 ݹ9v@~A@NeAG=> |iL;f\^<|1C]OreyPBd1'9) O i.vWD[@v9utTi;e'0c_hH6zf~i)BcױWɻBdOX?~F>ߡ:h$ȳH2,RZ@k}ig$dGȫ[fEQrLe]u\o6>K %!ltnT{ܓ+Ƭ1/dۣe1ܪ09p8?&K13/M=0&nU\|TL{z\%a~b1;8^;VUNJ!yW$Xch^$o5U)>S6ɣcA_꘎CB,P<&V_)1-Ӓr=4;\M3q`6D3@Xăr  (,Hlmpb+\2BĶ',ě0gN_4b/}$ >n!xȔoQvIDkbWs`œ #K;:'+ekN2z?6(3|&,T`aa:Sɳpr"O 8fw? D]bv41hPfZ^% lKL\+6uQCB#Aں %b+܀r>4d_ظiӣ[eAC,\ ?1e R<G<; Cm24R`Aj(.!x!:)S˼|/ |mnȚ/(ϻ [nczM)SF?},ԙxG,Lgsa>1wxmX!X݇wY4h[s1uL4ةdfͲ;Da!gqBFq+4-:>| V-?Cm߫1˽y[wIT6XT>ǂtpMu:/ƒd`q8 . 'XK[߫1%hv8ՀvN6ɃIaV1 Q&H3wn/$?U/nQT8!~NiE >qcX f(QFx,JqL:?FcxX[gJ]al;tkD)b#JZ}À7t1s@/O['?VY\q~5oD*4 G36sD}xl.Rf&)?ǘs`e^hl`P38Wۤ.!{x+v- +&V&gaj[bk<'d֚ NOuW iٷHGzIvܳ,:cqtA#ϵ^JBWك?iͱXB=|Xhq9.3Y;aŻ{KMwnMܮqLO ȉ\}l{t8DjksD}xx.w˱Rf&)?,9anZ.t-^x,4ޤϚ kVFXXr9`U$X-Zn̕{;.D@? h!67Q~b{-O>++΢ ǜF^-~eJAʴXK?yJt3۵/7dۣ8;6 ƻ`'$ːI'ܭ3ݽyp @@ -9467,7 +9467,7 @@ u?lcpK e"އT_1^Q~8N?IbuK%_ˏ+Xp W2LvC\qt7=VUg\㭤밆:2 sET4-=]K(1Tjņr Ed7~wHiDZ$]*HgqdFvc9 K[w"0u@ZoQ BihVc[}y"PGL5 &ǹP F-)vb*鸓ern0$W٦sI+wϣ7Ļ:֥VwLh5YXxL)ʩ_ć W"8}&(Ϣjiu#q),r*X#2yrD&D<'4-Qħ#0.Ҋ%@jr+A\.XXW*^-To8ƀT"A4=oDB=%)ϯmraVЇ 'Lz+66-UzC9,z[rr-w[e>+j @Z1/.)o{aXf= -K :~QcY#R!'n@v«k; 0zϓų2$*;ho +K :~QcY#R!'n@v«k; 0zϓų2$*;ho W~caP3<:X~gkC{|=鉸]!Ӵ׃s߉cʙFoxQR+2nÎw+ZA )~Th#jw@5k/˶VtpU4Lu +V^4OiΥw.~u 43&jU ܽosHfʩ#!(rӪ HiJ?p,1{tzxݏeZ2&Ī2 @@ -9893,7 +9893,7 @@ J 4  `!7dK j4"$EZe 3Fh!R#!cϗő\*^E9Ak_pKc'` ܴf?D2S)Iy;z6wyN+0 baI;ڥŷHJw# tLbm;Fˇv3IiAtܐ[Gs3@c9܊k@lKR>Ƌt>ot[VPSzdR{%,Yjơv+^L)+5(y[ã`%VJbHIVZ5!mm:HJ>{[d-4f+aB +DTFc"c3bܳ(07'Y62VJB^Z@ȭřn MT(,Z(Gj1/=& _~l슲^:ڶSo'b*dIl::͌K}1 1]r^4s T2E]ivD3h~sck0o\v1*'|Ӧ@ARg!j4 IrJ2JJuWXD֌xVe@x>{[d-4f+aB l$@۬xuzI,LO顒~ w1n6A!t#X6Ltt ۍ#L݌| z*o)њx #5/q!}]m{efG.NTPu~"+{`h(P1WFWo4FtJr XuvHJ @@ -10019,7 +10019,7 @@ B%j U)>4Qg{pnPnKqDhU"T2NS&I6 tĵt'ZDmu+;yAL-Wg.&'X+\?qQ9?|սtWBf56,gL>eZ)¥7K4veVoUoYMBn"`3 p!{9YOTk3 _#$fuE*1i(qZ%S_)t6P!!~pa*ot; Kˡ 80(g>S<kxU?[kx^-;aR1i'$5Ppc"?vo&\yx|hHѨŬ7[ Pq9OF@{ABBjnrvEDU\ӡIpI2JR%2":  'z/T'7aJtG PszR{4IpIG!]Œlg#Ov3zUCF"뱉v**gŕݳ\vp0}2\Y|y1Aʱnl'/NLbÕDuSO<2&nVLȱI?DOCޯHn^ V`OPM [F-D껠m WL@x$N>ՋE +K`ƝBvADŽGm].DgawԊ$큋yF._V3BtӺ60HQ0Y2XrO-ƬJ{8xv4hr" mtoONtdguro "~&g' 61 "CX/.80 WY:{va[͕z'nĪ @7ï(H55ʮ>2nB)RLi^)O{xHf0v2}PK ".me0`22q2YpjA&øɴùIaB 4F.Gl`bTs4(#)O*ꦖ_ *y;PJf 3i/Hts:}'#jnT &$= e2qȴW֗ր4n>ݘpi>92j6-Zn9 buNw=9q́xHdACfRCEPZvAN.F A3 Ż*9jAƅ*."5Niy)Z_?gb%D"D_uO0$X$3qgV^I4xQr^.gt67KADA˥+"8 uI=a㓡ªr bPGk[ũxm5NBO4| w9lc hn2)QZ%X5lN/JV88~3G/"F0VS_pT0@njzOeSf7%Pz@J);"9%ǯ,Vq>G܄(P ,^6R WV4?qWm۰q9VovQ+/-X\LIN csOyXJ;0VΗ&OEJW#aK<%Ts*|LNR~Ċ*19\4Qb%02;07Q5f;)1/FP}X "$}aQ0f'܄3\DMg7bXk8QAHPOqJ+FsnyL]A7b|'7hqd\(3)g +bl" jb59`6V4*SWl&rUSj\+SVh-U 8brwKzXPKDB.h(bH|qa%[ʆuqI?QAHPOqJ+FsnyL]A7b|'7hqd(3)g ){x9]թp҂16Bt`f|L̏kv?\ʀNO, 2sAԎ5:bbԑqψk^<䧢&;dTe⃠ZX?qmvl1cnIL Vh̐.T3|Lc^h!$l?SZ1pdwUN\_/DK+jjz|>lؤm:\#ncr+,\nJ>B%.}PÙ%\O~ϕ&w(8fM6#L'_ӕr{zyaWo=+_O_\{W^}tq΅tcR\5Bt>Z;wល=Ww>]}}~7~򻧞mnxIQBŪL ERszefdm:Yl_;yg_;𧿼_v$qx9KpyeDlm F`5јT&͹Ǿ?.?}O gݹÃu-U3 @@ -10115,7 +10115,7 @@ B 7ҵ٘Ufc'ptI3>:/n9xnM+Gճ嗝7Jj4kÍ-J0GO-Tifq*+D Zx #LBi22πIJ)B9٠*[gY+d TQ2jz7's"F}Bnq0l^{8RtC"ZKDr%'=*˒3Ԣ55K(ݝ=ӝKPvh{H d-M[k:+~{Xހף&B{Z'ԣJv=%ss,6ȕ!z$N_}u & -eZXB\(ZC*pډQCWWF^(P1tteSZQ)U@9L ]ş͋`jJX5Nz30= {`'_ѪzZ0雿Nop;x;\n쌪f6Jf J!O'O=n~^^3?vtqCq'`d opӾjk(4Zmil8)E!A{eJ-ePޏcS J5`G`;ZkpWA8{,z3AQ&2k+v5XmJt36xV/em1ᔆir(1ؿ$I qPr~l! sNZ˷?ݗ.8{2j6ȀBȺ8AiSa? Y "MXa֛%p2FYD(e&"XEZjKbY+|>JtPYSf﷮p2J0Iuɟ1`djp(PzKr۷B.IZ1]|G}MQ$C'Ĩ-G_\ٗbC0#Wh~س=B=%Z7+Vk% c-1j;e6TO03RM.IR[|\=^ l.TJHVhE7:oڮYIv{m%5 !k)E3h)w֙xO ewϭ!m(gxx#:ifs|SkT!"x"gvkJ ,X Y`C1@.`N6';-_6]ѝ`fv2I~l Ar1NEʕ|u9풂ඨS6"=(l3ڛcSdLE.G _>C G gQtջ@ĸH9Ĺg-jtN>CGSEIvd" x?r] _P=iչ,a4gjب]Li"O/~tBZu{]6\Yh\b`\2Jo$_:+yZt:DgFR}m^RvS+]Bh_gZ83^7(+ns˟on¤{-1ZI@%3Zs4XXvg1(XI qwNgKY Sqn`dtXG)GYoDԬU+.5ڴ(@x \"frJ=n) Fiqd*$Օv=y"F11%p #0JA}"";IrUVnZ6Fd<}EQDq񋋷8O߸svEk3 eH)92Ӣ&N:l׷p/@ VMtfmzuu.̓WڮzR /cAa^b*(hk#YSJv-2m`#eAZ9Nmci!}e{$;R.Ao"#5ދzr™m!zW3%fӛ᧣9MTQr=HZK70g0Sq6bQڲ|FP-f'_~ԣݬ>=!%5:;gvmyLj\b$NcLj*We-:oeG9f#ϓR7TBZe:#{c^0Oy=+Sb E4{U$!GTֻq&#]AkgxvFKa0u@&>hwOPNDڴɾyTϭƳ~ި o6 u;R t5+ %3fo;$o&1 @@ -10309,7 +10309,7 @@ D@ 6%4P+5EȍJmBA2kfW0k>R"R?Q|6:Oi  åzWrWww!ӠWr_II1RЛ +()^sΕ'ߚ tEY^{6 !Mҕ$ê5Zi8ee@xkV狊X?t#H4ݭB,ie ̤` ̞膋_7n@mr ?9Ós-'X(!%lsl%U6-${8b23.9_\"Z4B~dKԎآjblKTnux} ,"IZ;H fts6Oi]Q;v[y竄҅dgXl1J'rJϠv*ERB/uwF/bll)JRqK1t"d gVgjm%>e0m =ˌ3[)bm7Fؑ  k7_fq4ELq%(`Vw I1jr䑼3*%x/h6SR,J:͓soգfZ ק5+`ya6O8g-Ex鼢ZV2<"6!j2< J:=ނnp<޷( D >Xklݛxm^uv5qݽ0ٴ1)orxcu 4<~=HbZ8.ٲNQp G,[kf"Qݦ7a+j\mrf5Fz4@!r b1:"ֲpH`ŀF֞#]Zm^!R!HR@F)-ۃ<]$+‹bvu<.EB@+NWZS$%=XMf:A*F:Iwr":ȸ>{ݝkT;BU)Cyލx^udws)tfE0,eG( [nsZ pMDq7*;L`@KyƆkZwgY:\K*)~:.BfzHg5B$Yda,%s%5dw c@ЃlB(-ƞps7Q͉ yJipL͜PI4]҃H -rŠ{\l.TG'@ ROK=$CB:WReb!Fް6I/,O/c2jctt;/Qj*񼱜UAfIؔJfd(.dP3c /6J {Tԙ^.5׌:hl=N|`b`Isa0 8]R-8wW숅rfsrS+'P=`BR?^HxkOYIsjU\(f_(o׻R%B9ѡ]%Ivi.SRܿZĤ`CWaF!fpzA,UDÁwmLcRn,EҴMvsvm~ T-$?2iӟ]12gߚ}m$Ck~;(Q6+baGoV,{gTE պBˬY+I**VM"B,Vj*.Ľ<偌$b4RUYFyTv1X| rWe@֞v[gsVh"K8eɞZ*,OgYZ%_X"y7gjfqSPQczq!J 5rBv~2#ZHF{y',&v3z8Wd79vS5, +rŠ{\l.TG'@ ROK=$CB:WReb!Fް6I/,O/c2jctt;/Qj*񼱜UAfIؔJfd(.dP3c /6J {Tԙ^.5׌:hl=N|`b`Isa0 8]R-8wW숅rfsrS+'P=`BR?^HxkOYIsjU(f_(o׻R%B9ѡ]%Ivi.SRܿZĤ`CWaF!fpzA,UDÁwmLcRn,EҴMvsvm~ T-$?2iӟ]12gߚ}m$Ck~;(Q6+baGoV,{gTE պBˬY+I**VM"B,Vj*.Ľ<偌$b4RUYFyTv1X| rWe@֞v[gsVh"K8eɞZ*,OgYZ%_X"y7gjfqSPQczq!J 5rBv~2#ZHF{y',&v3z8Wd79vS5, 05Rf(avf>*8k 694wRYӁ7ŻG}eѣՖ]ߦr^_N8WKkճ+M`j7͕#`?(ͼX[H>9!P]Kp;T,E4Ť PuGrXc™#XN'1!=-\"BGǠh‹ E\uC\ɧV0H .)0P!#wvBEŤDM0ޙ-F]eD0>RrFK dm9KQ鼐%ʱͥ GтRsgr+II)WdC]_L;[PI,-50R%v )XiP$XT^b:J;SYِgx0H=r % _ycs;{a0.bt` MWxu):-I |^l @@ -10347,13 +10347,13 @@ v QR g~%mY#3fSGV4~. |9Sy!MwiKfdVaSBo EX,6vrjFÓo|&<ɽ9kD~Ik3=$bc{k)Ä$= @̈́f5oR@rśiyo%^E: $UW",@AKFT{YX<;uJ#mwjm} 䶵ܶ>r@n[{mkm} 䶵ܶ>r@n[{mkm} 䶵ܶ>r@n[{mkm} 䶵ܶ>r@n[{mkm} 䶵ܶ>r@n[{mkm} 䶵ܶ>r@n[{mkm} 䶵o7ukz:}p_1MON>?ǧt`zu'W[Lw;8NxkEN:?Ȱ,Ad tb Dv4nn(Ǘ +/._uqPi#*}w3~B?F? &ޅp?Yw:;98dʲ̝"_S37!{aN1NCD჎qZc )GՖoѢg%o;}U(XrR Enf癢b`ԖFy!3qX!Jr:/- %-- z-NeGZ׃]ǂ3aYK<JȮRF{0MnwgAP+mݣ]n9}s}rN~qtvOQлTK[~bQ&rq҄A>Dv4nn(Ǘ R=!2Z'j{#Ze(I9-E+Z4yyU!2y6ш";]^y6$R*5ƘƐ5I2)\R]2#2|"-)V |Q o(uy%-' F`b$5c9b0'$Xos%VrY*2zXJ<㡓ɜN ^jO4;Uqo~UlX?j[j81n01w3$딗vqΈe^A.#%ݩDF eI]2;fiG5YͨUZba^ZӇZ^*;9"8 >,A=B[WuR)'7mohwHm=ZݫSڬ@ v4{v/8o99z1ճG۵psf3%:Ff/ NլcC/ Uyˬh3VP"1 j1Zx Hx.n*۫5J*Y7K'0K9H$FU[Q`-#%R`B)!C*3ZPRGPGHu^`(MJ-ўXmJpw4ɗdkh7'} L%DF`H9ZRb9U3sdIU,pERm:rI~<YnЯx#}7>ɽV\[,/Eo"`Fiڎ06b("[5BVعR0dEeJ 79kbFAD'X?1jvmwƩn2JE2:Veߨ! 8Sy%Ee u1>ieVvKִkwݽ[-U6ʒu'v1YϢqN(2R,m:#A֞3i3 jL`8+cm6vjGS"[nlyccLmQslpnxYminGݝŝOʦZZ%ƶ[s[FkFeA%g7gA砿8Sۮ/Okgb8#zefRvvmhzK6 bˬٍ#qX_ >ɂ%L˳GG5^JSɟb%:뜗;;Rp`|ʓώ^ѷV}㺶(5We0<wAghxzWh, p?oi]cާg1\/.9 zg4wRP/cƋ'r0TÁW_0mU˓˳/eo3- ){gH}V7bk-99[ൊl5y?fO]Mg/ NpFݗ[Oqdz~E6ר?)Y̓ÃO[ϖ)x;[/_L?~^kZ{i}[nsjPnaֵ`z;xo3i//^`nINDX*awKqs"qΠGi.v6ξ ~GQV{o'g_ _?췯Y?\^lw;6={7}o}!jpv|:=ɗ(M6>}s#w:j߷:[\符i;揢egu`z"b&hxO6|,^V&FefUvcN+ǃ]8eqp\x\_ώ^?zgG~a6lrדO{o/~U5#%v_;|×󓷴`H]Wão҆5j8j/Au0W&gݗN},E߀>_'_acQh/;;ϣ_WVe~vwgO[[Oˣo@8ï^rrukemЬp`^\rz4ۏysn li: ׋gU/KÓd1D\:tcr?N. |>Iuֳ͟"'y61ay?|˛R'x}\^WʣWkƨUWܾO(/gO*/w_z/6O_|MSkUvJo.>Ӄoɿ`k rgٛ?OW2yoܮo8oN>˫vrՋEk֓;_۽GN\ǵQ@A]<_..j;_[x'ݣ?~]5&G'ݝW[W߾~𯷮T㭞Uk-O~[>~ۯnniBʞߖ&לBO5`kW?ͿxGZ?%w V>WjycCV6Ux5OTu6lКcx݇o,Y~c~,vvO>//>Boy{Uu`x?wovq>h1?oo?9syΫ=ųoΫ?;z'_aٟ9Ͽ \|{;~[57tߔ&p㳏hpqpM -*0O/oѦnصƣpX:^s3Z]]?hrӊC#)Uze>FUިGa:ͫ/GrqCv峟;Ý'? PPb03DQVͩM^{v~w(h\~vK<޾fy vU~я\5Ҧ*\(n?h\ T/__|gn2[HݏO_|_Ý'\Q=%CW^<7_ӽ+9mѲ;k/yQnG-nܬ=r7ۘ.^|0dX/ڢSWFު5^N>}w/όh޼npvտʳZStFFe8~= ;gF2|bu :m:ojoZb'iZ8xV V[v:^ ;7Ov?r:G?&P?ZM/g'۵Ͼk݃jAQ ??wHq_? ..h"MB(շn o(Ϭ3- +*0O/oѦnصƣpX:^s3Z]]?hrӊC#)Uze>FUިGa:ͫ/GrqCv峟;Ý'? PPb03DQVͩM^{v~w(h\~vK<޾fy vU~я\5Ҧ*(n?h\ T/__|gn2[HݏO_|_Ý'\Q=%CW^<7_ӽ+9mѲ;k/yQnG-nܬ=r7ۘ.^|0dX/ڢSWFު5^N>}w/όh޼npvտʳZStFFe8~= ;gF2|bu :m:ojoZb'iZ8xV V[v:^ ;7Ov?r:G?&P?ZM/g'۵Ͼk݃jAQ ??wHq_? ..h"MB(շn o(Ϭ3- 9F,T9֠Q^W+0NJivu$T,J| [AWQP7/O_>+sԷj]!x4:hxfpb6ҵ9rgr싿 ?^VUcRJpXaiz-.|XNN>}z%0K;f(9X'ӟ+xaV/eew.3̑Z ^{vrz1WЁrTvz`@!UƖڡ?6OG˓O*V46>7^VJӫ6WZ_(R~mNNxtOsxgjq9<>}'jo~Q= a@z4l\ٕq15[E|o6HƎ*տ*vXpTNm:^s{(w(FF+rZQg*mYoR01zVMeӔswԦasثعEk|rfuRF#  ˉqƨ!LrչsJ!Q.A 0@ن0\Ssv7ewnH4[Q7Ci) RɉFa.Kcgq`R99/:!$~>TqC}G,69Ɇߵgλo_V$5Gb}.v8qYϹPTrl&b~x~xkjb_~z |.Ipbl>6x"ýAFm6IɁ- ӑFM ;ɝlmܥO^yTI19,,{[p$Y 8L.DP6'Y}01ȃy뷓@Y%9&*)hm-9^rˎVvNܫfx[ I10a\|N -A QxׇB~hY,IaAUUlBtZZ_`Tw{?-L,ꜿ \Pl~/OM<+m@مa#7 BPvXqB\(T+Lw5h6 B!CVnGJ"&%Ds 4Ĩ'ՂnZňZ|8.PȻڌ'g4G37JD0rV.mLVOL_:@sz=!> G8gt`E0ʅ-V/!nMf 6PR8}&ĘӯDz0P=$kNU@6SQp +A QxׇB~hY,IaAUUlBtZZ_`Tw{?-L,ꜿ \Pl~/OM<+m@مa#7 BPvXqB(T+Lw5h6 B!CVnGJ"&%Ds 4Ĩ'ՂnZňZ|8.PȻڌ'g4G37JD0rV.mLVOL_:@sz=!> G8gt`E0ʅ-V/!nMf 6PR8}&ĘӯDz0P=$kNU@6SQp r q@*`^z 0cJ&1`PiT)Ňtԃ#Հʥg-1k5 {RojS:vW=&1X0CgܳrtƗ(&C K1lB;3džy#Zu8 ?bx<l7>A4 Yn[DZ [e|a@ ,^_>@e'` 3!h) h= +9< b!+[KzI¬o=&ۛQ쁣7y1OۋfM,fXRM>vbvND@rޑbcT߼:{MtG;0Vҍt Crb(.Ǜ[6pufU'ER"@WN Ծ~&Jdhx|'1C+P).؎V&U'/=YvTWDvv(&p6 ۭg&r|2g&v.~l 'Z4WJq.*g -S6'p ' j&?kwe<>nu%.9|X9+1/qy J&;[CkS'Ɓ 0BlbÃnvN<ro}axU~Td"dsljFw51\h;Aqrӳţg׎9%nMacdztu zH)[,O-V_Yx=C@E~7_wۇEsûcWRڮuڠ[7}x nrF\(7y3B1ۭrS+ mnu%.9|X9+1/qy J&;[CkS'Ɓ 0BlbÃnvN<ro}axU~Td"dsljFw51\h;Aqrӳţg׎9%nMacdztu zH)[,O-V_Yx=C@E~7_wۇEsûcWRڮuڠ[7}x nrF(7y3B1ۭrS+ mï8 s8./2z:U{O=ʉ'ޟ;95u}~tk5WO2 ehx`T慍}0o܈;~λ̽}E.PO`iw+E:br{6Pʣ|\je+勑}`5B͓J)WWxNealú1ƀ C\kn~元Ww<8~. ߞu_k04@B@mD0+@ BfqSţbZRl6_5z9 I)!Ft>E6H!n,Fw#t-z$:taj b ?kvbrlZ=%x(DFC M혬(lKv:PY{oٸpZs~UFMT(^x->$F=1͝)Q1 t LC;j$@-Qo͟vvC1Ҥة>uB )Q7ܝr7d!p1MjYJ681sd#(3$?iMQJ,@2nA @΁>Cl{!80H~Y֕>vPmp"=uLj >>p Ձ4Je>> ) 0T6&3cd0ዏMJSۑjs>{>^[ 6Pŕld\LΒF eҞ{7H;0f& ;"K#u?:TwyfN&c L9Y=s*RF/#3@W(4D3I`!Twd'8C4̌g DPE33ڲ,Əxc##cAB7nqVk0"Pi97z$5C sn={=Hk⡋Ϯ{Z/xJO?$ 踑]$R6l I!1*zfJMsjG.@QRO !d=;Ƌ8Wp{z^Xg&NdFnar@ p RRJ6A\JRyte0#W/x4fǶO?zޗf]|#H;S]9p@9Jq":݈XbCT 5+皋'dczduHn:ʇ5c97bCY6:jԶ6FLmԷ#bruWn6 ,J VKO;9(b 7Pk_oK1% YsLt2`ؔ^XLRz~藴_-~a. &XtQZ3fj햧N!L@(UR8}>60n}OdW6ZiǂX}9D&-gf`ť`p0Jn[QR.0.4FeH?7u<1۩ɓziyvBdilVW/vNZ8)DV +6켛z8pY7u7]9xw\o<PjD7T(Ξml\㒓n&#>6FLmԷ#bruWn6 ,J VKO;9(b 7Pk_oK1% YsLt2`ؔ^XLRz~藴_-~a. &XtQZ3fj햧N!L@(UR8}>60n}OdW6ZiǂX}9D&-gf`ť`p0Jn[QR.0.4FeH?7u<1۩ɓziyvBdilVW/vNZ8)DV ;y_o%ZyY*NqQONHuvO2ᚓ`ZB,Q')!$l8%"ƵcԏAYP??9XeDwd#z Rb!'^SN:-.<_ %륩S\t6*|j}~몛M;9ꖳvcӉ{/:Z]ڹ^>u?2^6&Fm+9+Ο_WN2#KzΜn?;U-ߡӯ`bb~IXgWHuɂƐ2 b'K"$_-R:&TˉQ(:, ^b\w{=ݵVpu-ۯ̟tc`iҚ;qDo6:+O]{:?j# & *? B ~BjUq>8Xx؅0C )h`cPyR8aAZq;(id,o\Kˀ4VrTJ$W hYKbVڸ\ )#~?"QͱR'PY9M-"q9^SVLi]EAk-XH  LIM.+J~a8AFDL? "%oD,#(Eўqa1" ״ Y{6f@ LulW9`"t !: "D|H!B ^!zo]úؘq /΅jhhF0P% RBCbENq+\^/r:v`?Cn ` BCuSnlL9fe?s%J("*3W(H(.XgqPBh0%):?BXϗ2 9[B03<İ&@ZGC xjU>\)egVBMl d|?3gbr,ifN%p;ZY`Q?5@YG*ʔhH>•eX&;ryv @Wp,L&n" hGE瞟.փ"RBCxc9Ag] F4݃FPLc ]/1 JVDwQs|#!{\[exjdF. ￿ a:(RiH+'\(&Q`i0;(t (;>;@E**`)~DX(c\ qҔeddqG>Dmfƙ!,T= +ViYύ6Ou)]O1\FI+', >PLc ]/1 JVDwQs|#!{\[exjdF. ￿ a:(RiH+'(&Q`i0;(t (;>;@E**`)~DX(c\ qҔeddqG>Dmfƙ!,T= (T, jSPVv 0#dA?⋑? dB  S*rh hVrȶOc=8zYep]5>P[Th+ӳ@ F67R8`&td:@zI18|0IFrvWnw_-qfsGDrr e*4ŦiuL =iQF1MA"1^zzL-B(&s"zvuuxϛONbRj>LN ` * hFuu٫ӑ+$k%| ӪݭӗFf4H)y4z$)-P d l>'cf.T^G"DZ~x|ةVG 6MG`DSi1Ja·A @@ -10848,7 +10848,7 @@ MKXF jQB,ZѴAgEV SZ98'fSI@XC2ڕ$vڗFq<ζ;td$4QFB L=bx)Ng7,eR:Uz6gׯokR4^k>$eݬXa3aխ.*E lAIiųdd ").MZn5=˔5aX񻵚oyh r*d!C1 en>`Պj7x)ѲmhRphw}dYtXz1keQB(Ls=--DK1Qpo{|np[5^F3{"CLlBxf>gIQh5{TF b"&v2ꛏn>=;WmMi\X@(Ycv1Qnjut+,$#1X֨:aEK2C|&e҄@D@iOҪJ!8(M,E8`tbi%)Y_ k3FRBN&M-jf "?wzQBRh﬜jsfqͩ;b<NfGBs˹Ew6Yr_&ƒS$B.Te=W;&d9)3O/-,dI ذ;V8JE$nD *BSH'|IZ3*6"r2[\rŕ8' jZe)ʂҜ޸Ʌ3q6Nb~h\uRifH+H8 f a}ΪZscf3)2.0dghw@-[vWJ3}IStec)`ڳ[_ƤBI`:3IBke+,ycRW\8I @@ -10926,7 +10926,7 @@ y dʅZX3mVxMĔ|qơCxA:#FXljx G{F*< PEyZK/\pQtȳEы 5։r%d`,w\ YWX퇴WUJJ\ ._jhJ9Օ"m 5C`,(jXQ@!N/+6ہdZz>)nQ3IW jC&Lڈ"#%h5P i@ yjT(y`> endobj 11 0 obj <> endobj 12 0 obj <> endobj 33 0 obj [/View/Design] endobj 34 0 obj <>>> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 29 0 obj [/View/Design] endobj 30 0 obj <>>> endobj 146 0 obj [145 0 R 144 0 R 143 0 R] endobj 217 0 obj <> endobj xref 0 218 0000000004 65535 f +]H.wLu:*euKj_ڋ`AtH&dj8W (c<тl> endobj 11 0 obj <> endobj 12 0 obj <> endobj 33 0 obj [/View/Design] endobj 34 0 obj <>>> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 29 0 obj [/View/Design] endobj 30 0 obj <>>> endobj 146 0 obj [145 0 R 144 0 R 143 0 R] endobj 217 0 obj <> endobj xref 0 218 0000000004 65535 f 0000000016 00000 n 0000000224 00000 n 0000061703 00000 n diff --git a/.gitbook/assets/w01-pinout.png b/static/gitbook/assets/w01-pinout.png similarity index 99% rename from .gitbook/assets/w01-pinout.png rename to static/gitbook/assets/w01-pinout.png index 62ae20a..e551ba3 100644 Binary files a/.gitbook/assets/w01-pinout.png and b/static/gitbook/assets/w01-pinout.png differ diff --git a/.gitbook/assets/w01-specsheet-1.pdf b/static/gitbook/assets/w01-specsheet-1.pdf similarity index 100% rename from .gitbook/assets/w01-specsheet-1.pdf rename to static/gitbook/assets/w01-specsheet-1.pdf diff --git a/.gitbook/assets/w01.png b/static/gitbook/assets/w01.png similarity index 100% rename from .gitbook/assets/w01.png rename to static/gitbook/assets/w01.png diff --git a/.gitbook/assets/wifi_ant.png b/static/gitbook/assets/wifi_ant.png similarity index 100% rename from .gitbook/assets/wifi_ant.png rename to static/gitbook/assets/wifi_ant.png diff --git a/.gitbook/assets/wifi_pigtail_ant_fipy.png b/static/gitbook/assets/wifi_pigtail_ant_fipy.png similarity index 100% rename from .gitbook/assets/wifi_pigtail_ant_fipy.png rename to static/gitbook/assets/wifi_pigtail_ant_fipy.png diff --git a/.gitbook/assets/wifi_pigtail_ant_gpy.png b/static/gitbook/assets/wifi_pigtail_ant_gpy.png similarity index 100% rename from .gitbook/assets/wifi_pigtail_ant_gpy.png rename to static/gitbook/assets/wifi_pigtail_ant_gpy.png diff --git a/.gitbook/assets/wifi_pigtail_ant_lopy.png b/static/gitbook/assets/wifi_pigtail_ant_lopy.png similarity index 100% rename from .gitbook/assets/wifi_pigtail_ant_lopy.png rename to static/gitbook/assets/wifi_pigtail_ant_lopy.png diff --git a/.gitbook/assets/wifi_pigtail_ant_lopy4.png b/static/gitbook/assets/wifi_pigtail_ant_lopy4.png similarity index 100% rename from .gitbook/assets/wifi_pigtail_ant_lopy4.png rename to static/gitbook/assets/wifi_pigtail_ant_lopy4.png diff --git a/.gitbook/assets/wifi_pigtail_ant_sipy.png b/static/gitbook/assets/wifi_pigtail_ant_sipy.png similarity index 100% rename from .gitbook/assets/wifi_pigtail_ant_sipy.png rename to static/gitbook/assets/wifi_pigtail_ant_sipy.png diff --git a/.gitbook/assets/wifi_pigtail_ant_wipy.png b/static/gitbook/assets/wifi_pigtail_ant_wipy.png similarity index 100% rename from .gitbook/assets/wifi_pigtail_ant_wipy.png rename to static/gitbook/assets/wifi_pigtail_ant_wipy.png diff --git a/.gitbook/assets/win7-1 (1).png b/static/gitbook/assets/win7-1 (1).png similarity index 100% rename from .gitbook/assets/win7-1 (1).png rename to static/gitbook/assets/win7-1 (1).png diff --git a/.gitbook/assets/win7-1.png b/static/gitbook/assets/win7-1.png similarity index 100% rename from .gitbook/assets/win7-1.png rename to static/gitbook/assets/win7-1.png diff --git a/.gitbook/assets/win7-2 (1).png b/static/gitbook/assets/win7-2 (1).png similarity index 100% rename from .gitbook/assets/win7-2 (1).png rename to static/gitbook/assets/win7-2 (1).png diff --git a/.gitbook/assets/win7-2.png b/static/gitbook/assets/win7-2.png similarity index 100% rename from .gitbook/assets/win7-2.png rename to static/gitbook/assets/win7-2.png diff --git a/.gitbook/assets/win7-3 (1).png b/static/gitbook/assets/win7-3 (1).png similarity index 100% rename from .gitbook/assets/win7-3 (1).png rename to static/gitbook/assets/win7-3 (1).png diff --git a/.gitbook/assets/win7-3.png b/static/gitbook/assets/win7-3.png similarity index 100% rename from .gitbook/assets/win7-3.png rename to static/gitbook/assets/win7-3.png diff --git a/.gitbook/assets/win7-4 (1).png b/static/gitbook/assets/win7-4 (1).png similarity index 100% rename from .gitbook/assets/win7-4 (1).png rename to static/gitbook/assets/win7-4 (1).png diff --git a/.gitbook/assets/win7-4.png b/static/gitbook/assets/win7-4.png similarity index 100% rename from .gitbook/assets/win7-4.png rename to static/gitbook/assets/win7-4.png diff --git a/.gitbook/assets/win7-5 (1).png b/static/gitbook/assets/win7-5 (1).png similarity index 100% rename from .gitbook/assets/win7-5 (1).png rename to static/gitbook/assets/win7-5 (1).png diff --git a/.gitbook/assets/win7-5.png b/static/gitbook/assets/win7-5.png similarity index 100% rename from .gitbook/assets/win7-5.png rename to static/gitbook/assets/win7-5.png diff --git a/.gitbook/assets/win7-6 (1).png b/static/gitbook/assets/win7-6 (1).png similarity index 100% rename from .gitbook/assets/win7-6 (1).png rename to static/gitbook/assets/win7-6 (1).png diff --git a/.gitbook/assets/win7-6.png b/static/gitbook/assets/win7-6.png similarity index 100% rename from .gitbook/assets/win7-6.png rename to static/gitbook/assets/win7-6.png diff --git a/.gitbook/assets/win7-7 (1).png b/static/gitbook/assets/win7-7 (1).png similarity index 100% rename from .gitbook/assets/win7-7 (1).png rename to static/gitbook/assets/win7-7 (1).png diff --git a/.gitbook/assets/win7-7.png b/static/gitbook/assets/win7-7.png similarity index 100% rename from .gitbook/assets/win7-7.png rename to static/gitbook/assets/win7-7.png diff --git a/.gitbook/assets/win7-8 (1).png b/static/gitbook/assets/win7-8 (1).png similarity index 100% rename from .gitbook/assets/win7-8 (1).png rename to static/gitbook/assets/win7-8 (1).png diff --git a/.gitbook/assets/win7-8.png b/static/gitbook/assets/win7-8.png similarity index 100% rename from .gitbook/assets/win7-8.png rename to static/gitbook/assets/win7-8.png diff --git a/.gitbook/assets/wipy.png b/static/gitbook/assets/wipy.png similarity index 100% rename from .gitbook/assets/wipy.png rename to static/gitbook/assets/wipy.png diff --git a/.gitbook/assets/wipy2-1.png b/static/gitbook/assets/wipy2-1.png similarity index 100% rename from .gitbook/assets/wipy2-1.png rename to static/gitbook/assets/wipy2-1.png diff --git a/.gitbook/assets/wipy2-pinout.pdf b/static/gitbook/assets/wipy2-pinout.pdf similarity index 99% rename from .gitbook/assets/wipy2-pinout.pdf rename to static/gitbook/assets/wipy2-pinout.pdf index bed2d2d..b40bea0 100644 --- a/.gitbook/assets/wipy2-pinout.pdf +++ b/static/gitbook/assets/wipy2-pinout.pdf @@ -700,7 +700,7 @@ H 1HNq.,7ڻ35 D{`HNEI++R}M~H`Y&t(@XIɾM'}$+7gJ`J( \ =eiSYqopTvfz=@okL$ &BHz-t\9㖥CLtr*bL2WjqEZ)O\.okAzh&pqR$ABk iˈB%HxzlA~E\qEATQ|?E󊪦geA쉡HcZA2rRvuD]'t@j4ewjCv`""%%c*fTGu?a4M.SpϮkQOc\9#Akυ4p3I <˵?5ULg=PaPt|=Ee*<\9xz=DɜIZĚ2K <3_DFZo30zH?Ժzvkn]= ^y ?&g1}9ټerwk9 z1hHyԻM&ԼzzA,|(ZȐs{_WYE6as9>.@Sq$ WeIl/w`NKmTqN"~ (,hS$ubEB6~"qWƴr"ױ 6lڌmBEhHPk(B'w!YeʞzeA3gBAނ<ʈ:5`=q*82aXfW6WSYr05kOU%Jc2rsdF"!&bo2pVX}:NHՊCMڐĻ|_V\uYG6tǤ3)l )|z:Z(H YbO/DQ/dQ& ԥ[MʰOL)}Tv@"vCX{_gZ -}m: ::L̺ⅱ@p&!C?rBXSx˩H3MUw\(W0YCn85=UX?] Q!kj@!{C?ƶ't6rpPspyckL=Ú릴}rճ\뢈#7.a'G2\t&̀3(>P#epK;=/X%E2Dl `q +}m: ::L̺ⅱ@p&!C?rBXSx˩H3MUw(W0YCn85=UX?] Q!kj@!{C?ƶ't6rpPspyckL=Ú릴}rճ\뢈#7.a'G2\t&̀3(>P#epK;=/X%E2Dl `q &.P,S;Qc\r&J&1A9f"݁ O"0 $3V"~i+d^ !H&?11fSSz}ҲE B۵EgSTC$o8.uP{za/AtVUrV2c_a T{[˴WO(ZhH*sśNY[܁TvvP^Dc{6[A &uU~՗zE Ó/?TAo}Ko jF'vK+gmiٶl_6Rq&{oI0}eX+.ö= ٨e3֑'(K?V^RשKu? 01SRjg& ^o;q7kF5!HOuvr?|X?,p<_lN,fxy7^;} Zݡ;Ypb%Oi͋crNV -$J<͑N+WtfrGe(R(@j-0[5huvY0]I^#7 Qq^8X<.aa9l|r%<iϮm~m+!em ϶Pphl2gw\60:erږgۦ@&+q Mqވֲtm1;U,a0N9ٶIrʱX'Gy`rqt:3dzses>qLtgWRѓsU\(JH&als.;(),drqt*/@.2Z;gGssGdbv9̓rzPLt.a}\:&;')bsqt:'8w>9\4L,`>&Ι\H.m=GcvnIΙy)ΥqK=丁wr|/ sZ^Ѧmi}vfCKsv6/3;f;(G:o;CN86v>Σ}su׍U#TUO ;/dU?m"5 L$wK_7Ϲ)#v]}w~{{Y3~uQFB'*=yiyM^A+n\ kVCT`Exؽbh3Pcff͈Bv5i:>Qpz$W`8$5 K/$\/v_&$7K1t}: /MzOsfΧr$qJxNi:ubA٩yMT]}dxTd5qvp֫/?Mi:t8%8sugon7 +$J<͑N+WtfrGe(R(@j-0[5huvY0]I^#7 Qq^8X<.aa9l|r%<iϮm~m+!em ϶Pphl2gw\60:erږgۦ@&+q Mqވֲtm1;U,a0N9ٶIrʱX'Gy`rqt:3dzses>qLtgWRѓsU(JH&als.;(),drqt*/@.2Z;gGssGdbv9̓rzPLt.a}\:&;')bsqt:'8w>9\4L,`>&Ι\H.m=GcvnIΙy)ΥqK=丁wr|/ sZ^Ѧmi}vfCKsv6/3;f;(G:o;CN86v>Σ}su׍U#TUO ;/dU?m"5 L$wK_7Ϲ)#v]}w~{{Y3~uQFB'*=yiyM^A+n\ kVCT`Exؽbh3Pcff͈Bv5i:>Qpz$W`8$5 K/$\/v_&$7K1t}: /MzOsfΧr$qJxNi:ubA٩yMT]}dxTd5qvp֫/?Mi:t8%8sugon7 >%IhwwW6 3v-so~s.t$"h _ZCRYq:a+I8Yx5qG8=OrĥqY?y]c0ZaX0Oڮdvz3h|yq}~܇} v8Sq PcLd^MDZO@OPo '.d:O2^O)<0yK5)Sqri[4Wv:_?n5qZNԴWNsGўfnã8GQuYZ$Z0N;ŕlui:v pp]M!,g >h /ߛDYtSMa4Mޔ_ {Ӌݕq$}_RɅj6KZ|X+2rluvOtu;8*@W@D-C+UzE9{x5G2%B޶BVhq`QGfbS:maܧbϢG/HcMgdn_aQefmɿfSJƖY-WTd<ػ=c><iIt^v>8U2LԮW?k(L(,8Xqu'D ^a I,dR L⨀K,yݷ8]n< &s0?}RҮ>̯5D @@ -1163,7 +1163,7 @@ s @^c9xwoեowVg^7^ͿԷCͧarWL]SPO}~wLz 3?HM'{!ZpJ R)8ºӨ(N)i%@iI0|}lM1HB6>`)N:?h3:dqP= G6|Co A= ixUz['a.0#%Œ#$ҙ,@;0;BW{c1v%G jx =g&8; u!vdgvggXgݹ3q,|/>Gĥet0'% np C.^.ÅH =ŧ"؃2[dd@DO@ ^ZzK|" x@aPPF#>{ĥtt s/>h ZYBuˣ:^DT+Ovn`򐊧) ՔMM\ -[8聳5tA=&`SN]8ة3qX7;q#{%5ֺP)`dтfgLarjF 3EeHfVY0[{bjvfbcPJm5MA[ 5!TAAzlZc+=4hTĂRJnZhRe+vXLId!$sg,>xK,\URu{]#ߪ.4, l%EjHM9$!h@ػ4<[yϹHUO޾"|ڳOqkvԺ50oC3;n\6?W\k:UQFt]RUT$]#+HrDW UZJCk򐆱8R.ا 0@ I{#ߣq[kw,Ye4l˚k[QiЙ&n{tF"S:j7[`4O-%Y@ %Y01'*oĝTFV'jSchM)Q6'x+%cdJB B <_y=<#Ox{ʢa8sʮ@H2pC6҇\J¦`L\R& m q&M¸0jȾ?i ߸=_+aq+0';~0<4{P2;q50,ik]ܶ34Ж%%$ K#KP=Հ2Ȓ |U;8S9X=sVageAYP0q O◟YPvJ8g ̾&#&'qD$$0qSVr$Hgq.A%n qQ #H(⎑1&dz6zIx;A6;yή_4Ɖ_rǴ>OjIJm Ќl̆Žaq}\(4|z><m^"G␛6ۼVf';ÇOg| /Sqή29_9GVNIR)dV9JGH k\ G#r*gD +[8聳5tA=&`SN]8ة3qX7;q#{%5ֺP)`dтfgLarjF 3EeHfVY0[{bjvfbcPJm5MA[ 5!TAAzlZc+=4hTĂRJnZhRe+vXLId!$sg,>xK,\URu{]#ߪ.4, l%EjHM9$!h@ػ4<[yϹHUO޾"|ڳOqkvԺ50oC3;n\6?W\k:UQFt]RUT$]#+HrDW UZJCk򐆱8R.ا 0@ I{#ߣq[kw,Ye4l˚k[QiЙ&n{tF"S:j7[`4O-%Y@ %Y01'*oĝTFV'jSchM)Q6'x+%cdJB B <_y=<#Ox{ʢa8sʮ@H2pC6҇\J¦`L\R& m q&M¸0jȾ?i ߸=_+aq+0';~0<4{P2;q50,ik]ܶ34Ж%%$ K#KP=Հ2Ȓ |U;8S9X=sVageAYP0q O◟YPvJ8g ̾&#&'qD$$0qSVr$Hgq.A%n qQ #H(⎑1&dz6zIx;A6;yή_4Ɖ_rǴ>OjIJm Ќl̆Žaq}(4|z><m^"G␛6ۼVf';ÇOg| /Sqή29_9GVNIR)dV9JGH k\ G#r*gD ]ū][Ԅ-&-LlAjĎo$4Į v5{xc? ٌLk9}.e3I6{By-;P taȜ.\ cQ)FPIȽmrY3{b @@ -1273,7 +1273,7 @@ G Rd%xŸ.OWUjt%\ &BILkج§I8OGk~ :n:#g$`qFo΀f|4i#i3~t+]V]=HPF uD}cNؙ3~8Q_4QH|^I\I\\+\%VWon@o~r?2ΦrT*7Ң--ؐJh䁩tޖOA4t?_>CiPʁ7S`);IY r69>N[S h3i ʃNC"A̙4ٌd?ўItn.-: I s)a>%Υ/$ 77WWkG7d֙93Y~Sa㢰uQ\|Y(qY㲴}Uq]\eU\WmW#n]2pshY%Uit^p(uݣj?U'!NA1hR&Iu&i1ORڣeҍL||4#[_ύ֟P cTNкK+a &Sz. -CL(ͷӛ7=7<%S0w$Ý7\h|ZD ֖dl !6%cUle,b,Dkf7WDk&̏5trsbSze89w=p~.uQ%,TII9Icp5 T|nX=^}+}.DCmn>tԾg?~"^~BS-?3s[qߖ<7]AݩcmC<ȣ8NCh[FlzP_z 9m6n?\(Ud"Zuw^ +CL(ͷӛ7=7<%S0w$Ý7\h|ZD ֖dl !6%cUle,b,Dkf7WDk&̏5trsbSze89w=p~.uQ%,TII9Icp5 T|nX=^}+}.DCmn>tԾg?~"^~BS-?3s[qߖ<7]AݩcmC<ȣ8NCh[FlzP_z 9m6n?(Ud"Zuw^ ;uSlmkc:QǘKo8 _ #>qKw5ݍGݥ֮ {r\u _OyW>}kL>5>l~%V x*c>k#>7F>mD#:$MHuH`Џt@Bu$+>Q *IA!HS"\*eɄVe^ @@ -1307,7 +1307,7 @@ a Μ̠ z̘TgIiDO*u=tRvm'f) ;քz(A:yOdt@p!DA*v|5p]Uĸ^\cRhcM\;[IJ]F%nM5⁡If1ӎO3އB=B?g74Lbm\Rcjv6uu#&8cĠfot0A&Z5Ijdkh 9q\ĕq┆W"mƘ1„aLDq9 #("#灏q'x $EI  QeckNhWsDphsiM"Bh*$N8&qx.F&Т݁ csR~yGAyFAiqV 3Z” ]?_냰aٞX>6o{Gpsr=3!|a&kRiC47s!/,azFMhz*j@ K.J.Ӆ^g=vdgzQ0LSZ# QA%%beW@[}|Oޚ=AnSz 8W_EH_.|Ϡ}l>CcC/6z%Lmg46x-3>. o_[{k+>W--ܣ +h, sgnn,5=mO-QZShNs vь=7wD@cL!O[3 3wmhM"z346!^x}HYS^+=ڣj}'Q UD#KKU,YiI8kNP`,YSx/E]0D !htDa<"7Qo0HŒ^DbLtNBpT[g( f2tvim )? M 4Ɵ/ez5JquLEWycjOLyM=DUwTcQTuM򣹦^NJQ# -wM+1UT*\(\U* +wM+1UT*(\U* 9}X#|4~e@g07yҘ7]'07\q*]"1\g#l[.EsB0 v܏9$1;|C~]r ^%Hh8tAΐBSl /ҋ Pda@z' RFn-ܱ#&u1'qI(Z4Ьci 21&J (eSbJTi&a]/b%=EX]tPe0+O.^&dMj5MJԔ*P&t8P$tCjMyFi2-i-e:LGn%ۃ<幃<D@H}_ @@ -1457,7 +1457,7 @@ Hݮ {MXTNj>ODd)D\X~_3&}<߿m?4{Q* b3B$gR ϥČϡ$q]^idY屲el+ @MBBPF%hBMꀬYoՌvi<tϽa:sϹRB rg̎dz(;NBNP{j'X>0 `& JLg3)̺'99`& Ml_n yq4>zy [(ANCF~Ndhz#9L@6)ddbd*s69:˜m]).\f^>an9;,W,_F^#O#݂oFv.F x"ˑK^A egCaoڷ˕Fr!탘Gr%_Qe|y=*/r< \kb$G?IB$+͚amvv]h( Yޓ=ޗ=\qd@q*Dzwχ\qǍ\ndIT8cƪzBa4kתJń1oZT``醿/Ѝ!`(i-]Wn@|g ݘ.gJ4mLTI8A#EէhcdL/W Z oC$SL8+\Mes6aD\s *8̢[%t>I7jIY)jV3a-1M7o ħ\|'c毸9ŋtQ]jG~8}uxk/؋B/wy%FK"8Ԉ^ޚXl,y!wDkцGs]/HcoťB%p^ ѡەBܛ.B-| `w$55XP Pݐ `YBHLc5WsUTwUu5{EsV5wEušu'Q6܈iGM;b:D3R-7tR^8]gmZ.Hlvj[m'v[6մ&PF-*)hBrɩ1F11NTHU2jIDNVut~wޯ~~o`@~?~6" j0'4ğKcOC$Q҃I)n ~97(IUb()a b'IOx+ڇ[32Q 'I|B$a{Ks7'z/^;ǽ785S7Ae9.J/9nQ'5ex5_P%7ȷBAХjF1)i);>VC-tֱ'6&l!" O%78II(6xRvކn*nZ%{K28Zg)x:D-L\'"X.DJMIN\rHIu1ӌ '#ɘIC%Ŷ)K V\I6)NLt oEn֊\I廤#B7Ok@:Z 1 ؍DH[_5O^ [T_=ϽoWy}GX{򼰴௕ r0_v`݌˛&DpiAK:JZPܚS-dhhHdsAs<@8VsNJsSsnff9'ELsjeIWjlBEA/Ҍ^IL|ۋI4^HԦdRx1 +,q%jt=Z֢]pWѵV֎0Ub+l{i^ni=\ԵRTˍeNE'(]H[{! nHrC8+tN X1etˀ 1P6Q]Yds.V(,YKaP`K lDz K(yDS\݈;$a\UPم "AP$v;Sq>T_=ϽoWy}GX{򼰴௕ r0_v`݌˛&DpiAK:JZPܚS-dhhHdsAs<@8VsNJsSsnff9'ELsjeIWjlBEA/Ҍ^IL|ۋI4^HԦdRx1 BBROc6C2VG\ʀ.ro _RYP!K]Kk&3Uh[ǦAߋ|A|Yu3W*SHE:'X}:ysL*tULNWPQ *HPHHfJWt WT,Q)YS%LD?R>@)o0{bb{c,ጹ?ϢYc4{|h YHyc? sF01")ŸӧY73$> NBP$:sL'1uD].y6qx G?a>@?n1zLX (5x8gޘD(=Q;"ݑ}WHA~s joBh6q,;B| !/cU{3:o% &w 7Fa7p17Q DV]O\?E#~QaGel&nvY}S۷^ïݹU#v/6 @@ -2162,7 +2162,7 @@ KP UfJަvCNپm9*-{Uw\l. rN ao f`A,$=/ .ll(\9Ȓ,Q+z.rE}+07ͽk\\&U{W9qS߿m{e]%G2V_STHzl[?? ~kяt<ȆOHƐ{ac%# cE# b .QJ!de-$iAQ ڡ[K:^;#NQ TNẺ8<0:m q"L08!B} l/ ׃<z  yU-AaN sń(BfB|?@BXaH"x-$Q߸oS6Cq ̑d|]؏JZiQi@"0&b0 -Hgy3 QGوJz2_bo-<x.@=`GO,9FQeSp+S|̎=)2;c|P=9@=̃@M@H}>Pghĭ'ev@hCz(s?܋f>4xG^ne72l0g&}OC6T_i 3:/(讏󐢗Ⱦ œ*yJL5.I)Lwݰu`;"=^΍WÎ<t{8in ͍@74"jUU\UiIv\=!Z`5oCh 0xWﶌmAu0N^9 7ܹ*gbx'3[ !`8M8}7Y﴾l M2_bo-<x.@=`GO,9FQeSp+S|̎=)2;c|P=9@=̃@M@H}>Pghĭ'ev@hCz(s?܋f>4xG^ne72l0g&}OC6T_i 3:/(讏󐢗Ⱦ œ*yJL5.I)Lwݰu`;"=^΍WÎ<t{8in ͍@74"jUU\UiIv\=!Z`5oCh 0xWﶌmAu0N^9 7ܹ*gbx'3[ !`8M8}7Y﴾l M4I/f~z`!UY2/^:]y}YYLU/P) @@ -2704,7 +2704,7 @@ P~ _%-oKif\[3L \X@%UMlm#غ*@W-TJV`Pb#$ V.Kۧ AXpJlDق+V()'qWrS|&3 `J˧V0ᢉ!p 2V|>ia@e\yY-Uy ]F̛Jy XqG&A.l"{[Y#{ ~u4x5ֿ滶gFE JvPB3]!;sރR\ #oT|z߁޷C~:kP?49 ;G71׿ݤn7K:>x çhFg59!=5GMZ&AiB 536hV&ɠDКʬv1$;O }Rh6N!bb N}-zx:o ! -ČoVa F_ <#9% !CRЉ1xb !b HOI"aڋɕ`HR+K~=f-G%Ɖ8i5 [#D '' Ҟ)ƞ@R :;V۹3WƊېxх\(n\Dݘ!$8%{)K~BѲ.Rd Saʯ3Yo #Iۏ9vwd.KxY[dAJh#sb)11'XфI&\F/XWWeKFdKdHBDIFBHՎ$Tᷙst+QEPQQAr @IHD:}fjaO_gU_o'yp/!<$0;#»#}]ܻC ?;\;)GH{B#qR)q +ČoVa F_ <#9% !CRЉ1xb !b HOI"aڋɕ`HR+K~=f-G%Ɖ8i5 [#D '' Ҟ)ƞ@R :;V۹3WƊېxх(n\Dݘ!$8%{)K~BѲ.Rd Saʯ3Yo #Iۏ9vwd.KxY[dAJh#sb)11'XфI&\F/XWWeKFdKdHBDIFBHՎ$Tᷙst+QEPQQAr @IHD:}fjaO_gU_o'yp/!<$0;#»#}]ܻC ?;\;)GH{B#qR)q pgMjI |NdKDêփN$):3xugITmhaM - 0-e/ PQK^B0E|CA{2^lB.X>}Zx+[C|I ͉| >ƃUYe"E<U|yG-;|$!L4!,)Ii039RC:G)L\;!\EjA 5a6[w;揈Pd' XE^ *rhd_!ʈe+@]Vu)4a(ӥ#zChs]?b,.rX/B;/x8(a2+myKo"Ax!PW~%3ݬfz({1:^έ\A!B27n|F#:'N;꣜%g*nH%cXe%c#}?s~8|utf21tb:[zD\/>FI(7.[HQTͼXy6Yo^$ME6ڛ3 *Q]#kNkF봴Jaic*1JZaXA(+G)V J$,32,= 2TVRCHAJX0#Z.Q5 DՂd5Dz!Y | *A$< *(ĸ8qla)W|󰴘e &|Dq`8#!|Lcj #|)M` @@ -3678,7 +3678,7 @@ oĈ  Ӧz4a)RB=LUIQ/^n.abbj1wLh0{ow w Vq1ƎSc+m ( DQ#s(aŭFrpp0bX*5p}+!9YjH+Jr( -Xl E *40S *b`W d@L5@(רIq>W=aܺۃv.]\htؔӎvÆCkΰb?[EF`ӓ؄ Zi)Щ[z8IDJ1V݀5ō5nLi9y#  endstream endobj 200 0 obj <> endobj 205 0 obj <>stream +Xl E *40S *b`W d@L5@(רIq>W=aܺۃv.]\htؔӎvÆCkΰb?[EF`ӓ؄ Zi)Щ[z8IDJ1V݀5ō5nLi9y#  endstream endobj 200 0 obj <> endobj 205 0 obj <>stream HWGǿ]ݯ$jd"A "ѸqEM(.$DpKĠf<8D ݅'-xaiϭ:[tuUg.ZXcw끆w.q 8%7Mq۹Y zr{fNyh^thaw?GmQw% ^<K;}A|jr>獵ed6y)7%7ɀ+D;a #Ա ~#BZ#R3"1;ϏNLM BMqUpqo 9ns\u"o XxJ4"I$M*y5$ɏ'ŁPq/.oōxG)eHA3ҡP)mMLU%JF9|VCԑjRZU/jjO5M"Dm6Ujڗu@{yNu[УB}~E\W W[W2\.+5hal6 19cqhTu*Sڞh'D{4F4i4&94.t@ӣjuN x;ϻt 48k]iE_xNln>*[ Oz H49M.o5rRG#L/՜fxMEZ$m btI,]u::^ԛpmE V+ JzRBmvWc2N}zX-Q3EzW>ѠtmH}B+.j7jWWo˩waz$g[zN}k ޒSok}Fgl7.pAvUK7Lёz HgD:Σ OЎpqtǹ^r8V˼ԛRS짶m+r>nڇb.{|{ao7+<;gGؑv=bCm؞=In _6ɽ#}rΎRײmR&OXz+-OqT6`rOǦ5DUO.?b{qϹ~cՌJ㈢Ny󌜀[Pxk^*SKS 2 RoU-xJ4B~2f]q sN\xW^:Sz, -kTr)a4i1E|2tA#zHaVs}-)1~W }0+:KT~nXjLQm81no9?2f\( O`7<5]rV*|'$ >'nDWrjo=z mB(ЇOTns.}h:+l{*1R[Ft,.|ZRNwE}sOsO똏b^xFC?qrc꩘{*FZYYN݋S)ϠyRʑOvZDw*rA+q⹗r:⸄3Jys!Fr2}XR~ ;ŒMaFS);VbW{*Tw(Gӡ{*tJyyrr^H7>ZT d9p?[5MR5,c3G84ѐ_C^!NXIԉC+}֌%О|+x ־O4+ MUN +kTr)a4i1E|2tA#zHaVs}-)1~W }0+:KT~nXjLQm81no9?2f( O`7<5]rV*|'$ >'nDWrjo=z mB(ЇOTns.}h:+l{*1R[Ft,.|ZRNwE}sOsO똏b^xFC?qrc꩘{*FZYYN݋S)ϠyRʑOvZDw*rA+q⹗r:⸄3Jys!Fr2}XR~ ;ŒMaFS);VbW{*Tw(Gӡ{*tJyyrr^H7>ZT d9p?[5MR5,c3G84ѐ_C^!NXIԉC+}֌%О|+x ־O4+ MUN *qcZa+K:Y~j|[ΐ]~Ÿ!CYP8Z2⇈#/>._ P᱄N 7ة .d{,jҭI1əŤCd)RpoSzeθC* GƤ7}5 eR2R 8p8)W,M sHLEy/$k#ß^+UvsW">%O}0eop[m|8أr#,Z<sH󡘻`x z5 mHoOoO<LXpƆpLK9'l/JRsrr'(tSt?%~P?v]DI|77rqse@ a֋PYmG!J{2)8)de5Κ޶e&힥jyer/!tf۩E3Xn՚vwoEO7`GhCh%^h]9};5ekзȯMܩA_{un'Faoe45 ֚tswmhhd"-{²AuQՔm2=4ggcT#L=(3 ]gӄo[Q9 VUwdEzAmsn!GC  >\yv%^&S/!ڧJ7F枋+. {_Z}ؖ}>Ep6d7+ab6rz55=. c{CbsΝw63K~>`Yh>k$45|z0PV.A1Z%!ܺ,ڥkz1:jw pᢴ=0V$)2!<Bu:xL&^XDWCSJmsP$d/ʗhr~`TxQw/|HM΅r .'0\̕ށ!ꜸTHLs9H `(sA ^"}g*N($3nXRiLfλdbLV VEpif'TګFU[O|6$~6\q h-o5ߑƷd]{D[6Vo{n2_EcWED0kW[a<^ --!<׹ vp>D >t1؄_\R\34Q\RuǑgo璱h|\(4*g.4R6 7K\8pcL&q!4 rdη>"P؋^u͎9 E;:UJթ<4a~,j#g٢BfITpqـ u]@"iK@R(T9FR[}%y*L1NQbe)0_iK[ <}bgisdѸ3@]f,( SK5 2~ \σY:cL1ňgmf{2;uʵNh 8뎶xdY: lx5LgCo \˱H 2~I.0 +-!<׹ vp>D >t1؄_\R\34Q\RuǑgo璱h|(4*g.4R6 7K\8pcL&q!4 rdη>"P؋^u͎9 E;:UJթ<4a~,j#g٢BfITpqـ u]@"iK@R(T9FR[}%y*L1NQbe)0_iK[ <}bgisdѸ3@]f,( SK5 2~ \σY:cL1ňgmf{2;uʵNh 8뎶xdY: lx5LgCo \˱H 2~I.0 ;-.Ķg HIeKpW_gsP\W2|8&q< ;pY„J{I!qYUÆ}}tׇgv=OWzw=.׿>}e 5[wDx)ú{eԞw5s5]X}5[Z n)C+RFw2&<+)J:`JdWĩhcPn/aejo3W?Y$ZBQBlLN}_Ϡ>=!1Ƈ՞,=p U ^>au:K \&R/ +Oβw=%ר]QiV-j7h{EV?8;P;r-P{1k< j{㱌vZMy5%.9.X`)>PΚ-^4p}͎%?Z]v9c['yr_v1}FIJ9v4zn{&βloD{ 'e`ac @@ -4871,7 +4871,7 @@ S c(7@(Wp!䨡\HHao lcL;LeYMlwTw  Ga^Oo,h< 44U>$vF3d~Z].ʨqf~&o`NEk8= /,fϐx0JxSCaچA@3 =?mUwOO{3CEQtn!oh]_V~'*a}#.ܦ}v\n$("wƒ w%I >]IJ`ҞE$4JYH½Y=g:{gQKSX 3#n{=,c;B#U-|>k4q)H͕72o9vN%4yhH-CAl9Ҥt%Xv&+TҤ *HRv@ltQ]Qn9VSNtZ͉ϻt nt2HLܟieG^RvNS=YT=+S{yBX|dl?ܝHYj;It١hZ02[Y髨%7#ߊ|Z[6.wna'rK{~%z%v 7XTk3_"^-'|g싅*D$b >3EBܮPYHBD-ڮ+ Oˮʵ+s~reݔ+َԖAQ]\)R/vػ\: ".3@)\rJA{\J vjN4 PA^l{_xI -+)NoxOH%Od׫h2Z?}@o\(ue0V/iţw|l>mRjԍZ݈ATRxϱ ++)NoxOH%Od׫h2Z?}@o(ue0V/iţw|l>mRjԍZ݈ATRxϱ siM{nkr,5gcN$fe c_2ޅO1-IW4inf٪o(raN81V>p6SO=0vȉ]̲sZj"x6SDʒٷ\4 5H D m?!u.8ۗ\*zyNcStW-=<ԕ֌[z!KffәnCMR`F=$k#|C΀< Rq]$2zT4R2 ǿ5w⯛K|bmwV[׋AR~:cijg7!VqZ?[Zs]p V- {evH&cl^4.vUu姭#eOߌFaO;I=ĢFd-}xǭIﲒ{S[ʈ)Vo>3pxdQ|qhJ.#Nԥ\W O$ĤQy|G nI8Ӏ-iմt&|2!DMb-p-I:PLT?2NDzcog&Fe 0W&u6sB;ork޸< 7.9+ՍFBys<@V܆קy8k<ꁀ\}{m_{J~Nݱ @@ -5233,7 +5233,7 @@ dv8 M0hݖld>oqiN$KL"Ưi5|2R_ w2V&=e>fm& _[0j˜L70#KL^bwUUd^K5)L2I6FM:X5L{}}n$? kC /Ac@F2rXb/nfF|ge駝-i~Zؖ 1aaddb%4da^-P N?P#('Dc0zq/+K>,_ÐLDd`Zͱ$sKʐ~F}N=R f^Lgeiu$!J}԰%:~|mN'/&%bu0^d[(&^x`h)=VAD!L %x}#cbJ ҇HUZE!-1C؂`TD&C 0MXC}QhzeDe|9 Ā9@k)Xpb"yi_8h-yƀ̔|Gd_^0E:mNqm 95ay HSm M%.F GLgY[8Rkꖛ~k ,Ks2x\R䥛<܍+re[ Yh ɂvp|dJr8NJWlj.ߞɶ YU=јKcI}4Ma2|۟m"o+AZ- (ˢ>&9ɺ'Qw7%5O2>Bbʗ@kذ͔)}?zBEWr @(&uN7][˦x(9 -9xӓ|' 3#3'|_(ᄮS}s';3r> @f7Q`Jh1Lh0L1b[bc{3K3̌Fwmm ZÚcLϰtn^GsLgɨǦQtJF}ILTШZ!ůC2ݾ.+!$c$z L>Ze&&;F_!ws2?cfdE 6kd ,t<%,JܐJqI2rw'uqed>&Dl ZKztߗ2= 8d`k,s2 ;e_3!#^`6ͽ;0kH !3~#3'2kqX(& X]$/fh*Mө9s3\.`|I wʑ-RGKhKL?V0 @@ -5244,7 +5244,7 @@ M G"u 8gЕT1NFS[sm:M7ҍvS8ՃM-5!CP 93 Ɍ&I]rzb.}9K]Nɔ?HR O \ۛDYh)%o٩O}5f$xKֽKJX "%ui-kcYɰc,_IkibSYcc`I .a2^t}2" R\z&dt0@1z| 7 xǡs2`my$Ow: dUF,\k+gWbYiKz_CɌ1{d:+!*CV]9uL׌?Y=Y9]=|ރǢAH&Il4͡%t޳zxX42s[})1VquVԦ~aY>|ʥ0I$BܒXex3Nqg#Ի1FaBf3d+ >A}i3 zvѯK/XzDPz},^BJ}9`2XY'Z:hy(4gkɏR1DBf&ZYH6RLs%ːq4 @@ -5477,7 +5477,7 @@ t2 i EגXyf2ys2)/Uh q.[{}CѾ+!.$aLAnE5t2ȐB!-K惢It|(/ͤE91\@f&2 QxxpT6n$R4F"}8?(](+A&=E|bc"#>'>? (fȱ1d[..[Wj!ƾ1{G|}ZXފ|9%-I8p4Gk+^ 7WP_q#%۬4FI'I{lNTFlZt7Cݒystfo96'GIM(M>RpjNJbX9iXLcT Ib2mM#"!w{=4tFG% qdX덋Laheʢ2 ppM5uGyC8 џڏ;V ѢN:zҹ3W*ې?Fo$˶4.2$l[3 Cnu \ȜN 28?tg k~|1W2S9^\j_L/&If\Լ05Lcsg.5|bɗӅy%mUH*(/LڝI{2)o6MyK9wjT o쭗ewjSʺ!SteQ+UKjV%p;Tw\Օ;LٞeOqE2WX.]|:~j\k dye, LҦ Qo셲b2&.h^q1kks-ưq'a@EFx8(H}y 940MF$/6+yWxےIQ |L`2MD] '^BRU s6U^0Q1$1~a6H.ړ {Tәn0Q2JÙ9Uw0czvZrz.vxKզ5&bӡlp<ca\obZH;89;/bd~߹&=Dcww8;$U_dNUԚM+nH<;vzM\ٶDĦ|f) … xf- -P೘=dQi-$AVǒ]R˴sC9RM[ ؕfLÚ1&1N6nW HX-"ֺ%^z"ֆEi.I6 Qyᰴ-%Qy,=Mx1_$̵A;W4DL|Ldq72IN4N*Ҙ4S\@SІd0r#Jux:Ϲ.u/5)Rq3D L8c>y~`Fq'<37ʥ™1f̞3]c 1)=lB%ht!+h%$ZrU!$ H砘l]5$y)F&ϨN"p/InW52!7BE܍4p dpJHI4!wRxCo wCQcd7+K8ң᜙Z{mSZI-@XLΘU2dTXk~L`2kP;ZU&f2YTyeH*&WK,t_W[_SJԂ=h_*!&}-̊]k {m [*Zzel*%Kja>96e[K%La 1[P@-C'߰kIc|˸wѯ$-K2,=oYZS  W:|O2L2( y~`Fq'<37ʥ™1f̞3]c 1)=lB%ht!+h%$ZrU!$ H砘l]5$y)F&ϨN"p/InW52!7BE܍4p dpJHI4!wRxCo wCQcd7+K8ң᜙Z{mSZI-@XLΘU2dTXk~L`2kP;ZU&f2YTyeH*&WK,t_W[_SJԂ=h_*!&}-̊]k {m [*Zzel*%Kja>96e[K%La 1[P@-C'߰kIc|˸wѯ$-K2,=oYZS  W:|O2L2( |3c3ߒ^U;}4yyzp`50\\;'n lJnL4M)ݜ6Mtcq;+dPz˕K/O%;|G# )acXIWbҭ$L,}lf>:Ħ=Y՜rrtlJtL&/#uS]T1_mb~t(j9Xe?:Nc%cw4T..\l ٖ.lSMCawD/-♉ 2f5>z>]>3+Lbv>[Tg~a]ZiZօ}|lޝ8-G(U\7WdlڛM/f Ţ^+zuBT+-UeEKki2咧RH\\嚧\V꞊]Ś}=[zǿ~"&sCs{1|???kSObkη%!@#3722u,_:oף8 . JLfa\QrX#|9ԗdܤx Fr"* MÈ+ҬİE\F$aa G% /fgT\nP@ D2ҹ;CTt @@ -5813,7 +5813,7 @@ w @F 5sO12l\ lqKP }zD%eD+KTLdl񉣨nj}ZVEFmQdȈ--9,>ȸk7~?PpB[ 07E!j?3(WbCJyNyK"6O}?RG/d z~"0d_D)v~,307 GdY.|Yt2JL(OX8?OPa9Z/= 4[?d<&א٩ޱ o)2 #z#ȩ(12ľ6!Rm(&KC hfH8 &~N%2l0d}Å1gtG&C{={s;gw=6ʼntc2}19HIG3:컧L'}SѓbD -4EeI*)ksi_`F ̅F2::Gn D2g|-(d.uɪwïf…PaڟFqXIOR,$/ʯ|)M 50qe %CT?]JU3/%__g̿_#; |aV*s̗`JFc˒ ^P/12˷-+ݬnWdnVd_! sFezI {6Nnֹ,2y- ⥒ˮ%V 3~?$ L3ūBspT\(42ptrN.\D0N)4b@6edx/ bvJ/et0Ŕ)ڗ2fb58T͵dD6%f%!s)d_Vfe78a >VjZi 6O+b:8^XoKA{È~,16Зl,(uKjψ2Od~̓ɠHeD؀-'%@꣆3:%WN uoTC+=)'muS]OI6 g$I֍2r1&FQt`ڱʹH/3Odf>Vb pZ2СoL.'LXb[ eZTC}٣D"4͐Hf~gi-gȀ>[QDF,qTTg֑s&fiG|֑GgԲ=A P8&0CnNS GI:lx VkyQ$FsddސqJ L,K`OX]F"L&( i$12 E+ѳ瞦He$VQoayؔg@5pgĉ;Q }/ 7d/43q8⽇@cz>>%11$Xr&QlP(MU4ei~DnL3mJh%f0R×tҽ @@ -6178,7 +6178,7 @@ D2 s`Fud2lOkLfF^?zu޷bշcnl_kܯ{??XB/l< EBR(,c٣Ƽ"a 5znbTio 0^(dhOҙz+²6NgԀ+Ll%#r 43C.I3 J2 a{l&t_[pܼG(5wO=_1[hU 1hYFIr!O -(:Lyyu^to{UJL$ ~g͠sƆLqd0dtP :l684i](}!<{;{I.ˡv.O}*ۨ>4Mmf7afYFn[2Mmf׸7OPDd2 [&T5)?mLkSTOSB$ތ;mN[ӎ;1#2eOӬ;c3l.՜Ks1L2?e?pLà4ϻڞ&R4P;RNEk 2|Ca2Lݲr~|9O'>,b 0wxYtCv%|ɏ{ɥ`&r#"׿glQ[V翝>UQۭV/Uj3}JWTȜk$o`+0 M۸DmWZ_0mܒf~/͍q*XՉjDĀԯH3#,IJ7:bviyw0(qkRP :Z/$Hbb@]dNRŐB拋Bc4#==D2?$2 V'}&̈M*T:9g8~*T1߷@Z,KSd8~v#hL3SX3W%&cޚ*gKrc*#RA0se+].gBN LOPTn̵[STC \(+F[毴 ]B/4sML&wɜ2gn:Ѥء6ԦNs}BOO.](d1WzװHg h/nVwunv]˗:X wUUbk*`q3ȴֳؾ_W7RkH0;bc6[6eݎxH2%2~y/T+W/c I*s+iz +St(/eW|eWbՓIzSԲ/"K,8#\]9~./=%Ly)Ta-a"d3,_~bi/-cO(2r/:1e̝6\D\ʝQʜa *=(A Zrg/Ȣ##[. +(:Lyyu^to{UJL$ ~g͠sƆLqd0dtP :l684i](}!<{;{I.ˡv.O}*ۨ>4Mmf7afYFn[2Mmf׸7OPDd2 [&T5)?mLkSTOSB$ތ;mN[ӎ;1#2eOӬ;c3l.՜Ks1L2?e?pLà4ϻڞ&R4P;RNEk 2|Ca2Lݲr~|9O'>,b 0wxYtCv%|ɏ{ɥ`&r#"׿glQ[V翝>UQۭV/Uj3}JWTȜk$o`+0 M۸DmWZ_0mܒf~/͍q*XՉjDĀԯH3#,IJ7:bviyw0(qkRP :Z/$Hbb@]dNRŐB拋Bc4#==D2?$2 V'}&̈M*T:9g8~*T1߷@Z,KSd8~v#hL3SX3W%&cޚ*gKrc*#RA0se+].gBN LOPTn̵[STC (+F[毴 ]B/4sML&wɜ2gn:Ѥء6ԦNs}BOO.](d1WzװHg h/nVwunv]˗:X wUUbk*`q3ȴֳؾ_W7RkH0;bc6[6eݎxH2%2~y/T+W/c I*s+iz +St(/eW|eWbՓIzSԲ/"K,8#\]9~./=%Ly)Ta-a"d3,_~bi/-cO(2r/:1e̝6\D\ʝQʜa *=(A Zrg/Ȣ##[. y0 bs|ā_؜Nw\{w%gsD2{w}o sh\ s3t:OGjl`zrf3"0(lt͌+5LR̔ fv%&] vC`^`ւ ֔pf @ \Kcʀƀx#4 X~a$Qүao~ԟG-L2,+Ȝqlq[pKӎ:ܛPJc(w@rR'>i:1`"00 rD4/ @@ -6331,7 +6331,7 @@ dh $t$ū@:P;?jp;^;qˆR^q< ze)G HbvhWU rmtEcۄxxpUae}\ݽWں[m:f[#a2 xx~oݤػOl;_Yv2c vh[Ϯbo,t"m˓_]-~QC~fw݇^1Xj.1  F1 m\Q" -^1E8[(C twDaFx#;*Бr,ILR88?Ҏ{I9'k;&&};\g8=`F1AJTz8ձ<^E;,\Qe>beǵ}., \(\, -ݱzCB!+"Ou0iT hȧ6/J3z*SE}j?J~{,(nGSpc;^5ɡP2}E*V >R&C% .ҭO%0eAH]>lb,#E z#t-%0bcb?mc[yQTB +^1E8[(C twDaFx#;*Бr,ILR88?Ҏ{I9'k;&&};\g8=`F1AJTz8ձ<^E;,\Qe>beǵ}., (\, -ݱzCB!+"Ou0iT hȧ6/J3z*SE}j?J~{,(nGSpc;^5ɡP2}E*V >R&C% .ҭO%0eAH]>lb,#E z#t-%0bcb?mc[yQTB $'xD!+>Ўz>fv?hY#͊ZVH2fm^%,^M;{'Ŋ׻Ÿ4'Όf~o|j^n{za~n[iCw< cJ*" wx 1{*,>P䉲64D*v>%>-Kт >EJ"OoNH?o|?I .HOX]o5 GjKN~]ROpA!^Djt]Qh">Iw^b#ψe0> ~w ԅm->l;qe^ yT'km.E&٘Ϊ3U|nE'>H|.x ?|'ʿ$oK\!OJ վbH5aw*!^}},թ{~ y'r ɶ3y SvyoU͗qGzټ@!ʢ / -bf ~m?()pB'Py_PKANt?ّ#W2Ogh/Pe8 @l_jͲzD 4Tqn:~-%[űoBHb'tQ|GaYnGk>6 -Øyakɋ9#޺~`:wUp\(/1'!R/މ>פzEnc;_FŒ0Nt."xKPRH.ٔ%"! \z`TU 5Q^^fZ6$v & z3U-BRYjJt azt. 35(@MX `& /Xž93 3òؚaUi=3иGΙ7nJŖU2@zc@4ffX+wi~t>"K6iJvF,TVb-,3_si2ݴ+t÷S->pe\lN#f}tfb6`뤱CV8y(YR N,b6/i3/Nz.]$XFB_\+dv)(%dt*d[YפzEnc;_FŒ0Nt."xKPRH.ٔ%"! \z`TU 5Q^^fZ6$v & z3U-BRYjJt azt. 35(@MX `& /Xž93 3òؚaUi=3иGΙ7nJŖU2@zc@4ffX+wi~t>"K6iJvF,TVb-,3_si2ݴ+t÷S->pe\lN#f}tfb6`뤱CV8y(YR N,b6/i3/Nz.]$XFB_\+dv)(%dt*d[Yk8Т(d!!`-&f#an1!)K7{C>۱-h0 J g _uodKH"ffhlпf 4xR5wo[k="Ar35޶v >wl[#u dmsv4޶L8uHǤ,L.MlmͷEe/J5O + v6v֨~o ؟2m r؀0o K : Uj`c, `nEQ8BJ%g{3sbe[}exSG @@ -6906,7 +6906,7 @@ U dIA,ԗt$pw"0\#IZ&#(g2WR+bDD2\F 4`8>stream W,]zW^PBv}ZG+x0;όl@c|(Mz@1ȍ%gzs':̻(aЂ3< +l?;B&fA_vMOjڠ-Ɍ}F?OH4%Co&f/MN!&orqbd$@pG{DA!rfΈ1QY5Bҙd B__)dd,3MWGIE8XL`*d8EILa*\姂96sRZ~}^W^PBv}ZG+x0;όl@c|(Mz@1ȍ%gzs':̻(aЂ3< #hA]Q fKeSYS# Wx>";c&VвDf%+(h-E Ԃ ˒2SW5 6 }RfEZ2TP Zd6^%hIɣ>)\^ @@ -7129,7 +7129,7 @@ G Up*Q 3A>sCK5ȌsO2ǦM:h{ԡ!Ѱr8 Fɐfͫgsw{Ƞ \սB%t2ܲePr}r %Nc>O??^N'syRx'S|Ac6&EŤ0ڔF؅C__7\z\ܹ}ؾyظߠ3P\o]?lûD|8e֞f /[[&|as#5QmmBx8 ^Ϯ&g?׿>߰d2 XٗΓ~ׯHQ-ؾtA&˿\}oE?4Q'SeT2~D &EDce y2矉3ENyCD(`q) d{!ċ8g/ Q`j>A~|J22{`'6$9Gޯ$dXčKL]d&y D2cJ۴"lE C,떲K6B"l`@G& dZkKlAb222@-"q,XG%K -T4C",ϙ2MK|qS/'5JN!d&1^¬8sA!I(/c&4bZFc~V\#5PPaMr7k(`3R8\5j$f~6vqjHuk]ZB1ծ `\1 ?uɀ!0r@$#|'Vg;]H5Z $FNaY3Fk1kL -kZ!|@eRbS pH6UhJ;U!8ˀ sJءD\SJ#{I'2Tao18)P riLt2?SH3x?ALZs Ted*S LR>wI!YnA\kJ%^Je%cɌD+֖7SCX2kdES\([,[V#r3231T bi ?ɽEKdm Å19/SCl֦gyޕ#b?`JBڌY}sg19 L^"FT"7Ft % +kZ!|@eRbS pH6UhJ;U!8ˀ sJءD\SJ#{I'2Tao18)P riLt2?SH3x?ALZs Ted*S LR>wI!YnA\kJ%^Je%cɌD+֖7SCX2kdES([,[V#r3231T bi ?ɽEKdm Å19/SCl֦gyޕ#b?`JBڌY}sg19 L^"FT"7Ft % g<ڗT1`Pyi`aQWC7!h` L[k3|v4kF(3`EФGW0`1hly7b!\ %aYjEX]2\*#RH@>A5| F•py(\ GP?X~)uT]rwItM [zPXMfhaôWXTH^h*Ц[̡>2dZSth&}4=͂ƴ2Tc.Zxe!^OͅnZ4ՅDe1]_̵NA9å7tGlk-\f,R-'bJiG[ų3+ї% }(&.KxYh5}kZ1W ^cq>wk2“;z߫mA+p䮸n&`^)ʢx}rl6d)*ޚdV3Iih]Ƀe dϴ=U{~\{r_^,B%&HEfU% P7Uj\?#%K0iM6<JU8Jo'Py"%\NOVMƝa05`5+;WZq1upepqkeڡ́E0AjhG,l ,m,s P C \<\X]3oab5ϙ{gӫ2 Cסk ٵ2mK2k˽Vլ1Y뢚2L̬vMvN &uaeta0v荠4L]Maծt荂PO;ic1c;~ovcf!ów6;uwIK(Xo>6f`F,#a3ֹ͑6)O6Ӕ׀ jv @@ -7306,7 +7306,7 @@ c g΢_EK&v绮xe|/vCg79yipH Z\;V{-de[gZ(dz4&cv`9F8Z? GL7\xN7 3m3BJ !3~&lZ.Jeܬpr#%iS w$꜠I]9f9.oBēظf 43K:i0'rƭMIjms6ށ&!!Q_A5'Ӊ/ snC&i ؟55S_OMW.=KwUrUb?jBsmMq/M^@c !Ծ׸Nx>»LƀeYP!.hy*ZR/.ꁰ&տQlsWMV&$)ש-N4ovj|w [2~+QBCLMJ/$37c !avMP5Sjzm/_sgK!MTiKUDCBl[Rm$̶nt3;|`8J}MS$6=4!x9*%[TGŶk[YKhtCcR 9L. Yf#jF3BOs>Ɠܙ%b>ZXf6h_ : y?+ 38^-ھAcNK.!R4fj 45'gXE5XAwI/y5`y?12sd5g~F|:>+Mٸ{}.m_҆&a5P=P= 5o'X<@2 &CsO#~Pl%2*dbI{ 2jz%߯׿.MJl& )™^C]g{ ]ς@F=Ҭ!ǡ+=Mi=T1¸23PG:UE*F!~ŲtWEM=bƿ'FVtaH8]+žg-a+e5l:g~w^tҤ.%I#EKd^#7>W\_C0%-u"m #& c5KN"@,%q0.-2p*QCJ g ڑWb,A-x!x1hL!̣ :CXZ @f3f70ȣþ9kף.nlѻK5 IZF 3rBVo; ~ikz& -$c~w67/6W7;7{™C"C\߼%zA7T:)åPk_a5z/O1XuZ,!wpT8[)hv}߯dDll6mdTa$LFt2l61Hm.1{PϹ\\(Le;,P_~:a_ 3LC ;6rS+])MuFRmxۓO,ދHF,Kk$&m JM57Ql"&iN.lPȤtg(_Iwm=spuKgv\L3mJMQhd_ZhOfhYһT=GLj~X\_i]H|\A/cdt￲#׵ҟ6O\T:+_ 4".I\\l+P3T-]è!d0\ GK%$yS XahY +$c~w67/6W7;7{™C"C\߼%zA7T:)åPk_a5z/O1XuZ,!wpT8[)hv}߯dDll6mdTa$LFt2l61Hm.1{PϹ\(Le;,P_~:a_ 3LC ;6rS+])MuFRmxۓO,ދHF,Kk$&m JM57Ql"&iN.lPȤtg(_Iwm=spuKgv\L3mJMQhd_ZhOfhYһT=GLj~X\_i]H|\A/cdt￲#׵ҟ6O\T:+_ 4".I\\l+P3T-]è!d0\ GK%$yS XahY $1qNȾTSa1PUcjh\3VzmiK(o=Y{0e;LQ$\]K\15雥՜bexI^ boI l(6XkZy8k-XkʶmcO=0eM̥3kyu1Q-S GTV7#WDAZ+VvP׬[g[xu\3BRؕmw/:nv޽w7 @{P΄rX:-KwK秹{Ϭ%1{:/2{BC->#'ި6uoV}&u;㩚+Y8Li3x?:Pf'TLFOӕhRdÛ:$T]-TmG *gh82>s:rmܩ@E`y5B0_3?2QR/j-9(~ Ld;?-Ҡ6`k:Uׅ~t)_8(lr \.g]Teɧ8{)[si*^jS$4NJ~(d;.ME U|[KvO-{ɾl73t3o$gƉĘo:z]jϛf)։cFK[7VSF]`ζNa@wqL]M ֙3HVk[HbYeD1̉5-X9 $Kt/IЦ&C'C|a5{a K-Ick'^R3Ccc6rXxSHy&B\l\@h)/w֤nX^'tOfg8M$h؈`.N&E'6H&rs:2qPԠF_L6(ob'~$C:j$ X]Ͱ3p&ZT%j"j>VJemMV!Q7@0#(&\ԠHm @@ -7612,7 +7612,7 @@ V U%Jd-i35֧ &2J]uڄW`t?UW9- Mu N`@ RAb 1CdS])icj[*ԑ]Hd"t2!ɔFBdN9fi̤sAP߱$ mF Ȍ&Č{~̰5v /aRH09L2!u LP!7=@N} ifqgbx^v(M'NtkG̠n))C&/-,``xP M2 aHp-Ksd32Kg>Zf~ +e_Ghd+TPӀ6PȘdSIru\;\FD}^DɻDpe̯4.P^$ h̊̐A 3fr}pTk-K..h_DpoJ\j)͹d3 nc{d S/C8)"0fTDX"LY)UjYLF+b"edmpE22"7[ZzEe%LL10~!I ;j\z=y 3TQ,52]LS*$ 2dе5Bf@̬0%& U|uVmwݯ2_z3qϣ8;LFqDm$d ܩ%dδtIj$at6+^Wb4l b;pa2~xztDW"Cf~a_Ke*3GJdm_ʢ,2y(d(OD2hzSIt2faQ|0s,gJL5Ә-vȐqV0! }=O RBLfsxU~jv~ig~xjKz+bX9ogd@`!U_};2dr܍O4$&#nZ g<DoO^?26Ϳ.Ѣ;RpEKh p&VD'T-C2̸!rUE\J?NjdCSۗ՟<ZĔ ([2P{jQ~_mdE"R'i icWIR`Vu'2xRDf(w<*%2`P2 6]jS"-X۩M FJKkMui[c ZʖD*.Ɗ;KC8r}Kim%6ӹ'xk;R 1·&Q[DfJVb2 "RmS5lΤ۳L3隲=SbLڦҜrܵџ`;O ݀h,[ӅK+cɽ+6.Y*S3n ;}Πfϖn +lJ`A1EK<_YZ+1iI׉2~W5Ff(F&<(]?0.wD2L{ZIIxa.2dGz49Hd},=Dj2ޥ!8V 7TxzȲ4P48#cZB!a.–K3 m lZ ;,-j2dP/ ʵ*)LFJe1.ؔHif$QY{+0`2pѐM m5 󖁌g 3F:,!cY2ۯ2bG92<_8x6|!s t(dA!dpŰ$]6p#VL|F C'' wwwsȻ5y2dnG\8U4hYY`2C|5cf2'x34Մ1D2[Z?Z;r3|kϼgǵgg۱ۨXzv'n:p-?y 2d2AIhYJ郊>d+TPӀ6PȘdSIru\;\FD}^DɻDpe̯4.P^$ h̊̐A 3fr}pTk-K..h_DpoJ\j)͹d3 nc{d S/C8)"0fTDX"LY)UjYLF+b"edmpE22"7[ZzEe%LL10~!I ;j\z=y 3TQ,52]LS*$ 2dе5Bf@̬0%& U|uVmwݯ2_z3qϣ8;LFqDm$d ܩ%dδtIj$at6+^Wb4l b;pa2~xztDW"Cf~a_Ke*3GJdm_ʢ,2y(d(OD2hzSIt2faQ|0s,gJL5Ә-vȐqV0! }=O RBLfsxU~jv~ig~xjKz+bX9ogd@`!U_};2dr܍O4$&#nZ g<DoO^?26Ϳ.Ѣ;RpEKh p&VD'T-C2̸!rUE\J?NjdCSۗ՟<ZĔ ([2P{jQ~_mdE"R'i icWIR`Vu'2xRDf(w<*%2`P2 6]jS"-X۩M FJKkMui[c ZʖD*.Ɗ;KC8r}Kim%6ӹ'xk;R 1·&Q[DfJVb2 "RmS5lΤ۳L3隲=SbLڦҜrܵџ`;O ݀h,[ӅK+cɽ+6.Y*S3n ;}Πfϖn 71{90fdUf Q3b{7<L&̠_4ʯyw +S;J{tt& Kh,!#c{'MCr}wd` "C(2dė-a-9 Tq n 4&+к+ yP{ѝyɼsgڝ`2oIvxrmX {aT|I&&OVE3lF1^)a^*D*Wsj;ɰyӗN/d 庽"0d_C)v,30; JȲ4 >]j?adHP"p~4 5Rl_zj; ~{d<=FWɩ6m -]Kݑȱt)12=ľ!R?&K hfH8 &~N%2l0duÅagtG}Į{r=qN:͎slwh6˜#Ԙ#l &wj&}xh2w9{"M19jYJʆܥFڗ B?sQgr aTAn D2gj|-〃I 2wï&ÅPaŸFqXIOR,$ʯ})M 50qefC/EKcMx1u?% /\(i R3de(Iz)Q,K2{^rsCA, +]Kݑȱt)12=ľ!R?&K hfH8 &~N%2l0duÅagtG}Į{r=qN:͎slwh6˜#Ԙ#l &wj&}xh2w9{"M19jYJʆܥFڗ B?sQgr aTAn D2gj|-〃I 2wï&ÅPaŸFqXIOR,$ʯ})M 50qefC/EKcMx1u?% /(i R3de(Iz)Q,K2{^rsCA, ˷Tt\]~ Y)_}醀*ᗵ"$1]Z?YTlP組3STNJ/ZMIL:w`<R4P:Qr ˒gkI9(2J`gxU MaZȍI~t&M -TU,Fa{yKR!C4 @@ -8169,7 +8169,7 @@ l 2~E% TCwRIkC.R @ȸ8w-KT~M-بeGP{ $dL/KNx٤'=i^gfIüϞ&1*KmԿ_ ;, +aQ3Tę MdF.+Ce[8xyvK%6%4Hgs&ߢɽdp,KZۚ޾luMcZYhu9\N6f7.q jX({IXi.R2鋕0kJ=;IVRUJ.RovٟY>'^! -Nj5ob͓Xu7,~ɻI" H7m@V7s-nn8B}(ZAuBE 4eL GPLdCdIɹL2;N(sA^8oU?_0|=]^o)w2P9 m1Obx5l^IJycdkděK (F.reQ јRw. ejzlQEx B|1l\W E|:$aVY&&S(Ψ*)* >/gM_W`" *kuZT\enWd.P{.$~*?)SqjW~3И*REizT?abDajMo<f|1VaP2l$D aߓft:bg[S {C*W2-Gsޥo¦_Л - A6ڽC۠sJ6`~\pd yjdu/uqσeܯtLJc04Q LLMJi d3`5/P/UQYVt \(mE R%O_d.36$>stream + A6ڽC۠sJ6`~\pd yjdu/uqσeܯtLJc04Q LLMJi d3`5/P/UQYVt (mE R%O_d.36$>stream h%_dR:d^jVrh^N],'b,.rya1XX Õhm>֜4f\W%ofř\q.b-ZB9ha RhqėEgrAa#2pHmd#ecL2!sIS"2 PvuSu-q"P˘sP=P\>@q"ɀ J ÀϜH9S$qT=N:Q3lu5 -4o({|‘Tw&`Vr$&qhHOv̸'3Nxތؿ I@ )sh<Aysxʆg`n~f2GG,@4<3$!t3f18bi,asp&f {h ic$G/2<L:p&${ъ&{ [\Q h(a0ZLAa @@ -8252,7 +8252,7 @@ He LFL.X#S$yLhaGKhe?Gd"f6Aʓ! %Ǩ\Iۣu`1,q.7FKbޱ֚&N:BMNL杝 8N^D&Zv?{keoD ϜzgDm |0sw*(|@ d7($jN<>bdqp 1.*Zr!|⥠~wz=xŭh QgO>}@ߩo6 k$} zs?|9t }boe˜"KPq@0(FoFoLP2@8~S(o`rq}+N%1IZTL|S܉u:d?- I{0Km12ZK9 bhy& N{>a* NO^H2rzB֩ -dJI% }IRPLCEdp&}lUJFښ@i+MJ#\(%U0^Ċb*[Rd}Ȥ>bR_Rl~MȀ@&{V0W1t'0x9 2{P0?OCq1!)I|Иs022jJ:k!tx9!CyyI^/qb2ѝȃH0e#G_o~gA! |y:e`֎|@1=LG2Ikl\(cB~hت!ɀƈCHBc*ʁzl]= p{~?T:"?9$f?@f!YA Gd\2y6G @0C5LDfv)W/Q/_ޥ_S;)Re`2\*F_Om})SLD2gz) 2s_y2ARD2J n^.a/NnI.: 21zeԵֿɰ]q ]{퐿Lol+|}m|NTZM-W<"d):lp&e*l-[$X"e`V2pLzU^eVd`G4_$he. 23L|rȌ ˒XmFgHeT⨊j̣˖ ic Zg+;>;lhs q >Wj w8`dr̠no0DR#yYՃy9LʼnM+ULb4P;x-Ͼvh028ڝ +]b$v>}Ȥ>bR_Rl~MȀ@&{V0W1t'0x9 2{P0?OCq1!)I|Иs022jJ:k!tx9!CyyI^/qb2ѝȃH0e#G_o~gA! |y:e`֎|@1=LG2Ikl(cB~hت!ɀƈCHBc*ʁzl]= p{~?T:"?9$f?@f!YA Gd\2y6G @0C5LDfv)W/Q/_ޥ_S;)Re`2\*F_Om})SLD2gz) 2s_y2ARD2J n^.a/NnI.: 21zeԵֿɰ]q ]{퐿Lol+|}m|NTZM-W<"d):lp&e*l-[$X"e`V2pLzU^eVd`G4_$he. 23L|rȌ ˒XmFgHeT⨊j̣˖ ic Zg+;>;lhs q >Wj w8`dr̠no0DR#yYՃy9LʼnM+ULb4P;x-Ͼvh028ڝ .1-+d3bAa7JmkO |"hLdhB ~ ?m3@4DD/euy2p[S+LudS5d]Ki7"L}kőhvZL6Rb-J[JhѻP9Hu eS]{4T-wTl&NʙH9Zf56='[ir=?zow 6ch5ۨ߰-Lƥ{VV1$Zc &{\KC`kS/U/obdb7E7/;"ًEw{5-d"3Tc}S &rSB4E\D8~!t Z(/?d.H?./3D d82/ d\_yPnfeٲDC%R\F5Ƞzs%Nc~꼾HfjZܥZ삊 Q |Ad^kF &2! 9Bﻞw" eʜiHa+ycHǎF.pWNsM!~ ':z,G΋]o@XZ@;o_n*OFvO/p]#l˺Ъzǔ80-B#1 aIݔ $수.y4{uaDƙVAΆ<ǽ #lK a@ۏy~iNt)eyPH E /B 2^vK1va?ei!cFu|޷U1jh.fXJj  հ;r3@/p/W|̕OIBq1Qu7b)HfPk0bG.hQ8(=FQ<{yR/憻!v2'˝ ep@ZC.CAL㽷w p@ܸ}.bbT%Qzy/&V7ȽZH bbKx%<*KrvaKXA765o,ɧچs~Z/ ٦le:gIwa -B\(}!x!m\cVw8L{nU1'ob&F3s/d  ߁N<'S 3ٚw '?'߇t"s7wF[94ξiTYe\Đ6s +B(}!x!m\cVw8L{nU1'ob&F3s/d  ߁N<'S 3ٚw '?'߇t"s7wF[94ξiTYe\Đ6s 1zϡRcf&l<ļձ (+'am|S7k@"n!v8K?ZcNAW# 4{M6mab$V- nx]\49dXA>}s",lia-jyl`/*ָ^C(~\ˏWhr gF@yݫ#{j^;p/Wt,*ONkGGD V_pƐhbBB}HUŒ& DRDDvg{pp05' d2T~O"߅}:~g&k#,;ˍZ2(EuΫ z=^^I)J_ [eGg~Py!(FLAf+szW;P&t;8 ~C22R9hYZʜ[(%O%8.*B{$}Suկ bc[ΰL["xEB OoƁ,1=~~uފKXCِ̄ġ5",CoiL[C)gLxx+rq2~VOʤP';*bxϗKUD/S_;: >qo~q۵r(l~`¹p Y-Vl<ļա8gPMsm`qV8u6Z~q2vyVʤdtcht3]3zPwSPlH!| @@ -9813,7 +9813,7 @@ lm %Bu6\fY <ce1w |)ܘl0zw4( n T19ipg5]nؖq(ӌ*ښ ޹+=.C/ 1LReFL &c`!eppo 6 s܋UF!nfGJ(x6ۗ*k)P٣~p0. )ؠrr32w5H *. 2PUk nt~z EkςS Bx^d& ˌ˳ap1cy&Pe}|913epgҗ?ψIGUr1]½1Gw7IaybX'>Pxҭp/_gc#{Yd^]=R|`o/0+1[Qz^{BӑFڄFJƘ3F7N ٙ6v`ޙ;q}/L&Ogŗ2zm@/Aea%^Њ` ]/]G" -~HZd>ΈICX'$testk =mo90QmTo/_„8X*V\(#sOc%-D2~@1.(cod|a'ipsV538mpg ._C24< zr3ȚP UyF m)G>`]R ҕyDB\T`3bR@epWdNLte.,U^&3f?8nk +~HZd>ΈICX'$testk =mo90QmTo/_„8X*V(#sOc%-D2~@1.(cod|a'ipsV538mpg ._C24< zr3ȚP UyF m)G>`]R ҕyDB\T`3bR@epWdNLte.,U^&3f?8nk \U@p/s*ŗBE^YE= h1-an7IszŘ;a;x`F`:څyv4+(2feX^ay> zq3JJHLh׋@fT[& cܕ䗚 V+ӈf43}rD3fH3%sts nFg΁P% ( y:[imE#w`m/4VTz/_D!Y:şje6g>1MfaZ^fƍpej%',Y,zeBYzmi O.h3:I;b5׾]a:ȘmGgs)x =TigaVdGQc C<^ƝKnPaWQ")`H5"5/z -0R7%Brޯ |h9=qLUfRojh\ɽsU]=_50rdt~v9rB05AZ ] 9Q#6d;2ݳ̍rBg:`aFhѓ0 ;Q pahX q]~Z+ CNYs5 -MQ CH*ms@{*9oBohU`Bjѓ0 hy @@ -10028,7 +10028,7 @@ xћ 0USR^QgZIUv\j4bdX=VʼnՑT7jTLr˫mB1tXa}VSlO64і"8iU[ռ $c/afa >e+ y|t5"g-yƑDE0BǙHyq%JVN@XoW"i4Aެʩ=je46)d]˾$>Yj#_wfvʏ =Z`CZ)=FN4G_f,DuB [ ~D縬13fLGRH -J}}p3FĆʳ 8CXAZta/Ts;VǍ_F:lP1hsGB5<  aҵm+zx;P2rB44MTֺ@r躣[P\(\(ˆpKvͼS(.£՘-8SLt7"^tuԵrDOЎy'XD0|geA i^([N JjЊhRMklme@tqRIj 4 `""%rAȂ/qn(Hp]Z->y|lto+eI/J _'cV+k0- "*3XE<sk?AiP3o+(PnbV#V\ח_A5xs7uzU#jMTl3xf$~h VlHGykʾ/,opc*xEj3>QwM( |lndiύ&KUՀohۀ }Bp@y!zR%GQ.T#UvyPZ=@g@U @@ -10223,7 +10223,7 @@ y qT\@t Psae7JDBElW&odrRn`i5=၃/a@g'a\8{ 2̞V7 16%ާ<^M[|i,LG{۩PWu'WjMֲwdַu\^ZW&д8~nbVilIɧ`e`4 lƁ}c_`(6ZDVR,\mk9\{ 9kQMҹ@iQPM|1RV{vnk[[׻ЎRF B5pi x*3 k~"~2 UH9ZU]\_&"EX֤ξu 'ݳ@A̸k6.@;(+gQ›}͖HxL#g@D)V(qpڮ38d.ɒy{HfKꁱ)&ͥbTGSǀݑO'=eikNkrDy}u.qN.XPGЯ ` >$T M;AsR>XZ t-1ΨW&^t#:&Rl!Oʰu S^O3}Q.QmnCLVg 6%&oeݒ,Ї%5<Y85ڬDqs$j/tVEL,㳎\(/\$ߵI1 'LOfuU];ۣKTaE辝ֻCma3ݑ +:GkD9o $p=5m>5<Y85ڬDqs$j/tVEL,㳎(/\$ߵI1 'LOfuU];ۣKTaE辝ֻCma3ݑ UH-p\33G[Qp G&)YP:-t2PLVc%aS {~#eh'PW 3tՋYS#LyW2Oh~IܮEU="u9xVKB<J>EĕMjpf( ֙&uD2GkEfSskYKrڦlA kBэJE8~,!X9"e[ۆW"SZ @@ -10496,7 +10496,7 @@ i) $4:j d>hݺvrs][Sc v{0d#:Ǡtnb,nJ2e>;WV^߬Ts#cޑ t[$ђ;ԯkө^M)P,e~|{Go]ӯ͕r:H GpNè)pF>evjV"ke%mAP44Y+L+Q`/N >F0: {93q^.  "Q(QiUϟLMr02 C"lFQa%&r4bB(bl;);3m=˗^֕S3ʹcP CPr %X=Mjlq:s[K?ߚhuIFa0TqۭlI^susu:0?ܽuy٥6_{p7.T\$B˅?tGǏE0Q O -j1T=?Ӽ߼{nW.|w^:?/]YΥb^_3Cs9j-raISGnSeuhF}=w%HNbPRt$TQZh[+]sxk=}{_Oۍj|n[ڟ9yO*hcpZ'l~L_xBϟ|޾O/ѵˉ8C`V$&*ތ[,O>ܗ?yo_~^ZW_{??;Wv +j1T=?Ӽ߼{nW.|w^:?/]YΥb^_3Cs9j-raISGnSeuhF}=w%HNbPRt$TQZh[+]sxk=}{_Oۍj|n[ڟ9yO*hcpZ'l~L_xBϟ|޾O/ѵˉ8C`V$&*ތ[,O>ܗ?yo_~^ZW_{??;Wv GϧS֍P?%2kk>:[;7~߽?5~?7U':<Dϲ*auעĥLԏ'ko(aPDՠrN{s/_~w ꃏ߸3W%,+)фB8RKK^;?O^{WO_ݯ>?g\[% @48^5W?z/?Ͽ}~?ޯ{wwѹwu($AP]g%_]5>|~t<׷_oÏn?w/n d0p8L;W@t];KK=\ۏn_^_>{~?]pUݑ{rw{?ϾnW?y}߿x~rܙPEb9רسCם|saj=:}g?/yx߿ o_-]Wz<~öKTv@/ }'~/?N?|rNO_On~Ggj\,N*kJSiz{C}kv!+kpgv~G7w8F6nY-+<=7KOz}R9m0I`Y=dBbKTgom?_7?ɫ'=8X4KU J ZƳU'QR~ @@ -10675,7 +10675,7 @@ fm_ FbJ%8(ExZ "%] ѝ/^BBBq('ӊz˚cBNaiTvI%SacoL" d0|@ Zi? S dJs>{'lcm]׿( zޝ_~֪@ ifm?1 Ș ry9 "T l#xӗ@NBeT EOu4=ZbfG;8)F[!ӳѠVc m5'୶[W\FmhٍDm=ad ި3]X;0`DN>6] =5sC0jP)xtș Vm\;1!p(􌏄`oF?L%$$ Tzjჯ/?Qu[72{R@e_Tt[$%0,(P9oĘRch~ӻBt2X5WW8{w={3G bgVxTZB|s!Ԉd'oFT(*GP`9șuZ B(DonwvC!GF|NViYNJ2Z9p)^65K=035B eQSĬ㴙/n{ ht4:՝Ti9_Ҥr +;O%+۵͵[gÃˏ=A&(eC03Mo 6-?X=y(,n[tURiklƓo-g/M0ZCi00!kpTug"h3̲7xc ~Dr)*PXѝL{ǨXD-orrct} dSXBhCDDe3~<5o$fFNZtpg{;vgַ 165'Qsޤ[Ȋz)W[Č|EMZmRadiKXa"A*96^jlȦYYk,]/gU5}+({hdl501̸Q)[s{܌0msv˩連rvwrGD pNt2b:9vKh% V.>F|NViYNJ2Z9p)^65K=035B eQSĬ㴙/n{ ht4:՝Ti9_Ҥr {i2uqs ޤTQ{UX8W2󋨐0V.y/aZ7qVǪMJ&+za`u1 O7?G^lVL!lOMO] 2UD9_T r`ÈH2&]N~۾b {Wn9.;&))R6 0¢ 6!LDw2L G7Hf|pBwer(90fZK׀r#&{w2*"Ba̎i|4f 1uozuz\i7 @@ -10784,7 +10784,7 @@ Y s/F ڥ>!BZ񜶒EİR$@"B4ږ}Y>1jO+mD} Rm (m#P#y OU7_ v'Z=ٝQj+N! N烩UZ#|5V6YkY]^vO fziS.efuf1RUYڡ5Ÿ(|Xu"c_6X@B%;=H/nXH6o9=%|iw>6{@ԥ 4E{7Ϣ5NHEY1P BJ 2X/+ ̎:͹U;X'('sX_ o2Yڋ%,igH;ciJS3F"kI'bl"g=!)6HR^0"Y2`IsA Pn5<EMNʧOpRHTLdGr c}j;%N8EJr$&I+xڑ-/lKI OKqi+z8ڌK$iEDlPI+uE 6Hh,_ܶeLg@i5F0;5ܖQXV]=1?Pq5#\-5vӿ| ;C9XsI@ttB+2JGrzq_ N ?WM#\Ks4+4`M 7{_4W)㍎U Wq8zqeiu6bEPb]PL EdBJ72\1ÕLH%4%$peJ)ު Xr5])]JiSc&sj,PҴ# )r:+i-I8ɜ"˩i4X2gfH?G~b 0 K9FA,msJM`|$x0i=KP@WR@~\mE)9(qQi);3 `hPJ%NhKYm)cz=~ h*s*m[Z+5_47^сlM0)4n_Y3ĀoG^ :6ژ,/8t'/>`W%o %\e & -Չ#&|%Z՛#UuwM+g2wUg3<r9%m4VTB}6)z2B}6)z2vOjPzJ:wWHҘ+Pq%/ G/eci сNі f&x:nX9TS-Q\q2H:!3HE|z{RZKIm`f]Jt,^J%'W1לwn}OqIƆ] U3b@j588ɟ'fHVITwf )Eg/ӗJ@Hk5'ٛc|; @@ -11018,7 +11018,7 @@ j j$#(F$9Ҳ6Tv u/]! BiJҼ "~v~}3JA'ȸ=0>&E1rp")PDT-tb #Ŋ->=nr3Y?}r:= D9 X<**`8G5p}&:AŻ'>d1-cP 1-ͬ|H- >EyZ*)p$ 8pd=>#Iz 4Ę p&5q4I^G[TMJ (]~qJ1f<2t|t!q' ÃM[\ϛݍ\Bh<&H!QMeШ'LObH03:|ώcNkpZ-`H9gy# =N۩c qy#!GCt{>.[V` \`Ԉm Q17_(NGr %b؄WЫFaQp ɠ~ fB_Ua HTlǦ…Xe0yVO[/ ~aG I 7g>tewerS~<|`ؓ~4īU#NNm;H.q#b&-w1G&cfUhPn &~8 $}pu3zSw?p:lkc#1f]D(Јů1c#0cJ~2Aƽ4@D_0]7{y*ƒٵ3T: ux5#܌Gm\>ANlc\ j-v+ъC, Jɩ9.2Xvlpp@]$r#IEKQ vSFQ!o@)@]ɌHW@7gvn*%D{bb&/cp)RjpƼ+&!iM#d2N+@Px@H{*igg[՚bE .ɫ%.Tu92J1 ,9p1&6fC;mL*%W„jpxT5>IIeRL1y}8ĝ/Ithčh~phphT`>*ơqA$iz0.h l_<`{A7BI7{1\#spA Io]J[0'R9i܋ I*T{[6︕1&+ uX8* %>%#yHCVcR:!'h1)܉GOB"e\n4X8ٸl>Է[˧$!\XKjjVV7BUv!?R-|CU?rTx;堜ӌqRʬ#u7!ݯpd)}I-z0ً8[ n,>Cy`6qP >q&ihgfκ+nDNAX0jG-Ƽc6S`!(׸pVjRAA{=9?e8 x e0\'%{S *2bY] %dH>f#U*2\1hFLrtJb[v_xD0-}:bG@όz`xbhnM6'',Ԅs"aZ)MpRJғ&@{(\- `f抃ũ% LeR @@ -11067,7 +11067,7 @@ P bŒ0")k%"R䮤h.ދHhy۴♕;zO.ڬFHbưqav؋as1L(ue8dPTƹ4;8$nQAJIjLOLLkՕ] f^S2d|QqGRVJF8틪faѮ6%>o+ 8:yjÛ%ũWEu^/lr3h 5sK9)UOVV$F}ӨnsQ#4A+Vnqz o]Z }~nE EHmCi&PJCKy5 1y@H Refy(;U'.z2j@Pz Anby|(<4 (Eq'|yc#(b 0mJb9mc#Q\(;pdL0BD T8=Ot]EO /Sz BQ0 QZ xQx<ߡBͳ/W)Bi\<t>p 1XBuo$ " g41j\ϝ޻zѻm =>4|rAf!@7#TlֲT}*.پr ƍxi-Wer Z!HaXQ^q <d h"4 -1-J$#J:@`96 +$4af;1A 4CVG}CPDhͰ6ŧ9FY:kg -EFIKz>nE EHmCi&PJCKy5 1y@H Refy(;U'.z2j@Pz Anby|(<4 (Eq'|yc#(b 0mJb9mc#Q(;pdL0BD T8=Ot]EO /Sz BQ0 QZ xQx<ߡBͳ/W)Bi\<t>p 1XBuo$ " g41j\ϝ޻zѻm =>4|rAf!@7#TlֲT}*.پr ƍxi-Wer Z!HaXQ^q <d h"4 -1-J$#J:@`96 ACn$0=h S&F)ިnVl c3$310 RcQ2FHjP(ᔆ1'A^w64 {1 }#0 @@ -11280,7 +11280,7 @@ Qq  D#;EZg9}ʬ !B02^Qkf"6FSGqYT4Ifyc87lS\#ᠦn6qRgC1'V5ʪ=osi^Y4DmGI'F)ֆdy y=Qɴw^D1 T[وCL4'8NIBɪ3|g"*J x* 1APi\ s~4IW'<12A݇4̈́twz*𢔒$]PEPX@YζjljW#z|BsQ# #3ӡK\~g&e"*ɂJW2ٚ1tռ^幩 σD´$g!s>mgi24"LQC^(B <'Sx$$h2A~aDpIe5uQJG^W1f?/Mƒn֚O{_(*Xf.R^Mk Qj-v&,Ur`g7݅Y_dTNXK9zU aр"`Ѫ%o\qrZiÊۤ`I/bjv1MP9ˎdF\îpU(ᒞCXKf"\1s.]8LXVYZز, H(x! FJ{LVDU4419쒤p$%%s\}*zngm]K|F':vKm—z'8O?/~7GBNM&(W;l'WKR֑˹j$EzRo`/i.,h2stĐKsĥKCNVd(!1CqU3ݻwtjhP-4bws}NY EIR&ۨsS˨ :۪:]_et_]_ѵ^!dqG(²lB5"K4c+t /V|k>yk;ZϷoW󽆣TiIJ[x#N+-uܽBó_=9w>{vOۆHl(|>rr -++\(!l5m-t*YGM(loJT6.Ѥxgz&D(6q8$-ƚfE՝_|u߾Ϯ^wٽӽr>R8Bs +++(!l5m-t*YGM(loJT6.Ѥxgz&D(6q8$-ƚfE՝_|u߾Ϯ^wٽӽr>R8Bs ZX/ڱ{ڝꝣ/bl;J`LLQY0b ]W>Qo_{h㏿_~o_Ͽ_|{NbRv1eo\ubM/V݅rp9׿?eAMυ.]=9=V6zi\雃ȽXK>ɋkE^__YھXZK6h P7Vo_]no~ެ~侮|D3ӮMw7]]tx`! CDOAHI))ʐvW}6/DTL̼ޟѿ7/w_}XxJT U2YSSK}_>w?o>o?nۯ>?Տ߸ٺjfbUm dϕ?xo?o__?㯾o]kT]Z΁ыIL>!1OAyx\}puc۹w`O譯w<;7e(B38 ʄ}rd~ُx_o_KⷿϾy7GWv[ɚ5El@uC7*?xϿƏr\~7owo~{ `"@H:(Q2gmp^x?~>Gw'Ok?ڕ_}˗[V91pda^:7_>vɭ}G9'~~?oՇ'OVA c 8(nG2s/p}z9x{u_Ϟw_}w~?ӛǃjwMaIߨW$_;//^/;o^շ믾=nh[I~nLƫJj3_9߾/׿|?{_~ş|~/w5f?:Agm<=Y&~?ƽ{ׯӏ/_ӛ__zES&-oRf׫m[Wo~ٓOW~?ÇovEby˦^ә.}oKV˯=__O?}g_Orح2vv].jbݽ˝W O>}\Ӎp\}޸ӷܺbi%)Uz/;&Uonw {[./acׄKJGvv}S߼՛WGO>/_|8~7k}U$3,Zu҂@!=;W7_퟿?/~g6pnJ.̊[U⠖9޼XnO_k?̥o=K+=⊠N+ˀμFfbjD_7v6j/wzqG[_x^={{ݾ e]7D =,)jXF_ fO;ͻ[~ow_Ͽ;]?qd}uaHQ5/@ V³%!79雵ox??z;wpW6t;K8)HDzH]i\깱s޺n'WCW$L ygt. ŵvRnotpA۱߹>~K'W/m6:vݓ p#<.e,Tru\p @@ -11372,7 +11372,7 @@ p az*QI@+] S5{:Xey(3uRC+ :IUveb;,F3z{3|@6T`¬X !=|]$)AG$wC&PIP( -WQ!0Py2`QPN4奬5F@с eZ)8ؤ ]h.wʺPuYG"pntU W˥@{,NلOMW6!Z"pٓ-h˺M nШuhU7".k7D: &o2D ]XSJ5]Ǥ#a"up`/L]Z; V%0O$,t so[Wf2pdVx:U*ʲPUҲ=A5(%_8U+$G˽ p 2"J66-HTb Di3a^m endstream endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 168 0 obj [167 0 R 166 0 R 165 0 R] endobj 251 0 obj <> endobj xref 0 252 0000000004 65535 f +WQ!0Py2`QPN4奬5F@с eZ)8ؤ ]h.wʺPuYG"pntU W˥@{,NلOMW6!Z"pٓ-h˺M nШuhU7".k7D: &o2D ]XSJ5]Ǥ#a"up`/L]Z; V%0O$,t so[Wf2pdVx:U*ʲPUҲ=A5(%_8U+$G˽ p 2"J66-HTb Di3a^m endstream endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 168 0 obj [167 0 R 166 0 R 165 0 R] endobj 251 0 obj <> endobj xref 0 252 0000000004 65535 f 0000000016 00000 n 0000000224 00000 n 0000063524 00000 n diff --git a/.gitbook/assets/wipy2-pinout.png b/static/gitbook/assets/wipy2-pinout.png similarity index 99% rename from .gitbook/assets/wipy2-pinout.png rename to static/gitbook/assets/wipy2-pinout.png index b79367b..97f6cd5 100644 Binary files a/.gitbook/assets/wipy2-pinout.png and b/static/gitbook/assets/wipy2-pinout.png differ diff --git a/.gitbook/assets/wipy2-specsheet.pdf b/static/gitbook/assets/wipy2-specsheet.pdf similarity index 100% rename from .gitbook/assets/wipy2-specsheet.pdf rename to static/gitbook/assets/wipy2-specsheet.pdf diff --git a/.gitbook/assets/wipy2.png b/static/gitbook/assets/wipy2.png similarity index 100% rename from .gitbook/assets/wipy2.png rename to static/gitbook/assets/wipy2.png diff --git a/.gitbook/assets/wipy3-pinout.pdf b/static/gitbook/assets/wipy3-pinout.pdf similarity index 100% rename from .gitbook/assets/wipy3-pinout.pdf rename to static/gitbook/assets/wipy3-pinout.pdf diff --git a/.gitbook/assets/wipy3-pinout.png b/static/gitbook/assets/wipy3-pinout.png similarity index 100% rename from .gitbook/assets/wipy3-pinout.png rename to static/gitbook/assets/wipy3-pinout.png diff --git a/.gitbook/assets/wipy3-specsheet.pdf b/static/gitbook/assets/wipy3-specsheet.pdf similarity index 100% rename from .gitbook/assets/wipy3-specsheet.pdf rename to static/gitbook/assets/wipy3-specsheet.pdf diff --git a/.gitbook/assets/wipy3.png b/static/gitbook/assets/wipy3.png similarity index 100% rename from .gitbook/assets/wipy3.png rename to static/gitbook/assets/wipy3.png diff --git a/themes/.DS_Store b/themes/.DS_Store new file mode 100644 index 0000000..e75c9a3 Binary files /dev/null and b/themes/.DS_Store differ diff --git a/themes/doc-theme/.DS_Store b/themes/doc-theme/.DS_Store new file mode 100644 index 0000000..2a43b86 Binary files /dev/null and b/themes/doc-theme/.DS_Store differ diff --git a/themes/doc-theme/LICENSE b/themes/doc-theme/LICENSE new file mode 100644 index 0000000..46fe619 --- /dev/null +++ b/themes/doc-theme/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 YOUR_NAME_HERE + +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/themes/doc-theme/archetypes/default.md b/themes/doc-theme/archetypes/default.md new file mode 100644 index 0000000..ac36e06 --- /dev/null +++ b/themes/doc-theme/archetypes/default.md @@ -0,0 +1,2 @@ ++++ ++++ diff --git a/themes/doc-theme/layouts/404.html b/themes/doc-theme/layouts/404.html new file mode 100644 index 0000000..65387aa --- /dev/null +++ b/themes/doc-theme/layouts/404.html @@ -0,0 +1,7 @@ +{{ define "main"}} +
+ +
+{{ end }} diff --git a/themes/doc-theme/layouts/partials/alexia.html b/themes/doc-theme/layouts/partials/alexia.html new file mode 100644 index 0000000..4432166 --- /dev/null +++ b/themes/doc-theme/layouts/partials/alexia.html @@ -0,0 +1,17 @@ + + + + + diff --git a/themes/doc-theme/layouts/partials/article.html b/themes/doc-theme/layouts/partials/article.html new file mode 100644 index 0000000..65d71e2 --- /dev/null +++ b/themes/doc-theme/layouts/partials/article.html @@ -0,0 +1,11 @@ +{{ define "main" }} + + {{ partial "menu.html" . }} + + {{- partial "menu-contextual.html" . -}} + +
+ {{- .Content -}} +
+ +{{ end }} diff --git a/themes/doc-theme/layouts/partials/breadcrumb.html b/themes/doc-theme/layouts/partials/breadcrumb.html new file mode 100644 index 0000000..28ae432 --- /dev/null +++ b/themes/doc-theme/layouts/partials/breadcrumb.html @@ -0,0 +1,3 @@ +

+ {{ partial "breadcrumb_recursive.html" (dict "menu" .Site.Menus.main "page" . ) }} +

diff --git a/themes/doc-theme/layouts/partials/breadcrumb_recursive.html b/themes/doc-theme/layouts/partials/breadcrumb_recursive.html new file mode 100644 index 0000000..1c19c68 --- /dev/null +++ b/themes/doc-theme/layouts/partials/breadcrumb_recursive.html @@ -0,0 +1,39 @@ +{{ $page := .page }} + {{ $prev := . }} + +{{ range .menu }} + + {{ $iz := eq $page.URL .URL}} + {{ $haz := in $page.URL .URL}} + + {{ $shownext := false }} + + {{ if .HasChildren }} + {{ if or $iz $haz }} + + {{ .Pre }} {{ .Name }} + {{ if not $iz }}>{{ end }} + {{ end }} + {{ partial "breadcrumb_recursive.html" (dict "menu" .Children "page" $page) }} + {{ if or $iz $haz }} + + + {{ end }} + + {{ else }} + {{ if or $iz $haz }} + + {{ .Name }} + + {{ end }} + + {{ if $iz }} + {{ $prev.URL }} + + {{ end }} + + {{ $prev := . }} + {{ end }} + +{{ end }} + diff --git a/themes/doc-theme/layouts/partials/footer.html b/themes/doc-theme/layouts/partials/footer.html new file mode 100644 index 0000000..7211525 --- /dev/null +++ b/themes/doc-theme/layouts/partials/footer.html @@ -0,0 +1,5 @@ + +
+ Copyright © 2019, Pycom Limited. +
+
diff --git a/themes/doc-theme/layouts/partials/google_analitycs.html b/themes/doc-theme/layouts/partials/google_analitycs.html new file mode 100644 index 0000000..d8019fa --- /dev/null +++ b/themes/doc-theme/layouts/partials/google_analitycs.html @@ -0,0 +1,9 @@ + diff --git a/themes/doc-theme/layouts/partials/head.html b/themes/doc-theme/layouts/partials/head.html new file mode 100644 index 0000000..244870f --- /dev/null +++ b/themes/doc-theme/layouts/partials/head.html @@ -0,0 +1,2 @@ +{{ if .Title }}{{ .Title }} | {{ .Site.Title }}{{ else }}{{ .Site.Title }}{{ end }} + diff --git a/themes/doc-theme/layouts/partials/menu-contextual.html b/themes/doc-theme/layouts/partials/menu-contextual.html new file mode 100644 index 0000000..e800516 --- /dev/null +++ b/themes/doc-theme/layouts/partials/menu-contextual.html @@ -0,0 +1,27 @@ +{{/* + Use Hugo's native Table of contents feature. + https://gohugo.io/content-management/toc/ +*/}} + +{{- if gt .WordCount 400 -}} + + + + + + What's in this document + + more_vert + + + + + + {{ .TableOfContents | replaceRE "
  • " "
  • " | safeHTML }} + + + + + + +{{ end }} diff --git a/themes/doc-theme/layouts/partials/menu.html b/themes/doc-theme/layouts/partials/menu.html new file mode 100644 index 0000000..7a736f9 --- /dev/null +++ b/themes/doc-theme/layouts/partials/menu.html @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + +
    + + + + + + +

    + home Table of content +

    + + {{ partial "menu_recursive.html" (dict "menu" .Site.Menus.main "page" . ) }} + + + +

    +

     

    +

     

    +
    +
    diff --git a/themes/doc-theme/layouts/partials/menu_recursive.html b/themes/doc-theme/layouts/partials/menu_recursive.html new file mode 100644 index 0000000..93d68e2 --- /dev/null +++ b/themes/doc-theme/layouts/partials/menu_recursive.html @@ -0,0 +1,32 @@ +{{ $page := .page }} +{{ $pURL := .page.URL }} +
      +{{ range .menu }} + {{ $iz := eq $page.URL .URL}} + {{ $haz := in $page.URL .URL}} + {{ $phaz := $page.HasMenuCurrent "main" .}} + {{ $subheading := ne .Parent "" }} + {{ if .HasChildren }} + + {{ if true }} +
    • + {{ .Pre }} {{ .Name }} + {{ end }} + {{ if or $iz $haz $phaz }} + {{ partial "menu_recursive.html" (dict "menu" .Children "page" $page) }} + {{ end }} + + {{ if or $iz $haz $phaz}} +
    • + {{ end }} + + {{ else }} + + +
    • + {{ .Name }} +
    • + + {{ end }} +{{ end }} +
    diff --git a/themes/doc-theme/layouts/partials/prev_next.html b/themes/doc-theme/layouts/partials/prev_next.html new file mode 100644 index 0000000..d832d8a --- /dev/null +++ b/themes/doc-theme/layouts/partials/prev_next.html @@ -0,0 +1,100 @@ +{{ $page := .page }} +{{ $prev := false }} +{{ $prevtmp := false }} +{{ $got := false }} +{{ $current := false }} + +{{ range .menu }} + {{- /** *************************************************************** */ -}} + {{ $iz := eq $page.URL .URL}} + {{ if $got }} + {{ partial "prev_next_btn.html" (dict "context" . "prev" $prev "next" .URL) }} + {{ end }} + {{ if $iz }} + {{ $current = . }} + {{ $got = true }} + {{ $prev = $prevtmp }} + {{ else }} + {{ $got = false }} + {{ end }} + {{ $prevtmp = . }} + {{- /** *************************************************************** */ -}} + + {{ if .HasChildren }} + {{ range .Children }} + {{- /** *************************************************************** */ -}} + {{ $iz := eq $page.URL .URL}} + {{ if $got }} + + {{ partial "prev_next_btn.html" (dict "context" . "prev" $prev "next" .URL) }} + + {{ end }} + {{ if $iz }} + {{ $current = . }} + {{ $got = true }} + {{ $prev = $prevtmp }} + {{ else }} + {{ $got = false }} + {{ end }} + {{ $prevtmp = . }} + {{- /** *************************************************************** */ -}} + + {{ if .HasChildren }} + {{ range .Children }} + {{- /** *************************************************************** */ -}} + {{ $iz := eq $page.URL .URL}} + {{ if $got }} + {{ partial "prev_next_btn.html" (dict "context" . "prev" $prev "next" .URL) }} + {{ end }} + {{ if $iz }} + {{ $current = . }} + {{ $got = true }} + {{ $prev = $prevtmp }} + {{ else }} + {{ $got = false }} + {{ end }} + {{ $prevtmp = . }} + + {{- /** *************************************************************** */ -}} + + {{ if .HasChildren }} + {{ range .Children }} + {{- /** *************************************************************** */ -}} + {{ $iz := eq $page.URL .URL}} + {{ if $got }} + {{ partial "prev_next_btn.html" (dict "context" . "prev" $prev "next" .URL) }} + {{ end }} + {{ if $iz }} + {{ $current = . }} + {{ $got = true }} + {{ $prev = $prevtmp }} + {{ else }} + {{ $got = false }} + {{ end }} + {{ $prevtmp = . }} + {{ if .HasChildren }} + {{ range .Children }} + {{- /** *************************************************************** */ -}} + {{ $iz := eq $page.URL .URL}} + {{ if $got }} + {{ partial "prev_next_btn.html" (dict "context" . "prev" $prev "next" .URL) }} + {{ end }} + {{ if $iz }} + {{ $current = . }} + {{ $got = true }} + {{ $prev = $prevtmp }} + {{ else }} + {{ $got = false }} + {{ end }} + {{ $prevtmp = . }} + {{- /** *************************************************************** */ -}} + {{ end }} + {{ end }} + {{- /** *************************************************************** */ -}} + {{ end }} + {{ end }} + {{ end }} + {{ end }} + {{ end }} + {{ end }} +{{ end }} diff --git a/themes/doc-theme/layouts/partials/prev_next_btn.html b/themes/doc-theme/layouts/partials/prev_next_btn.html new file mode 100644 index 0000000..f842a0b --- /dev/null +++ b/themes/doc-theme/layouts/partials/prev_next_btn.html @@ -0,0 +1,10 @@ + + + {{ if $.prev }} + Previous + {{ end }} + + + Next + + diff --git a/themes/doc-theme/layouts/partials/summary.html b/themes/doc-theme/layouts/partials/summary.html new file mode 100644 index 0000000..7e73dfc --- /dev/null +++ b/themes/doc-theme/layouts/partials/summary.html @@ -0,0 +1,15 @@ +{{ define "main" }} +
    +
    + {{- .Content -}} +
    +
    + {{ range .Paginator.Pages }} +
    + {{- partial "summary.html" . -}} +
    + {{ end }} +
    + {{- template "_internal/pagination.html" . -}} +
    +{{ end }} diff --git a/themes/doc-theme/layouts/partials/toolbar.html b/themes/doc-theme/layouts/partials/toolbar.html new file mode 100644 index 0000000..31faadb --- /dev/null +++ b/themes/doc-theme/layouts/partials/toolbar.html @@ -0,0 +1,33 @@ + + + + + + + + toc + + + {{ .Page.Title }} + + + + +
    + +
    + + {{- if gt .WordCount 400 -}} + + more_vert + + {{ end }} +
    diff --git a/themes/doc-theme/static/css/doc-theme.css b/themes/doc-theme/static/css/doc-theme.css new file mode 100644 index 0000000..dcf8559 --- /dev/null +++ b/themes/doc-theme/static/css/doc-theme.css @@ -0,0 +1,299 @@ + +html { + font-size: 105%; + +} + + +.menu-contextual { + width: 320px; + right: 0px; + top: 0px; + z-index: 3; + position: fixed; +} + +li.lefttree, li.righttree { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +aside { + padding-bottom: 72px; +} + +nav#TableOfContents { + margin-left: -48px; +} + +h1, h2, h3, h4 { + color: #1E1E3C; + letter-spacing: 0.1em; + opacity: 0.9; +} + + +h1 { + font-family: 'Beba',Helvetica,Arial,Lucida,sans-serif; +} + +h1, h2, h3, h4 { + margin-top: 24px; + margin-bottom: 12px; +} + + +h2 > a { + color: #1E1E3C; +} + +@font-face { +font-family: "Beba"; +src: url("/fonts/BebasNeue-Regular.eot"); +src: url("/fonts/BebasNeue-Regular.woff") format("woff"), +url("/fonts/BebasNeue-Regular.otf") format("opentype"); +} +/* 'Beba',Helvetica,Arial,Lucida,sans-serif; */ + +.mono { + font-family: monospace!important; +} + +.beba { + font-family: 'Beba',Helvetica,Arial,Lucida,sans-serif; + letter-spacing: 0.1em; +} + + +.application { + line-height: 1.7; +} + +.application { + /* font-family: 'Beba',Helvetica,Arial,Lucida,sans-serif; */ + font-family:'Space Mono',monospace; +} + +p { + text-align: justify; +} + +.bread { + font-family: 'Beba',Helvetica,Arial,Lucida,sans-serif; + letter-spacing: 0.1em; + color: #7800FF; +} + +.theme--dark.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border { + background-color: transparent; +} +/** this gives correct offset when link to anchors */ +*[id]:before { + display: block; + content: " "; + margin-top: -75px; + height: 75px; + visibility: hidden; +} + + + +a, li.lefttree > a { + text-decoration: none; +} + +a, li.righttree > a { + text-decoration: none; +} + +a { + text-decoration: underline; + padding: 5px; +} + +a:hover { + background-color: yellow; +} + +a { + color: #1E1E3C!important; +} + +li > a { + color: #1E1E3C; + font-weight: 500; + line-height: 1.60; +} + +li > a.hot { + color: #7800FF; + text-decoration: underline; + background-color: yellow; + padding: 6px; +} + + + +li.lefttree { + margin-top: 6px; + margin-bottom: 6px; + +} + +li.lefttree > a { + font-family: 'Beba',Helvetica,Arial,Lucida,sans-serif; + letter-spacing: 0.1em; +} + +li.hot { + width: calc(100% + 22px); + margin-right: 0px; + padding-right: 0px; + transform: translate(-22px); + padding-left: 22px; +} + + + +ul.lefttree { + padding-right: 0px; + margin-right: 0px; +} + +.v-toolbar__content, .v-toolbar__extension { + padding:0!important; +} + +.danger-alert { + background-color: #FF450A !important; + margin-top: 24px; + margin-bottom: 24px; +} + +.warning-alert { + background-color: #FF450A !important; + margin-top: 24px; + margin-bottom: 24px; +} + + +.info-alert { + background-color: #00FFFF !important; + margin-top: 24px; + margin-bottom: 24px; +} + +.theme--light.v-toolbar { + color: #171730!important; +} + +nav#TableOfContents { + overflow-y: scroll; + max-height: 640px; +} + +img { + max-width: 90%; + margin-left: 5%; + padding: 18px; +} + +/* +nav#TableOfContents::-webkit-scrollbar, .fancyScroll::-webkit-scrollbar +{ + width: 10px!important; +} + +nav#TableOfContents::-webkit-scrollbar-thumb, .fancyScroll::-webkit-scrollbar-thumb +{ + border-radius: 10px!important; + background-image: -webkit-gradient(linear, + left bottom, + left top, + color-stop(0.86, rgb(255,255,255)), + color-stop(0.72, rgb(120,0,255))); +} +*/ + + + + +[v-cloak] > * { display:none } +[v-cloak]::before { + content: " "; + display: block; + position: absolute; + width: 100%; +height: 100%; +background-image: url('/logo2.svg'); +background-size: cover; +} + + + +table { + display: table; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; +} + +table tr { + background-color: #fff; + border-top: 1px solid #ccc; +} + +table td, table th { + padding: 6px 13px; + border: 1px solid #ddd; +} + +.ppurple { + color: #7800FF; +} + +.pbgpurple { + background-color: #7800FF!important; + color: white; +} + + +.navy { + color: #1E1E3C; +} + +.prev-next { + position: absolute; + bottom: 0px; + width: 100%; + margin: 0; + left: 0; +} + + +.primary { + background-color: red !important; + border-color: red !important; +} + +pre { + background-color: transparent!important; +} +pre > code { + width: 100%; + padding: 12px; + margin-top: 4px; + margin-bottom: 12px; +} + +code { + + padding: 1px; + background-color: #EEEEEE; +} + +.primary--text { + color: #7800FF; +} diff --git a/themes/doc-theme/static/favicon.ico b/themes/doc-theme/static/favicon.ico new file mode 100644 index 0000000..54ff25b Binary files /dev/null and b/themes/doc-theme/static/favicon.ico differ diff --git a/themes/doc-theme/static/fonts/BebasNeue-Regular.eot b/themes/doc-theme/static/fonts/BebasNeue-Regular.eot new file mode 100644 index 0000000..63df3a7 Binary files /dev/null and b/themes/doc-theme/static/fonts/BebasNeue-Regular.eot differ diff --git a/themes/doc-theme/static/fonts/BebasNeue-Regular.otf b/themes/doc-theme/static/fonts/BebasNeue-Regular.otf new file mode 100644 index 0000000..4f5676c Binary files /dev/null and b/themes/doc-theme/static/fonts/BebasNeue-Regular.otf differ diff --git a/themes/doc-theme/static/fonts/BebasNeue-Regular.ttf b/themes/doc-theme/static/fonts/BebasNeue-Regular.ttf new file mode 100644 index 0000000..76e22b8 Binary files /dev/null and b/themes/doc-theme/static/fonts/BebasNeue-Regular.ttf differ diff --git a/themes/doc-theme/static/fonts/BebasNeue-Regular.woff b/themes/doc-theme/static/fonts/BebasNeue-Regular.woff new file mode 100644 index 0000000..457f916 Binary files /dev/null and b/themes/doc-theme/static/fonts/BebasNeue-Regular.woff differ diff --git a/themes/doc-theme/static/logo.svg b/themes/doc-theme/static/logo.svg new file mode 100644 index 0000000..b777e6b --- /dev/null +++ b/themes/doc-theme/static/logo.svg @@ -0,0 +1 @@ +pycom_logo_lockup_white_rgb \ No newline at end of file diff --git a/themes/doc-theme/static/logo2.svg b/themes/doc-theme/static/logo2.svg new file mode 100644 index 0000000..c9da64b --- /dev/null +++ b/themes/doc-theme/static/logo2.svg @@ -0,0 +1,110 @@ + + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/doc-theme/theme.toml b/themes/doc-theme/theme.toml new file mode 100644 index 0000000..0255a54 --- /dev/null +++ b/themes/doc-theme/theme.toml @@ -0,0 +1,21 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "Doc Theme" +license = "MIT" +licenselink = "https://github.com/yourname/yourtheme/blob/master/LICENSE" +description = "" +homepage = "http://example.com/" +tags = [] +features = [] +min_version = "0.41" + +[author] + name = "" + homepage = "" + +# If porting an existing theme +[original] + name = "" + homepage = "" + repo = "" diff --git a/tutorials/pytrack.md b/tutorials/pytrack.md deleted file mode 100644 index 42240b9..0000000 --- a/tutorials/pytrack.md +++ /dev/null @@ -1,6 +0,0 @@ -# Pytrack Examples - -Both the Pysense and Pytrack use the same accelerometer. Please see the [Pysense Examples](pysense.md) to see how to use the accelerometer. - -{% page-ref page="pysense.md" %} -