diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3483190..06f15bb0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: push: branches: - - master + - linco-work pull_request: jobs: @@ -18,18 +18,13 @@ jobs: build_platform_io: name: Build using PlatformIO - uses: OpenEVSE/open_evse/.github/workflows/build_platformio.yml@master - - build_arduino: - name: Build using Arduino - uses: OpenEVSE/open_evse/.github/workflows/build_arduino.yml@master + uses: OpenEVSE/open_evse/.github/workflows/build_platformio.yml@linco-work release: name: Create pre-release needs: - build_platform_io - - build_arduino - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/linco-work' - uses: OpenEVSE/open_evse/.github/workflows/release.yml@master + uses: OpenEVSE/open_evse/.github/workflows/release.yml@linco-work diff --git a/.github/workflows/build_arduino.yml b/.github/workflows/build_arduino.yml index c1a28e88..80329cf9 100644 --- a/.github/workflows/build_arduino.yml +++ b/.github/workflows/build_arduino.yml @@ -27,14 +27,14 @@ jobs: steps: - name: Cache Arduino - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ~/.arduino15 key: ${{ runner.os }}-${{ matrix.name }}-arduino-15-${{ hashFiles('**/packages.txt') }} restore-keys: | ${{ runner.os }}-${{ matrix.name }}-arduino-15- - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 - name: Setup Arduino CLI uses: arduino/setup-arduino-cli@v1 @@ -70,7 +70,7 @@ jobs: source ci/info_common.sh info.json - name: Upload output to GitHub - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ matrix.name }} path: | diff --git a/.github/workflows/build_platformio.yml b/.github/workflows/build_platformio.yml index e7a824a0..53b95723 100644 --- a/.github/workflows/build_platformio.yml +++ b/.github/workflows/build_platformio.yml @@ -12,30 +12,27 @@ jobs: fail-fast: false matrix: include: - - env: openevse_1-8-3 + - env: m328p_autodetect python: 3.x - platformio: 6.1.5 - - env: openevse_latest + platformio: 6.1.5 + arch: avr + artifact: firmware.hex + - env: m328p_RTC_BTN_LCD python: 3.x - platformio: 6.1.5 - - env: openevse + platformio: 6.1.5 + arch: avr + artifact: firmware.hex + - env: samd python: 3.x - platformio: 6.1.5 - - env: openevse_eu - python: 3.x - platformio: 6.1.5 - - env: openevse_v6 - python: 3.x - platformio: 6.1.5 - - env: emonevse - python: 3.x - platformio: 6.1.5 + platformio: 6.1.5 + arch: samd + artifact: firmware.bin steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 - name: Cache pip - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ~/.cache/pip key: ${{ runner.os }}-${{ matrix.env }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -43,13 +40,13 @@ jobs: ${{ runner.os }}-${{ matrix.env }}-pip- - name: Cache PlatformIO - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ~/.platformio key: ${{ runner.os }}-${{ matrix.env }}-${{ hashFiles('**/lockfiles') }} - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v6 with: python-version: '${{ matrix.python }}' @@ -61,7 +58,8 @@ jobs: - name: Run PlatformIO run: pio run -e ${{ matrix.env }} - - name: Get compiler and output info + - name: Get compiler and output info (AVR) + if: matrix.arch == 'avr' run: | NAME=${{ matrix.env }} BUILT_TOOL="Platform IO" @@ -72,10 +70,23 @@ jobs: source ci/info_common.sh info.json + - name: Get build info (SAMD) + if: matrix.arch == 'samd' + run: | + BIN_SIZE=$(ls -l .pio/build/${{ matrix.env }}/firmware.bin | awk '{ print $5 }') + cat <info.json + { + "name": "${{ matrix.env }}", + "built_tool": "Platform IO", + "arch": "samd", + "bin_size": $BIN_SIZE + } + EOF + - name: Upload output to GitHub - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ matrix.env }} path: | - .pio/build/${{ matrix.env }}/firmware.hex + .pio/build/${{ matrix.env }}/${{ matrix.artifact }} info.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 71a902b2..233d0454 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,17 +13,19 @@ jobs: sudo apt-get install jq -y - name: Download the built assets - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: path: artifacts - name: Rename images to something more sensible run: | - find artifacts -name '*.hex' | while read -r image; do - dir=$(dirname "${image}") - board=$(basename "${dir}") - echo mv "$image" "$board.hex" - mv "$image" "$board.hex" + for ext in hex bin; do + find artifacts -name "*.$ext" | while read -r image; do + dir=$(dirname "${image}") + board=$(basename "${dir}") + echo mv "$image" "$board.$ext" + mv "$image" "$board.$ext" + done done jq -s . $(find -name info.json) > build_info.json jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' build_info.json > build_info.csv @@ -37,5 +39,6 @@ jobs: title: "Development Build" files: | *.hex + *.bin build_info.json build_info.csv diff --git a/.github/workflows/release_validation.yaml b/.github/workflows/release_validation.yaml index e7edc112..4c1d8acb 100644 --- a/.github/workflows/release_validation.yaml +++ b/.github/workflows/release_validation.yaml @@ -15,7 +15,7 @@ jobs: steps: ### Check the version number in the code matches the tag number - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 - name: Retrieve the version number(s) run: | diff --git a/.gitignore b/.gitignore index 1de75d79..a565f7a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.pio/** +kicad/** download/** archive/** genrapi/** diff --git a/README.md b/README.md index ff2bde14..5f2d87ce 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,20 @@ # OpenEVSE -Firmware for OpenEVSE controller used in OpenEVSE Charging Stations sold in the USA, and OpenEnergyMonitor EmonEVSE units sold in (UK/EU). +Firmware for OpenEVSE controller used in OpenEVSE Charging Stations. - OpenEVSE: -- EmonEVSE: -Based on OpenEVSE: Open Source Hardware J1772 Electric Vehicle Supply Equipment - -## USA - -TODO: add notes about USA OpenEVSE - -## UK/EU - -- Disable `AUTOSVCLEVEL` (autodetection is designed for split-phase) -- Charging level default to `L2` -- Set `MAX_CURRENT_CAPACITY_L2 32` (limit for single-phase charging in UK/EU) -- Add '.EU' to version number -- Enable LCD Redraw every couple of min (required for EMC/CE) -### EmonEVSE - -EmonEVSE (non-tethered type-2 EVSE unit) +Based on OpenEVSE: Open Source Hardware J1772 Electric Vehicle Supply Equipment -- `PP_AUTO_AMPACITY` enabled to set max current based on non-tethered cable connected -- Three-phase option with `THREEPHASE` enabled to calculate three-phase energy ( Unneeded with ESP32_WiFi firmware >= 4.2 ## API Documentation - WIFI API: -- RAPI API: -## Resources -- [OpenEnergyMonitor OpenEVSE Setup Guide](https://guide.openenergymonitor.org/integrations/openevse) -- [OpenEnergyMonitor OpenEVSE Shop](https://shop.openenergymonitor.com/ev-charging/) +## Resources -- [OpenEVSE Controller Datasheet](https://github.com/OpenEVSE/OpenEVSE_PLUS/blob/master/OpenEVSE_PLUS_v5/OpenEVSE_Plus_v5.pdf) - [OpenEVSE Controller Hardware Repo](https://github.com/OpenEVSE/OpenEVSE_PLUS) - [OpenEVSE Project Homepage](https://openevse.com) @@ -53,7 +31,7 @@ NOTES: `$ avrdude -p atmega328p -B6 -c usbasp -P usb -e -U flash:w:firmware.hex` -ISP programmer required e.g [USBASP](https://www.amazon.co.uk/Hobby-Components-USBASP-Programmer-Adapter/dp/B06XYV162N) +ISP programmer required ### Set AVR fuses @@ -65,7 +43,7 @@ If writing eFuse fails ISBasp may need a [firmware update](https://www.vishnumai *** -Tip Jar: I developed/maintain this firmware on a volunteer basis. Any donation, no matter how small, is greatly appreciated. +Tip Jar: Lincomatic developed/maintain this firmware on a volunteer basis. Any donation, no matter how small, is greatly appreciated. [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/lincomatic) diff --git a/arduino/1.6.15/boards.local.txt b/arduino/1.6.15/boards.local.txt deleted file mode 100644 index 586837fa..00000000 --- a/arduino/1.6.15/boards.local.txt +++ /dev/null @@ -1,62 +0,0 @@ -##### -# OpenEVSE with hardware programmer -##### -openevse.name=[Programmer]OpenEVSE -openevse.upload.tool=avrdude -openevse.upload.maximum_size=32768 -openevse.upload.maximum_data_size=2048 -openevse.build.mcu=atmega328p -openevse.build.f_cpu=16000000L -openevse.build.board=AVR_DUEMILANOVE -openevse.build.core=arduino -openevse.build.variant=standard -openevse.menu.cpu.atmega328=ATmega328 - -##### -# OpenEVSE with optiboot -##### -openevsebl.name=[optiboot]OpenEVSE - -openevsebl.upload.tool=avrdude -openevsebl.upload.protocol=arduino -openevsebl.upload.maximum_size=32256 -openevsebl.upload.maximum_data_size=2048 -openevsebl.upload.speed=115200 - -openevsebl.bootloader.tool=avrdude -openevsebl.bootloader.low_fuses=0xFF -openevsebl.bootloader.high_fuses=0xDE -openevsebl.bootloader.extended_fuses=0x04 -openevsebl.bootloader.unlock_bits=0x3F -openevsebl.bootloader.lock_bits=0x0F -openevsebl.bootloader.file=optiboot/optiboot_atmega328.hex - -openevsebl.build.mcu=atmega328p -openevsebl.build.f_cpu=16000000L -openevsebl.build.board=AVR_DUEMILANOVE -openevsebl.build.core=arduino -openevsebl.build.variant=standard - -atm328.name=[Programmer]ATmega328 -atm328.upload.tool=avrdude -atm328.upload.maximum_size=32768 -atm328.upload.maximum_data_size=2048 -atm328.build.mcu=atmega328p -atm328.build.f_cpu=16000000L -atm328.build.board=AVR_DUEMILANOVE -atm328.build.core=arduino -atm328.build.variant=standard -atm328.menu.cpu.atmega328=ATmega328 - -atm168.name=[Programmer]ATmega168 -atm168.upload.tool=avrdude -atm168.upload.maximum_size=16384 -atm168.upload.maximum_data_size=1024 -atm168.build.mcu=atmega168 -atm168.build.f_cpu=16000000L -atm168.build.board=AVR_DUEMILANOVE -atm168.build.core=arduino -atm168.build.variant=standard -atm168.menu.cpu.atmega168=ATmega168 - - diff --git a/arduino/1.6.15/programmers.txt b/arduino/1.6.15/programmers.txt deleted file mode 100644 index 4d716524..00000000 --- a/arduino/1.6.15/programmers.txt +++ /dev/null @@ -1,78 +0,0 @@ -avrisp.name=AVR ISP -avrisp.communication=serial -avrisp.protocol=stk500v1 -avrisp.program.protocol=stk500v1 -avrisp.program.tool=avrdude -avrisp.program.extra_params=-P{serial.port} - -avrispmkii.name=AVRISP mkII -avrispmkii.communication=usb -avrispmkii.protocol=stk500v2 -avrispmkii.program.protocol=stk500v2 -avrispmkii.program.tool=avrdude -avrispmkii.program.extra_params=-Pusb - -usbtinyisp.name=USBtinyISP -usbtinyisp.protocol=usbtiny -usbtinyisp.program.tool=avrdude -usbtinyisp.program.extra_params=-B1 - -arduinoisp.name=ArduinoISP -arduinoisp.protocol=arduinoisp -arduinoisp.program.tool=avrdude -arduinoisp.program.extra_params= - -usbasp.name=USBasp -usbasp.communication=usb -usbasp.protocol=usbasp -usbasp.program.protocol=usbasp -usbasp.program.tool=avrdude -usbasp.program.extra_params=-Pusb -B0.5 - -parallel.name=Parallel Programmer -parallel.protocol=dapa -parallel.force=true -# parallel.delay=200 -parallel.program.tool=avrdude -parallel.program.extra_params=-F - -arduinoasisp.name=Arduino as ISP -arduinoasisp.communication=serial -arduinoasisp.protocol=stk500v1 -arduinoasisp.speed=19200 -arduinoasisp.program.protocol=stk500v1 -arduinoasisp.program.speed=19200 -arduinoasisp.program.tool=avrdude -arduinoasisp.program.extra_params=-P{serial.port} -b{program.speed} - -usbGemma.name=Arduino Gemma -usbGemma.protocol=arduinogemma -usbGemma.program.tool=avrdude -usbGemma.program.extra_params= -usbGemma.config.path={runtime.platform.path}/bootloaders/gemma/avrdude.conf - -# STK500 firmware version v1 and v2 use different serial protocols. -# Using the 'stk500' protocol tells avrdude to try and autodetect the -# firmware version. If this leads to problems, we might need to add -# stk500v1 and stk500v2 entries to allow explicitely selecting the -# firmware version. -stk500.name=Atmel STK500 development board -stk500.communication=serial -stk500.protocol=stk500 -stk500.program.protocol=stk500 -stk500.program.tool=avrdude -stk500.program.extra_params=-P{serial.port} - -## Notes about Dangerous Prototypes Bus Pirate as ISP -## Bus Pirate V3 need Firmware v5.10 or later -## Bus Pirate V4 need Firmware v6.3-r2151 or later -## Could happen that BP does not have enough current to power an Arduino board -## through the ICSP connector. In this case disconnect the +Vcc from ICSP connector -## and power Arduino board in the normal way. -buspirate.name=BusPirate as ISP -buspirate.communication=serial -buspirate.protocol=buspirate -buspirate.program.protocol=buspirate -buspirate.program.tool=avrdude -buspirate.program.extra_params=-P{serial.port} - diff --git a/arduino/1.6.15/readme.txt b/arduino/1.6.15/readme.txt deleted file mode 100644 index cb0a05d1..00000000 --- a/arduino/1.6.15/readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -drop boards.local.txt and programmers.txt into /AppData/Local/Arduino15/packages/hardware/avr/1.6.15. --> overwrites existing programmers.txt diff --git a/arduino/boards.local.txt b/arduino/boards.local.txt deleted file mode 100644 index 598e4757..00000000 --- a/arduino/boards.local.txt +++ /dev/null @@ -1,39 +0,0 @@ -##### -# OpenEVSE with hardware programmer -##### -openevse.name=[Programmer]OpenEVSE -openevse.upload.tool=avrdude -openevse.upload.maximum_size=32768 -openevse.upload.maximum_data_size=2048 -openevse.build.mcu=atmega328p -openevse.build.f_cpu=16000000L -openevse.build.board=AVR_DUEMILANOVE -openevse.build.core=arduino -openevse.build.variant=standard -openevse.menu.cpu.atmega328=ATmega328 - -##### -# OpenEVSE with optiboot -##### -openevsebl.name=[optiboot]OpenEVSE - -openevsebl.upload.tool=avrdude -openevsebl.upload.protocol=arduino -openevsebl.upload.maximum_size=32256 -openevsebl.upload.maximum_data_size=2048 -openevsebl.upload.speed=115200 - -openevsebl.bootloader.tool=avrdude -openevsebl.bootloader.low_fuses=0xFF -openevsebl.bootloader.high_fuses=0xDE -openevsebl.bootloader.extended_fuses=0x04 -openevsebl.bootloader.unlock_bits=0x3F -openevsebl.bootloader.lock_bits=0x0F -openevsebl.bootloader.file=optiboot/optiboot_atmega328.hex - -openevsebl.build.mcu=atmega328p -openevsebl.build.f_cpu=16000000L -openevsebl.build.board=AVR_DUEMILANOVE -openevsebl.build.core=arduino -openevsebl.build.variant=standard - diff --git a/arduino/boards.txt b/arduino/boards.txt deleted file mode 100644 index 79c2b70c..00000000 --- a/arduino/boards.txt +++ /dev/null @@ -1,24 +0,0 @@ - -############################################################## -## OpenEVSE with Programmer selected from Tools->Programmer -## --------------------------------------------- -openevse.name=[Programmer]OpenEVSE -openevse.upload.tool=arduino:avrdude -openevse.upload.protocol=arduino -openevse.upload.maximum_size=32768 -openevse.upload.maximum_data_size=2048 - -openevse.bootloader.tool=avrdude -openevse.bootloader.low_fuses=0xFF -openevse.bootloader.high_fuses=0xDF -openevse.bootloader.extended_fuses=0x05 -openevse.bootloader.unlock_bits=0x3F -openevse.bootloader.lock_bits=0x0F -openevse.bootloader.file=optiboot/optiboot_atmega328.hex - -openevse.build.mcu=atmega328p -openevse.build.f_cpu=16000000L -openevse.build.board=AVR_DUEMILANOVE -openevse.build.core=arduino:arduino -openevse.build.variant=arduino:standard -openevse.menu.cpu.atmega328=ATmega328 diff --git a/arduino/boards.txt.arduino0022 b/arduino/boards.txt.arduino0022 deleted file mode 100644 index 842a81ef..00000000 --- a/arduino/boards.txt.arduino0022 +++ /dev/null @@ -1,383 +0,0 @@ -############################################################ -evse.name=[USBasp]OpenEVSE -evse.upload.using=usbasp -evse.upload.maximum_size=32768 -evse.bootloader.low_fuses=0xff -evse.bootloader.high_fuses=0xdf -evse.bootloader.extended_fuses=0x04 -evse.bootloader.unlock_bits=0x3F -evse.bootloader.lock_bits=0x0F -evse.build.mcu=atmega328p -evse.build.f_cpu=16000000L -evse.build.core=arduino -############################################################## - -usbtiny168.name=[usbtinyisp]ATmega168 - -usbtiny168.upload.using=usbtinyisp -usbtiny168.upload.maximum_size=16384 - -usbtiny168.build.mcu=atmega168 -usbtiny168.build.f_cpu=16000000L -usbtiny168.build.core=arduino - -############################################################## - -usbtiny328.name=[usbtinyisp]ATmega328 - -usbtiny328.upload.using=usbtinyisp -usbtiny328.upload.maximum_size=32768 - -usbtiny328.build.mcu=atmega328p -usbtiny328.build.f_cpu=16000000L -usbtiny328.build.core=arduino - -############################################################## - -USBasp328.name=[USBasp]ATmega328 - -USBasp328.upload.using=usbasp -USBasp328.upload.maximum_size=32768 - -USBasp328.build.mcu=atmega328p -USBasp328.build.f_cpu=16000000L -USBasp328.build.core=arduino - -############################################################## - -uno.name=Arduino Uno -uno.upload.protocol=stk500 -uno.upload.maximum_size=32256 -uno.upload.speed=115200 -uno.bootloader.low_fuses=0xff -uno.bootloader.high_fuses=0xde -uno.bootloader.extended_fuses=0x05 -uno.bootloader.path=optiboot -uno.bootloader.file=optiboot_atmega328.hex -uno.bootloader.unlock_bits=0x3F -uno.bootloader.lock_bits=0x0F -uno.build.mcu=atmega328p -uno.build.f_cpu=16000000L -uno.build.core=arduino - -############################################################## - -atmega328.name=Arduino Duemilanove or Nano w/ ATmega328 - -atmega328.upload.protocol=stk500 -atmega328.upload.maximum_size=30720 -atmega328.upload.speed=57600 - -atmega328.bootloader.low_fuses=0xFF -atmega328.bootloader.high_fuses=0xDA -atmega328.bootloader.extended_fuses=0x05 -atmega328.bootloader.path=atmega -atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex -atmega328.bootloader.unlock_bits=0x3F -atmega328.bootloader.lock_bits=0x0F - -atmega328.build.mcu=atmega328p -atmega328.build.f_cpu=16000000L -atmega328.build.core=arduino - -############################################################## - -diecimila.name=Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 - -diecimila.upload.protocol=stk500 -diecimila.upload.maximum_size=14336 -diecimila.upload.speed=19200 - -diecimila.bootloader.low_fuses=0xff -diecimila.bootloader.high_fuses=0xdd -diecimila.bootloader.extended_fuses=0x00 -diecimila.bootloader.path=atmega -diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex -diecimila.bootloader.unlock_bits=0x3F -diecimila.bootloader.lock_bits=0x0F - -diecimila.build.mcu=atmega168 -diecimila.build.f_cpu=16000000L -diecimila.build.core=arduino - -############################################################## - -mega2560.name=Arduino Mega 2560 - -mega2560.upload.protocol=stk500v2 -mega2560.upload.maximum_size=258048 -mega2560.upload.speed=115200 - -mega2560.bootloader.low_fuses=0xFF -mega2560.bootloader.high_fuses=0xD8 -mega2560.bootloader.extended_fuses=0xFD -mega2560.bootloader.path=stk500v2 -mega2560.bootloader.file=stk500boot_v2_mega2560.hex -mega2560.bootloader.unlock_bits=0x3F -mega2560.bootloader.lock_bits=0x0F - -mega2560.build.mcu=atmega2560 -mega2560.build.f_cpu=16000000L -mega2560.build.core=arduino - -############################################################## - -mega.name=Arduino Mega (ATmega1280) - -mega.upload.protocol=stk500 -mega.upload.maximum_size=126976 -mega.upload.speed=57600 - -mega.bootloader.low_fuses=0xFF -mega.bootloader.high_fuses=0xDA -mega.bootloader.extended_fuses=0xF5 -mega.bootloader.path=atmega -mega.bootloader.file=ATmegaBOOT_168_atmega1280.hex -mega.bootloader.unlock_bits=0x3F -mega.bootloader.lock_bits=0x0F - -mega.build.mcu=atmega1280 -mega.build.f_cpu=16000000L -mega.build.core=arduino - -############################################################## - -mini.name=Arduino Mini - -mini.upload.protocol=stk500 -mini.upload.maximum_size=14336 -mini.upload.speed=19200 - -mini.bootloader.low_fuses=0xff -mini.bootloader.high_fuses=0xdd -mini.bootloader.extended_fuses=0x00 -mini.bootloader.path=atmega -mini.bootloader.file=ATmegaBOOT_168_ng.hex -mini.bootloader.unlock_bits=0x3F -mini.bootloader.lock_bits=0x0F - -mini.build.mcu=atmega168 -mini.build.f_cpu=16000000L -mini.build.core=arduino - -############################################################## - -fio.name=Arduino Fio - -fio.upload.protocol=stk500 -fio.upload.maximum_size=30720 -fio.upload.speed=57600 - -fio.bootloader.low_fuses=0xFF -fio.bootloader.high_fuses=0xDA -fio.bootloader.extended_fuses=0x05 -fio.bootloader.path=arduino:atmega -fio.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex -fio.bootloader.unlock_bits=0x3F -fio.bootloader.lock_bits=0x0F - -fio.build.mcu=atmega328p -fio.build.f_cpu=8000000L -fio.build.core=arduino:arduino - -############################################################## - -bt328.name=Arduino BT w/ ATmega328 - -bt328.upload.protocol=stk500 -bt328.upload.maximum_size=28672 -bt328.upload.speed=19200 -bt328.upload.disable_flushing=true - -bt328.bootloader.low_fuses=0xff -bt328.bootloader.high_fuses=0xd8 -bt328.bootloader.extended_fuses=0x05 -bt328.bootloader.path=bt -bt328.bootloader.file=ATmegaBOOT_168_atmega328_bt.hex -bt328.bootloader.unlock_bits=0x3F -bt328.bootloader.lock_bits=0x0F - -bt328.build.mcu=atmega328p -bt328.build.f_cpu=16000000L -bt328.build.core=arduino - -############################################################## - -bt.name=Arduino BT w/ ATmega168 - -bt.upload.protocol=stk500 -bt.upload.maximum_size=14336 -bt.upload.speed=19200 -bt.upload.disable_flushing=true - -bt.bootloader.low_fuses=0xff -bt.bootloader.high_fuses=0xdd -bt.bootloader.extended_fuses=0x00 -bt.bootloader.path=bt -bt.bootloader.file=ATmegaBOOT_168.hex -bt.bootloader.unlock_bits=0x3F -bt.bootloader.lock_bits=0x0F - -bt.build.mcu=atmega168 -bt.build.f_cpu=16000000L -bt.build.core=arduino - -############################################################## - -lilypad328.name=LilyPad Arduino w/ ATmega328 - -lilypad328.upload.protocol=stk500 -lilypad328.upload.maximum_size=30720 -lilypad328.upload.speed=57600 - -lilypad328.bootloader.low_fuses=0xFF -lilypad328.bootloader.high_fuses=0xDA -lilypad328.bootloader.extended_fuses=0x05 -lilypad328.bootloader.path=atmega -lilypad328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex -lilypad328.bootloader.unlock_bits=0x3F -lilypad328.bootloader.lock_bits=0x0F - -lilypad328.build.mcu=atmega328p -lilypad328.build.f_cpu=8000000L -lilypad328.build.core=arduino - -############################################################## - -lilypad.name=LilyPad Arduino w/ ATmega168 - -lilypad.upload.protocol=stk500 -lilypad.upload.maximum_size=14336 -lilypad.upload.speed=19200 - -lilypad.bootloader.low_fuses=0xe2 -lilypad.bootloader.high_fuses=0xdd -lilypad.bootloader.extended_fuses=0x00 -lilypad.bootloader.path=lilypad -lilypad.bootloader.file=LilyPadBOOT_168.hex -lilypad.bootloader.unlock_bits=0x3F -lilypad.bootloader.lock_bits=0x0F - -lilypad.build.mcu=atmega168 -lilypad.build.f_cpu=8000000L -lilypad.build.core=arduino - -############################################################## - -pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 - -pro5v328.upload.protocol=stk500 -pro5v328.upload.maximum_size=30720 -pro5v328.upload.speed=57600 - -pro5v328.bootloader.low_fuses=0xFF -pro5v328.bootloader.high_fuses=0xDA -pro5v328.bootloader.extended_fuses=0x05 -pro5v328.bootloader.path=atmega -pro5v328.bootloader.file=ATmegaBOOT_168_atmega328.hex -pro5v328.bootloader.unlock_bits=0x3F -pro5v328.bootloader.lock_bits=0x0F - -pro5v328.build.mcu=atmega328p -pro5v328.build.f_cpu=16000000L -pro5v328.build.core=arduino - -############################################################## - -pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 - -pro5v.upload.protocol=stk500 -pro5v.upload.maximum_size=14336 -pro5v.upload.speed=19200 - -pro5v.bootloader.low_fuses=0xff -pro5v.bootloader.high_fuses=0xdd -pro5v.bootloader.extended_fuses=0x00 -pro5v.bootloader.path=atmega -pro5v.bootloader.file=ATmegaBOOT_168_diecimila.hex -pro5v.bootloader.unlock_bits=0x3F -pro5v.bootloader.lock_bits=0x0F - -pro5v.build.mcu=atmega168 -pro5v.build.f_cpu=16000000L -pro5v.build.core=arduino - -############################################################## - -pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 - -pro328.upload.protocol=stk500 -pro328.upload.maximum_size=30720 -pro328.upload.speed=57600 - -pro328.bootloader.low_fuses=0xFF -pro328.bootloader.high_fuses=0xDA -pro328.bootloader.extended_fuses=0x05 -pro328.bootloader.path=atmega -pro328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex -pro328.bootloader.unlock_bits=0x3F -pro328.bootloader.lock_bits=0x0F - -pro328.build.mcu=atmega328p -pro328.build.f_cpu=8000000L -pro328.build.core=arduino - -############################################################## - -pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 - -pro.upload.protocol=stk500 -pro.upload.maximum_size=14336 -pro.upload.speed=19200 - -pro.bootloader.low_fuses=0xc6 -pro.bootloader.high_fuses=0xdd -pro.bootloader.extended_fuses=0x00 -pro.bootloader.path=atmega -pro.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex -pro.bootloader.unlock_bits=0x3F -pro.bootloader.lock_bits=0x0F - -pro.build.mcu=atmega168 -pro.build.f_cpu=8000000L -pro.build.core=arduino - -############################################################## - -atmega168.name=Arduino NG or older w/ ATmega168 - -atmega168.upload.protocol=stk500 -atmega168.upload.maximum_size=14336 -atmega168.upload.speed=19200 - -atmega168.bootloader.low_fuses=0xff -atmega168.bootloader.high_fuses=0xdd -atmega168.bootloader.extended_fuses=0x00 -atmega168.bootloader.path=atmega -atmega168.bootloader.file=ATmegaBOOT_168_ng.hex -atmega168.bootloader.unlock_bits=0x3F -atmega168.bootloader.lock_bits=0x0F - -atmega168.build.mcu=atmega168 -atmega168.build.f_cpu=16000000L -atmega168.build.core=arduino - -############################################################## - -atmega8.name=Arduino NG or older w/ ATmega8 - -atmega8.upload.protocol=stk500 -atmega8.upload.maximum_size=7168 -atmega8.upload.speed=19200 - -atmega8.bootloader.low_fuses=0xdf -atmega8.bootloader.high_fuses=0xca -atmega8.bootloader.path=atmega8 -atmega8.bootloader.file=ATmegaBOOT.hex -atmega8.bootloader.unlock_bits=0x3F -atmega8.bootloader.lock_bits=0x0F - -atmega8.build.mcu=atmega8 -atmega8.build.f_cpu=16000000L -atmega8.build.core=arduino - diff --git a/arduino/boards.txt.arduino1.6.9 b/arduino/boards.txt.arduino1.6.9 deleted file mode 100644 index 4cd982d3..00000000 --- a/arduino/boards.txt.arduino1.6.9 +++ /dev/null @@ -1,866 +0,0 @@ -# See: http://code.google.com/p/arduino/wiki/Platforms - -menu.cpu=Processor - -############################################################## -## OpenEVSE with Programmer selected from Tools->Programmer -## --------------------------------------------- -openevse.name=[Programmer]OpenEVSE -openevse.upload.tool=avrdude -openevse.upload.maximum_size=32768 -openevse.upload.maximum_data_size=2048 - -openevse.bootloader.tool=avrdude -openevse.bootloader.low_fuses=0xFF -openevse.bootloader.high_fuses=0xDF -openevse.bootloader.extended_fuses=0x04 -openevse.bootloader.unlock_bits=0x3F -openevse.bootloader.lock_bits=0x0F -openevse.bootloader.file=optiboot/optiboot_atmega328.hex - -openevse.build.mcu=atmega328p -openevse.build.f_cpu=16000000L -openevse.build.board=AVR_DUEMILANOVE -openevse.build.core=arduino -openevse.build.variant=standard -openevse.menu.cpu.atmega328=ATmega328 - -############################################################## - -yun.name=Arduino Yún -yun.upload.via_ssh=true - -yun.vid.0=0x2341 -yun.pid.0=0x0041 -yun.vid.1=0x2341 -yun.pid.1=0x8041 -yun.vid.2=0x2A03 -yun.pid.2=0x0041 -yun.vid.3=0x2A03 -yun.pid.3=0x8041 - -yun.upload.tool=avrdude -yun.upload.protocol=avr109 -yun.upload.maximum_size=28672 -yun.upload.maximum_data_size=2560 -yun.upload.speed=57600 -yun.upload.disable_flushing=true -yun.upload.use_1200bps_touch=true -yun.upload.wait_for_upload_port=true - -yun.bootloader.tool=avrdude -yun.bootloader.low_fuses=0xff -yun.bootloader.high_fuses=0xd8 -yun.bootloader.extended_fuses=0xfb -yun.bootloader.file=caterina/Caterina-Yun.hex -yun.bootloader.noblink=caterina/Caterina-Yun-noblink.hex -yun.bootloader.unlock_bits=0x3F -yun.bootloader.lock_bits=0x2F - -yun.build.mcu=atmega32u4 -yun.build.f_cpu=16000000L -yun.build.vid=0x2341 -yun.build.pid=0x8041 -yun.build.usb_product="Arduino Yun" -yun.build.board=AVR_YUN -yun.build.core=arduino -yun.build.variant=yun -yun.build.extra_flags={build.usb_flags} - -############################################################## - -uno.name=Arduino/Genuino Uno - -uno.vid.0=0x2341 -uno.pid.0=0x0043 -uno.vid.1=0x2341 -uno.pid.1=0x0001 -uno.vid.2=0x2A03 -uno.pid.2=0x0043 -uno.vid.3=0x2341 -uno.pid.3=0x0243 - -uno.upload.tool=avrdude -uno.upload.protocol=arduino -uno.upload.maximum_size=32256 -uno.upload.maximum_data_size=2048 -uno.upload.speed=115200 - -uno.bootloader.tool=avrdude -uno.bootloader.low_fuses=0xFF -uno.bootloader.high_fuses=0xDE -uno.bootloader.extended_fuses=0x05 -uno.bootloader.unlock_bits=0x3F -uno.bootloader.lock_bits=0x0F -uno.bootloader.file=optiboot/optiboot_atmega328.hex - -uno.build.mcu=atmega328p -uno.build.f_cpu=16000000L -uno.build.board=AVR_UNO -uno.build.core=arduino -uno.build.variant=standard - -############################################################## - -diecimila.name=Arduino Duemilanove or Diecimila - -diecimila.upload.tool=avrdude -diecimila.upload.protocol=arduino - -diecimila.bootloader.tool=avrdude -diecimila.bootloader.low_fuses=0xFF -diecimila.bootloader.unlock_bits=0x3F -diecimila.bootloader.lock_bits=0x0F - -diecimila.build.f_cpu=16000000L -diecimila.build.board=AVR_DUEMILANOVE -diecimila.build.core=arduino -diecimila.build.variant=standard - -## Arduino Duemilanove or Diecimila w/ ATmega328 -## --------------------------------------------- -diecimila.menu.cpu.atmega328=ATmega328 - -diecimila.menu.cpu.atmega328.upload.maximum_size=30720 -diecimila.menu.cpu.atmega328.upload.maximum_data_size=2048 -diecimila.menu.cpu.atmega328.upload.speed=57600 - -diecimila.menu.cpu.atmega328.bootloader.high_fuses=0xDA -diecimila.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -diecimila.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex - -diecimila.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino Duemilanove or Diecimila w/ ATmega168 -## --------------------------------------------- -diecimila.menu.cpu.atmega168=ATmega168 - -diecimila.menu.cpu.atmega168.upload.maximum_size=14336 -diecimila.menu.cpu.atmega168.upload.maximum_data_size=1024 -diecimila.menu.cpu.atmega168.upload.speed=19200 - -diecimila.menu.cpu.atmega168.bootloader.high_fuses=0xdd -diecimila.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -diecimila.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex - -diecimila.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -nano.name=Arduino Nano - -nano.upload.tool=avrdude -nano.upload.protocol=arduino - -nano.bootloader.tool=avrdude -nano.bootloader.unlock_bits=0x3F -nano.bootloader.lock_bits=0x0F - -nano.build.f_cpu=16000000L -nano.build.board=AVR_NANO -nano.build.core=arduino -nano.build.variant=eightanaloginputs - -## Arduino Nano w/ ATmega328 -## ------------------------- -nano.menu.cpu.atmega328=ATmega328 - -nano.menu.cpu.atmega328.upload.maximum_size=30720 -nano.menu.cpu.atmega328.upload.maximum_data_size=2048 -nano.menu.cpu.atmega328.upload.speed=57600 - -nano.menu.cpu.atmega328.bootloader.low_fuses=0xFF -nano.menu.cpu.atmega328.bootloader.high_fuses=0xDA -nano.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -nano.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex - -nano.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino Nano w/ ATmega168 -## ------------------------- -nano.menu.cpu.atmega168=ATmega168 - -nano.menu.cpu.atmega168.upload.maximum_size=14336 -nano.menu.cpu.atmega168.upload.maximum_data_size=1024 -nano.menu.cpu.atmega168.upload.speed=19200 - -nano.menu.cpu.atmega168.bootloader.low_fuses=0xff -nano.menu.cpu.atmega168.bootloader.high_fuses=0xdd -nano.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -nano.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex - -nano.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -mega.name=Arduino/Genuino Mega or Mega 2560 - -mega.vid.0=0x2341 -mega.pid.0=0x0010 -mega.vid.1=0x2341 -mega.pid.1=0x0042 -mega.vid.2=0x2A03 -mega.pid.2=0x0010 -mega.vid.3=0x2A03 -mega.pid.3=0x0042 -mega.vid.4=0x2341 -mega.pid.4=0x0210 -mega.vid.5=0x2341 -mega.pid.5=0x0242 - -mega.upload.tool=avrdude -mega.upload.maximum_data_size=8192 - -mega.bootloader.tool=avrdude -mega.bootloader.low_fuses=0xFF -mega.bootloader.unlock_bits=0x3F -mega.bootloader.lock_bits=0x0F - -mega.build.f_cpu=16000000L -mega.build.core=arduino -mega.build.variant=mega -# default board may be overridden by the cpu menu -mega.build.board=AVR_MEGA2560 - -## Arduino/Genuino Mega w/ ATmega2560 -## ------------------------- -mega.menu.cpu.atmega2560=ATmega2560 (Mega 2560) - -mega.menu.cpu.atmega2560.upload.protocol=wiring -mega.menu.cpu.atmega2560.upload.maximum_size=253952 -mega.menu.cpu.atmega2560.upload.speed=115200 - -mega.menu.cpu.atmega2560.bootloader.high_fuses=0xD8 -mega.menu.cpu.atmega2560.bootloader.extended_fuses=0xFD -mega.menu.cpu.atmega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex - -mega.menu.cpu.atmega2560.build.mcu=atmega2560 -mega.menu.cpu.atmega2560.build.board=AVR_MEGA2560 - -## Arduino Mega w/ ATmega1280 -## ------------------------- -mega.menu.cpu.atmega1280=ATmega1280 - -mega.menu.cpu.atmega1280.upload.protocol=arduino -mega.menu.cpu.atmega1280.upload.maximum_size=126976 -mega.menu.cpu.atmega1280.upload.speed=57600 - -mega.menu.cpu.atmega1280.bootloader.high_fuses=0xDA -mega.menu.cpu.atmega1280.bootloader.extended_fuses=0xF5 -mega.menu.cpu.atmega1280.bootloader.file=atmega/ATmegaBOOT_168_atmega1280.hex - -mega.menu.cpu.atmega1280.build.mcu=atmega1280 -mega.menu.cpu.atmega1280.build.board=AVR_MEGA - -############################################################## - -megaADK.name=Arduino Mega ADK - -megaADK.vid.0=0x2341 -megaADK.pid.0=0x003f -megaADK.vid.1=0x2341 -megaADK.pid.1=0x0044 -megaADK.vid.2=0x2A03 -megaADK.pid.2=0x003f -megaADK.vid.3=0x2A03 -megaADK.pid.3=0x0044 - -megaADK.upload.tool=avrdude -megaADK.upload.protocol=wiring -megaADK.upload.maximum_size=253952 -megaADK.upload.maximum_data_size=8192 -megaADK.upload.speed=115200 - -megaADK.bootloader.tool=avrdude -megaADK.bootloader.low_fuses=0xFF -megaADK.bootloader.high_fuses=0xD8 -megaADK.bootloader.extended_fuses=0xFD -megaADK.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex -megaADK.bootloader.unlock_bits=0x3F -megaADK.bootloader.lock_bits=0x0F - -megaADK.build.mcu=atmega2560 -megaADK.build.f_cpu=16000000L -megaADK.build.board=AVR_ADK -megaADK.build.core=arduino -megaADK.build.variant=mega - -############################################################## - -leonardo.name=Arduino Leonardo -leonardo.vid.0=0x2341 -leonardo.pid.0=0x0036 -leonardo.vid.1=0x2341 -leonardo.pid.1=0x8036 -leonardo.vid.2=0x2A03 -leonardo.pid.2=0x0036 -leonardo.vid.3=0x2A03 -leonardo.pid.3=0x8036 - -leonardo.upload.tool=avrdude -leonardo.upload.protocol=avr109 -leonardo.upload.maximum_size=28672 -leonardo.upload.maximum_data_size=2560 -leonardo.upload.speed=57600 -leonardo.upload.disable_flushing=true -leonardo.upload.use_1200bps_touch=true -leonardo.upload.wait_for_upload_port=true - -leonardo.bootloader.tool=avrdude -leonardo.bootloader.low_fuses=0xff -leonardo.bootloader.high_fuses=0xd8 -leonardo.bootloader.extended_fuses=0xcb -leonardo.bootloader.file=caterina/Caterina-Leonardo.hex -leonardo.bootloader.unlock_bits=0x3F -leonardo.bootloader.lock_bits=0x2F - -leonardo.build.mcu=atmega32u4 -leonardo.build.f_cpu=16000000L -leonardo.build.vid=0x2341 -leonardo.build.pid=0x8036 -leonardo.build.usb_product="Arduino Leonardo" -leonardo.build.board=AVR_LEONARDO -leonardo.build.core=arduino -leonardo.build.variant=leonardo -leonardo.build.extra_flags={build.usb_flags} - -############################################################## - -micro.name=Arduino/Genuino Micro - -micro.vid.0=0x2341 -micro.pid.0=0x0037 -micro.vid.1=0x2341 -micro.pid.1=0x8037 -micro.vid.2=0x2A03 -micro.pid.2=0x0037 -micro.vid.3=0x2A03 -micro.pid.3=0x8037 - -micro.vid.4=0x2341 -micro.pid.4=0x0237 -# If the board is a 2341:0237 use 2341:8237 for build and set -# other parameters as well -micro.vid.4.build.vid=0x2341 -micro.vid.4.build.pid=0x8237 -micro.vid.4.build.usb_product="Genuino Micro" -micro.vid.4.bootloader.file=caterina/Caterina-Genuino-Micro.hex - -micro.vid.5=0x2341 -micro.pid.5=0x8237 -# If the board is a 2341:8237 use 2341:8237 for build and set -# other paramters as well -micro.vid.5.build.vid=0x2341 -micro.vid.5.build.pid=0x8237 -micro.vid.5.build.usb_product="Genuino Micro" -micro.vid.5.bootloader.file=caterina/Caterina-Genuino-Micro.hex - -micro.upload.tool=avrdude -micro.upload.protocol=avr109 -micro.upload.maximum_size=28672 -micro.upload.maximum_data_size=2560 -micro.upload.speed=57600 -micro.upload.disable_flushing=true -micro.upload.use_1200bps_touch=true -micro.upload.wait_for_upload_port=true - -micro.bootloader.tool=avrdude -micro.bootloader.low_fuses=0xff -micro.bootloader.high_fuses=0xd8 -micro.bootloader.extended_fuses=0xcb -micro.bootloader.file=caterina/Caterina-Micro.hex -micro.bootloader.unlock_bits=0x3F -micro.bootloader.lock_bits=0x2F - -micro.build.mcu=atmega32u4 -micro.build.f_cpu=16000000L -micro.build.vid=0x2341 -micro.build.pid=0x8037 -micro.build.usb_product="Arduino Micro" -micro.build.board=AVR_MICRO -micro.build.core=arduino -micro.build.variant=micro -micro.build.extra_flags={build.usb_flags} - -############################################################## - -esplora.name=Arduino Esplora -esplora.vid.0=0x2341 -esplora.pid.0=0x003C -esplora.vid.1=0x2341 -esplora.pid.1=0x803C -esplora.vid.2=0x2A03 -esplora.pid.2=0x003C -esplora.vid.3=0x2A03 -esplora.pid.3=0x803C - -esplora.upload.tool=avrdude -esplora.upload.protocol=avr109 -esplora.upload.maximum_size=28672 -esplora.upload.maximum_data_size=2560 -esplora.upload.speed=57600 -esplora.upload.disable_flushing=true -esplora.upload.use_1200bps_touch=true -esplora.upload.wait_for_upload_port=true - -esplora.bootloader.tool=avrdude -esplora.bootloader.low_fuses=0xff -esplora.bootloader.high_fuses=0xd8 -esplora.bootloader.extended_fuses=0xcb -esplora.bootloader.file=caterina/Caterina-Esplora.hex -esplora.bootloader.unlock_bits=0x3F -esplora.bootloader.lock_bits=0x2F - -esplora.build.mcu=atmega32u4 -esplora.build.f_cpu=16000000L -esplora.build.vid=0x2341 -esplora.build.pid=0x803c -esplora.build.usb_product="Arduino Esplora" -esplora.build.board=AVR_ESPLORA -esplora.build.core=arduino -esplora.build.variant=leonardo -esplora.build.extra_flags={build.usb_flags} - -############################################################## - -mini.name=Arduino Mini - -mini.upload.tool=avrdude -mini.upload.protocol=arduino - -mini.bootloader.tool=avrdude -mini.bootloader.low_fuses=0xff -mini.bootloader.unlock_bits=0x3F -mini.bootloader.lock_bits=0x0F - -mini.build.f_cpu=16000000L -mini.build.board=AVR_MINI -mini.build.core=arduino -mini.build.variant=eightanaloginputs - -## Arduino Mini w/ ATmega328 -## ------------------------- -mini.menu.cpu.atmega328=ATmega328 - -mini.menu.cpu.atmega328.upload.maximum_size=28672 -mini.menu.cpu.atmega328.upload.maximum_data_size=2048 -mini.menu.cpu.atmega328.upload.speed=115200 - -mini.menu.cpu.atmega328.bootloader.high_fuses=0xd8 -mini.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -mini.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328-Mini.hex - -mini.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino Mini w/ ATmega168 -## ------------------------- -mini.menu.cpu.atmega168=ATmega168 - -mini.menu.cpu.atmega168.upload.maximum_size=14336 -mini.menu.cpu.atmega168.upload.maximum_data_size=1024 -mini.menu.cpu.atmega168.upload.speed=19200 - -mini.menu.cpu.atmega168.bootloader.high_fuses=0xdd -mini.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -mini.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex - -mini.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -ethernet.name=Arduino Ethernet - -ethernet.upload.tool=avrdude -ethernet.upload.protocol=arduino -ethernet.upload.maximum_size=32256 -ethernet.upload.maximum_data_size=2048 -ethernet.upload.speed=115200 - -ethernet.bootloader.tool=avrdude -ethernet.bootloader.low_fuses=0xff -ethernet.bootloader.high_fuses=0xde -ethernet.bootloader.extended_fuses=0x05 -ethernet.bootloader.file=optiboot/optiboot_atmega328.hex -ethernet.bootloader.unlock_bits=0x3F -ethernet.bootloader.lock_bits=0x0F - -ethernet.build.variant=ethernet -ethernet.build.mcu=atmega328p -ethernet.build.f_cpu=16000000L -ethernet.build.board=AVR_ETHERNET -ethernet.build.core=arduino - -############################################################## - -fio.name=Arduino Fio - -fio.upload.tool=avrdude -fio.upload.protocol=arduino -fio.upload.maximum_size=30720 -fio.upload.maximum_data_size=2048 -fio.upload.speed=57600 - -fio.bootloader.tool=avrdude -fio.bootloader.low_fuses=0xFF -fio.bootloader.high_fuses=0xDA -fio.bootloader.extended_fuses=0x05 -fio.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex -fio.bootloader.unlock_bits=0x3F -fio.bootloader.lock_bits=0x0F - -fio.build.mcu=atmega328p -fio.build.f_cpu=8000000L -fio.build.board=AVR_FIO -fio.build.core=arduino -fio.build.variant=eightanaloginputs - -############################################################## - -bt.name=Arduino BT - -bt.upload.tool=avrdude -bt.upload.protocol=arduino -bt.upload.speed=19200 -bt.upload.disable_flushing=true - -bt.bootloader.tool=avrdude -bt.bootloader.low_fuses=0xff -bt.bootloader.unlock_bits=0x3F -bt.bootloader.lock_bits=0x0F - -bt.build.f_cpu=16000000L -bt.build.board=AVR_BT -bt.build.core=arduino -bt.build.variant=eightanaloginputs - -## Arduino BT w/ ATmega328 -## ----------------------- -bt.menu.cpu.atmega328=ATmega328 -bt.menu.cpu.atmega328.upload.maximum_size=28672 -bt.menu.cpu.atmega328.upload.maximum_data_size=2048 - -bt.menu.cpu.atmega328.bootloader.high_fuses=0xd8 -bt.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -bt.menu.cpu.atmega328.bootloader.file=bt/ATmegaBOOT_168_atmega328_bt.hex - -bt.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino BT w/ ATmega168 -## ----------------------- -bt.menu.cpu.atmega168=ATmega168 -bt.menu.cpu.atmega168.upload.maximum_size=14336 -bt.menu.cpu.atmega168.upload.maximum_data_size=1024 - -bt.menu.cpu.atmega168.bootloader.high_fuses=0xdd -bt.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -bt.menu.cpu.atmega168.bootloader.file=bt/ATmegaBOOT_168.hex - -bt.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -LilyPadUSB.name=LilyPad Arduino USB -LilyPadUSB.vid.0=0x1B4F -LilyPadUSB.pid.0=0x9207 -LilyPadUSB.vid.1=0x1B4F -LilyPadUSB.pid.1=0x9208 - -LilyPadUSB.upload.tool=avrdude -LilyPadUSB.upload.protocol=avr109 -LilyPadUSB.upload.maximum_size=28672 -LilyPadUSB.upload.maximum_data_size=2560 -LilyPadUSB.upload.speed=57600 -LilyPadUSB.upload.disable_flushing=true -LilyPadUSB.upload.use_1200bps_touch=true -LilyPadUSB.upload.wait_for_upload_port=true - -LilyPadUSB.bootloader.tool=avrdude -LilyPadUSB.bootloader.low_fuses=0xff -LilyPadUSB.bootloader.high_fuses=0xd8 -LilyPadUSB.bootloader.extended_fuses=0xce -LilyPadUSB.bootloader.file=caterina-LilyPadUSB/Caterina-LilyPadUSB.hex -LilyPadUSB.bootloader.unlock_bits=0x3F -LilyPadUSB.bootloader.lock_bits=0x2F - -LilyPadUSB.build.mcu=atmega32u4 -LilyPadUSB.build.f_cpu=8000000L -LilyPadUSB.build.vid=0x1B4F -LilyPadUSB.build.pid=0x9208 -LilyPadUSB.build.usb_product="LilyPad USB" -LilyPadUSB.build.board=AVR_LILYPAD_USB -LilyPadUSB.build.core=arduino -LilyPadUSB.build.variant=leonardo -LilyPadUSB.build.extra_flags={build.usb_flags} - -############################################################## - -lilypad.name=LilyPad Arduino - -lilypad.upload.tool=avrdude -lilypad.upload.protocol=arduino - -lilypad.bootloader.tool=avrdude -lilypad.bootloader.unlock_bits=0x3F -lilypad.bootloader.lock_bits=0x0F - -lilypad.build.f_cpu=8000000L -lilypad.build.board=AVR_LILYPAD -lilypad.build.core=arduino -lilypad.build.variant=standard - -## LilyPad Arduino w/ ATmega328 -## ---------------------------- -lilypad.menu.cpu.atmega328=ATmega328 - -lilypad.menu.cpu.atmega328.upload.maximum_size=30720 -lilypad.menu.cpu.atmega328.upload.maximum_data_size=2048 -lilypad.menu.cpu.atmega328.upload.speed=57600 - -lilypad.menu.cpu.atmega328.bootloader.low_fuses=0xFF -lilypad.menu.cpu.atmega328.bootloader.high_fuses=0xDA -lilypad.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -lilypad.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex - -lilypad.menu.cpu.atmega328.build.mcu=atmega328p - -## LilyPad Arduino w/ ATmega168 -## ---------------------------- -lilypad.menu.cpu.atmega168=ATmega168 - -lilypad.menu.cpu.atmega168.upload.maximum_size=14336 -lilypad.menu.cpu.atmega168.upload.maximum_data_size=1024 -lilypad.menu.cpu.atmega168.upload.speed=19200 - -lilypad.menu.cpu.atmega168.bootloader.low_fuses=0xe2 -lilypad.menu.cpu.atmega168.bootloader.high_fuses=0xdd -lilypad.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -lilypad.menu.cpu.atmega168.bootloader.file=lilypad/LilyPadBOOT_168.hex - -lilypad.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -pro.name=Arduino Pro or Pro Mini - -pro.upload.tool=avrdude -pro.upload.protocol=arduino - -pro.bootloader.tool=avrdude -pro.bootloader.unlock_bits=0x3F -pro.bootloader.lock_bits=0x0F - -pro.build.board=AVR_PRO -pro.build.core=arduino -pro.build.variant=eightanaloginputs - -## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 -## ------------------------------------------------- -pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz) - -pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720 -pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 -pro.menu.cpu.16MHzatmega328.upload.speed=57600 - -pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF -pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA -pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05 -pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex - -pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p -pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L - -## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 -## -------------------------------------------------- -pro.menu.cpu.8MHzatmega328=ATmega328 (3.3V, 8 MHz) - -pro.menu.cpu.8MHzatmega328.upload.maximum_size=30720 -pro.menu.cpu.8MHzatmega328.upload.maximum_data_size=2048 -pro.menu.cpu.8MHzatmega328.upload.speed=57600 - -pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF -pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA -pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05 -pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex - -pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p -pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L - -## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 -## ------------------------------------------------- -pro.menu.cpu.16MHzatmega168=ATmega168 (5V, 16 MHz) - -pro.menu.cpu.16MHzatmega168.upload.maximum_size=14336 -pro.menu.cpu.16MHzatmega168.upload.maximum_data_size=1024 -pro.menu.cpu.16MHzatmega168.upload.speed=19200 - -pro.menu.cpu.16MHzatmega168.bootloader.low_fuses=0xff -pro.menu.cpu.16MHzatmega168.bootloader.high_fuses=0xdd -pro.menu.cpu.16MHzatmega168.bootloader.extended_fuses=0x00 -pro.menu.cpu.16MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex - -pro.menu.cpu.16MHzatmega168.build.mcu=atmega168 -pro.menu.cpu.16MHzatmega168.build.f_cpu=16000000L - -## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 -## -------------------------------------------------- -pro.menu.cpu.8MHzatmega168=ATmega168 (3.3V, 8 MHz) - -pro.menu.cpu.8MHzatmega168.upload.maximum_size=14336 -pro.menu.cpu.8MHzatmega168.upload.maximum_data_size=1024 -pro.menu.cpu.8MHzatmega168.upload.speed=19200 - -pro.menu.cpu.8MHzatmega168.bootloader.low_fuses=0xc6 -pro.menu.cpu.8MHzatmega168.bootloader.high_fuses=0xdd -pro.menu.cpu.8MHzatmega168.bootloader.extended_fuses=0x00 -pro.menu.cpu.8MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex - -pro.menu.cpu.8MHzatmega168.build.mcu=atmega168 -pro.menu.cpu.8MHzatmega168.build.f_cpu=8000000L - -############################################################## - -atmegang.name=Arduino NG or older - -atmegang.upload.tool=avrdude -atmegang.upload.protocol=arduino -atmegang.upload.speed=19200 - -atmegang.bootloader.tool=avrdude -atmegang.bootloader.unlock_bits=0x3F -atmegang.bootloader.lock_bits=0x0F - -atmegang.build.mcu=atmegang -atmegang.build.f_cpu=16000000L -atmegang.build.board=AVR_NG -atmegang.build.core=arduino -atmegang.build.variant=standard - -## Arduino NG or older w/ ATmega168 -## -------------------------------- -atmegang.menu.cpu.atmega168=ATmega168 - -atmegang.menu.cpu.atmega168.upload.maximum_size=14336 -atmegang.menu.cpu.atmega168.upload.maximum_data_size=1024 - -atmegang.menu.cpu.atmega168.bootloader.low_fuses=0xff -atmegang.menu.cpu.atmega168.bootloader.high_fuses=0xdd -atmegang.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -atmegang.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex - -atmegang.menu.cpu.atmega168.build.mcu=atmega168 - -## Arduino NG or older w/ ATmega8 -## ------------------------------ -atmegang.menu.cpu.atmega8=ATmega8 - -atmegang.menu.cpu.atmega8.upload.maximum_size=7168 -atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024 - -atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xdf -atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca -atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex - -atmegang.menu.cpu.atmega8.build.mcu=atmega8 - -############################################################## - -robotControl.name=Arduino Robot Control -robotControl.vid.0=0x2341 -robotControl.pid.0=0x0038 -robotControl.vid.1=0x2341 -robotControl.pid.1=0x8038 -robotControl.vid.2=0x2A03 -robotControl.pid.2=0x0038 -robotControl.vid.3=0x2A03 -robotControl.pid.3=0x8038 - -robotControl.upload.tool=avrdude -robotControl.upload.protocol=avr109 -robotControl.upload.maximum_size=28672 -robotControl.upload.maximum_data_size=2560 -robotControl.upload.speed=57600 -robotControl.upload.disable_flushing=true -robotControl.upload.use_1200bps_touch=true -robotControl.upload.wait_for_upload_port=true - -robotControl.bootloader.tool=avrdude -robotControl.bootloader.low_fuses=0xff -robotControl.bootloader.high_fuses=0xd8 -robotControl.bootloader.extended_fuses=0xcb -robotControl.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Control.hex -robotControl.bootloader.unlock_bits=0x3F -robotControl.bootloader.lock_bits=0x2F - -robotControl.build.mcu=atmega32u4 -robotControl.build.f_cpu=16000000L -robotControl.build.vid=0x2341 -robotControl.build.pid=0x8038 -robotControl.build.usb_product="Robot Control" -robotControl.build.board=AVR_ROBOT_CONTROL -robotControl.build.core=arduino -robotControl.build.variant=robot_control -robotControl.build.extra_flags={build.usb_flags} - -############################################################## - -robotMotor.name=Arduino Robot Motor -robotMotor.vid.0=0x2341 -robotMotor.pid.0=0x0039 -robotMotor.vid.1=0x2341 -robotMotor.pid.1=0x8039 -robotMotor.vid.2=0x2A03 -robotMotor.pid.2=0x0039 -robotMotor.vid.3=0x2A03 -robotMotor.pid.3=0x8039 - -robotMotor.upload.tool=avrdude -robotMotor.upload.protocol=avr109 -robotMotor.upload.maximum_size=28672 -robotMotor.upload.maximum_data_size=2560 -robotMotor.upload.speed=57600 -robotMotor.upload.disable_flushing=true -robotMotor.upload.use_1200bps_touch=true -robotMotor.upload.wait_for_upload_port=true - -robotMotor.bootloader.tool=avrdude -robotMotor.bootloader.low_fuses=0xff -robotMotor.bootloader.high_fuses=0xd8 -robotMotor.bootloader.extended_fuses=0xcb -robotMotor.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Motor.hex -robotMotor.bootloader.unlock_bits=0x3F -robotMotor.bootloader.lock_bits=0x2F - -robotMotor.build.mcu=atmega32u4 -robotMotor.build.f_cpu=16000000L -robotMotor.build.vid=0x2341 -robotMotor.build.pid=0x8039 -robotMotor.build.usb_product="Robot Motor" -robotMotor.build.board=AVR_ROBOT_MOTOR -robotMotor.build.core=arduino -robotMotor.build.variant=robot_motor -robotMotor.build.extra_flags={build.usb_flags} - -############################################################## - -gemma.vid.0=0x2341 -gemma.pid.0=0x0c9f - -gemma.name=Arduino Gemma - -gemma.bootloader.low_fuses=0xF1 -gemma.bootloader.high_fuses=0xD5 -gemma.bootloader.extended_fuses=0xFE -gemma.bootloader.tool=avrdude -gemma.bootloader.lock_bits= -gemma.bootloader.unlock_bits= -gemma.bootloader.file=gemma/gemma_v1.hex - -gemma.build.mcu=attiny85 -gemma.build.f_cpu=8000000L -gemma.build.core=arduino -gemma.build.variant=gemma -gemma.build.board=AVR_GEMMA - -gemma.upload.tool=avrdude -gemma.upload.maximum_size=5310 - diff --git a/arduino/boards.txt.arduino1.6.x b/arduino/boards.txt.arduino1.6.x deleted file mode 100644 index 4046336d..00000000 --- a/arduino/boards.txt.arduino1.6.x +++ /dev/null @@ -1,834 +0,0 @@ -# See: http://code.google.com/p/arduino/wiki/Platforms - -menu.cpu=Processor - -############################################################## -## OpenEVSE with Programmer selected from Tools->Programmer -## --------------------------------------------- -openevse.name=[Programmer]OpenEVSE -openevse.upload.tool=avrdude -openevse.upload.maximum_size=32768 -openevse.upload.maximum_data_size=2048 - -openevse.bootloader.tool=avrdude -openevse.bootloader.low_fuses=0xFF -openevse.bootloader.high_fuses=0xDF -openevse.bootloader.extended_fuses=0x04 -openevse.bootloader.unlock_bits=0x3F -openevse.bootloader.lock_bits=0x0F -openevse.bootloader.file=optiboot/optiboot_atmega328.hex - -openevse.build.mcu=atmega328p -openevse.build.f_cpu=16000000L -openevse.build.board=AVR_DUEMILANOVE -openevse.build.core=arduino -openevse.build.variant=standard -openevse.menu.cpu.atmega328=ATmega328 - -############################################################## - -yun.name=Arduino Yún -yun.upload.via_ssh=true - -yun.vid.0=0x2341 -yun.pid.0=0x0041 -yun.vid.1=0x2341 -yun.pid.1=0x8041 -yun.vid.2=0x2A03 -yun.pid.2=0x0041 -yun.vid.3=0x2A03 -yun.pid.3=0x8041 - -yun.vid.0x2A03.warning=Uncertified - -yun.upload.tool=avrdude -yun.upload.protocol=avr109 -yun.upload.maximum_size=28672 -yun.upload.maximum_data_size=2560 -yun.upload.speed=57600 -yun.upload.disable_flushing=true -yun.upload.use_1200bps_touch=true -yun.upload.wait_for_upload_port=true - -yun.bootloader.tool=avrdude -yun.bootloader.low_fuses=0xff -yun.bootloader.high_fuses=0xd8 -yun.bootloader.extended_fuses=0xfb -yun.bootloader.file=caterina/Caterina-Yun.hex -yun.bootloader.unlock_bits=0x3F -yun.bootloader.lock_bits=0x2F - -yun.build.mcu=atmega32u4 -yun.build.f_cpu=16000000L -yun.build.vid=0x2341 -yun.build.pid=0x8041 -yun.build.usb_product="Arduino Yun" -yun.build.board=AVR_YUN -yun.build.core=arduino -yun.build.variant=yun -yun.build.extra_flags={build.usb_flags} - -############################################################## - -uno.name=Arduino Uno - -uno.vid.0=0x2341 -uno.pid.0=0x0043 -uno.vid.1=0x2341 -uno.pid.1=0x0001 -uno.vid.2=0x2A03 -uno.pid.2=0x0043 - -uno.vid.0x2A03.warning=Uncertified - -uno.upload.tool=avrdude -uno.upload.protocol=arduino -uno.upload.maximum_size=32256 -uno.upload.maximum_data_size=2048 -uno.upload.speed=115200 - -uno.bootloader.tool=avrdude -uno.bootloader.low_fuses=0xFF -uno.bootloader.high_fuses=0xDE -uno.bootloader.extended_fuses=0x05 -uno.bootloader.unlock_bits=0x3F -uno.bootloader.lock_bits=0x0F -uno.bootloader.file=optiboot/optiboot_atmega328.hex - -uno.build.mcu=atmega328p -uno.build.f_cpu=16000000L -uno.build.board=AVR_UNO -uno.build.core=arduino -uno.build.variant=standard - -############################################################## - -diecimila.name=Arduino Duemilanove or Diecimila - -diecimila.upload.tool=avrdude -diecimila.upload.protocol=arduino - -diecimila.bootloader.tool=avrdude -diecimila.bootloader.low_fuses=0xFF -diecimila.bootloader.unlock_bits=0x3F -diecimila.bootloader.lock_bits=0x0F - -diecimila.build.f_cpu=16000000L -diecimila.build.board=AVR_DUEMILANOVE -diecimila.build.core=arduino -diecimila.build.variant=standard - -## Arduino Duemilanove or Diecimila w/ ATmega328 -## --------------------------------------------- -diecimila.menu.cpu.atmega328=ATmega328 - -diecimila.menu.cpu.atmega328.upload.maximum_size=30720 -diecimila.menu.cpu.atmega328.upload.maximum_data_size=2048 -diecimila.menu.cpu.atmega328.upload.speed=57600 - -diecimila.menu.cpu.atmega328.bootloader.high_fuses=0xDA -diecimila.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -diecimila.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex - -diecimila.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino Duemilanove or Diecimila w/ ATmega168 -## --------------------------------------------- -diecimila.menu.cpu.atmega168=ATmega168 - -diecimila.menu.cpu.atmega168.upload.maximum_size=14336 -diecimila.menu.cpu.atmega168.upload.maximum_data_size=1024 -diecimila.menu.cpu.atmega168.upload.speed=19200 - -diecimila.menu.cpu.atmega168.bootloader.high_fuses=0xdd -diecimila.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -diecimila.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex - -diecimila.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -nano.name=Arduino Nano - -nano.upload.tool=avrdude -nano.upload.protocol=arduino - -nano.bootloader.tool=avrdude -nano.bootloader.unlock_bits=0x3F -nano.bootloader.lock_bits=0x0F - -nano.build.f_cpu=16000000L -nano.build.board=AVR_NANO -nano.build.core=arduino -nano.build.variant=eightanaloginputs - -## Arduino Nano w/ ATmega328 -## ------------------------- -nano.menu.cpu.atmega328=ATmega328 - -nano.menu.cpu.atmega328.upload.maximum_size=30720 -nano.menu.cpu.atmega328.upload.maximum_data_size=2048 -nano.menu.cpu.atmega328.upload.speed=57600 - -nano.menu.cpu.atmega328.bootloader.low_fuses=0xFF -nano.menu.cpu.atmega328.bootloader.high_fuses=0xDA -nano.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -nano.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex - -nano.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino Nano w/ ATmega168 -## ------------------------- -nano.menu.cpu.atmega168=ATmega168 - -nano.menu.cpu.atmega168.upload.maximum_size=14336 -nano.menu.cpu.atmega168.upload.maximum_data_size=1024 -nano.menu.cpu.atmega168.upload.speed=19200 - -nano.menu.cpu.atmega168.bootloader.low_fuses=0xff -nano.menu.cpu.atmega168.bootloader.high_fuses=0xdd -nano.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -nano.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex - -nano.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -mega.name=Arduino Mega or Mega 2560 - -mega.vid.0=0x2341 -mega.pid.0=0x0010 -mega.vid.1=0x2341 -mega.pid.1=0x0042 -mega.vid.2=0x2A03 -mega.pid.2=0x0010 -mega.vid.3=0x2A03 -mega.pid.3=0x0042 - -mega.vid.0x2A03.warning=Uncertified - -mega.upload.tool=avrdude -mega.upload.maximum_data_size=8192 - -mega.bootloader.tool=avrdude -mega.bootloader.low_fuses=0xFF -mega.bootloader.unlock_bits=0x3F -mega.bootloader.lock_bits=0x0F - -mega.build.f_cpu=16000000L -mega.build.core=arduino -mega.build.variant=mega -# default board may be overridden by the cpu menu -mega.build.board=AVR_MEGA2560 - -## Arduino Mega w/ ATmega2560 -## ------------------------- -mega.menu.cpu.atmega2560=ATmega2560 (Mega 2560) - -mega.menu.cpu.atmega2560.upload.protocol=wiring -mega.menu.cpu.atmega2560.upload.maximum_size=253952 -mega.menu.cpu.atmega2560.upload.speed=115200 - -mega.menu.cpu.atmega2560.bootloader.high_fuses=0xD8 -mega.menu.cpu.atmega2560.bootloader.extended_fuses=0xFD -mega.menu.cpu.atmega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex - -mega.menu.cpu.atmega2560.build.mcu=atmega2560 -mega.menu.cpu.atmega2560.build.board=AVR_MEGA2560 - -## Arduino Mega w/ ATmega1280 -## ------------------------- -mega.menu.cpu.atmega1280=ATmega1280 - -mega.menu.cpu.atmega1280.upload.protocol=arduino -mega.menu.cpu.atmega1280.upload.maximum_size=126976 -mega.menu.cpu.atmega1280.upload.speed=57600 - -mega.menu.cpu.atmega1280.bootloader.high_fuses=0xDA -mega.menu.cpu.atmega1280.bootloader.extended_fuses=0xF5 -mega.menu.cpu.atmega1280.bootloader.file=atmega/ATmegaBOOT_168_atmega1280.hex - -mega.menu.cpu.atmega1280.build.mcu=atmega1280 -mega.menu.cpu.atmega1280.build.board=AVR_MEGA - -############################################################## - -megaADK.name=Arduino Mega ADK - -megaADK.vid.0=0x2341 -megaADK.pid.0=0x003f -megaADK.vid.1=0x2341 -megaADK.pid.1=0x0044 -megaADK.vid.2=0x2A03 -megaADK.pid.2=0x003f -megaADK.vid.3=0x2A03 -megaADK.pid.3=0x0044 - -megaADK.vid.0x2A03.warning=Uncertified - -megaADK.upload.tool=avrdude -megaADK.upload.protocol=wiring -megaADK.upload.maximum_size=253952 -megaADK.upload.maximum_data_size=8192 -megaADK.upload.speed=115200 - -megaADK.bootloader.tool=avrdude -megaADK.bootloader.low_fuses=0xFF -megaADK.bootloader.high_fuses=0xD8 -megaADK.bootloader.extended_fuses=0xFD -megaADK.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex -megaADK.bootloader.unlock_bits=0x3F -megaADK.bootloader.lock_bits=0x0F - -megaADK.build.mcu=atmega2560 -megaADK.build.f_cpu=16000000L -megaADK.build.board=AVR_ADK -megaADK.build.core=arduino -megaADK.build.variant=mega - -############################################################## - -leonardo.name=Arduino Leonardo -leonardo.vid.0=0x2341 -leonardo.pid.0=0x0036 -leonardo.vid.1=0x2341 -leonardo.pid.1=0x8036 -leonardo.vid.2=0x2A03 -leonardo.pid.2=0x0036 -leonardo.vid.3=0x2A03 -leonardo.pid.3=0x8036 - -leonardo.vid.0x2A03.warning=Uncertified - -leonardo.upload.tool=avrdude -leonardo.upload.protocol=avr109 -leonardo.upload.maximum_size=28672 -leonardo.upload.maximum_data_size=2560 -leonardo.upload.speed=57600 -leonardo.upload.disable_flushing=true -leonardo.upload.use_1200bps_touch=true -leonardo.upload.wait_for_upload_port=true - -leonardo.bootloader.tool=avrdude -leonardo.bootloader.low_fuses=0xff -leonardo.bootloader.high_fuses=0xd8 -leonardo.bootloader.extended_fuses=0xcb -leonardo.bootloader.file=caterina/Caterina-Leonardo.hex -leonardo.bootloader.unlock_bits=0x3F -leonardo.bootloader.lock_bits=0x2F - -leonardo.build.mcu=atmega32u4 -leonardo.build.f_cpu=16000000L -leonardo.build.vid=0x2341 -leonardo.build.pid=0x8036 -leonardo.build.usb_product="Arduino Leonardo" -leonardo.build.board=AVR_LEONARDO -leonardo.build.core=arduino -leonardo.build.variant=leonardo -leonardo.build.extra_flags={build.usb_flags} - -############################################################## - -micro.name=Arduino Micro -micro.vid.0=0x2341 -micro.pid.0=0x0037 -micro.vid.1=0x2341 -micro.pid.1=0x8037 -micro.vid.2=0x2A03 -micro.pid.2=0x0037 -micro.vid.3=0x2A03 -micro.pid.3=0x8037 - -micro.vid.0x2A03.warning=Uncertified - -micro.upload.tool=avrdude -micro.upload.protocol=avr109 -micro.upload.maximum_size=28672 -micro.upload.maximum_data_size=2560 -micro.upload.speed=57600 -micro.upload.disable_flushing=true -micro.upload.use_1200bps_touch=true -micro.upload.wait_for_upload_port=true - -micro.bootloader.tool=avrdude -micro.bootloader.low_fuses=0xff -micro.bootloader.high_fuses=0xd8 -micro.bootloader.extended_fuses=0xcb -micro.bootloader.file=caterina/Caterina-Micro.hex -micro.bootloader.unlock_bits=0x3F -micro.bootloader.lock_bits=0x2F - -micro.build.mcu=atmega32u4 -micro.build.f_cpu=16000000L -micro.build.vid=0x2341 -micro.build.pid=0x8037 -micro.build.usb_product="Arduino Micro" -micro.build.board=AVR_MICRO -micro.build.core=arduino -micro.build.variant=micro -micro.build.extra_flags={build.usb_flags} - -############################################################## - -esplora.name=Arduino Esplora -esplora.vid.0=0x2341 -esplora.pid.0=0x003C -esplora.vid.1=0x2341 -esplora.pid.1=0x803C -esplora.vid.2=0x2A03 -esplora.pid.2=0x003C -esplora.vid.3=0x2A03 -esplora.pid.3=0x803C - -esplora.vid.0x2A03.warning=Uncertified - -esplora.upload.tool=avrdude -esplora.upload.protocol=avr109 -esplora.upload.maximum_size=28672 -esplora.upload.maximum_data_size=2560 -esplora.upload.speed=57600 -esplora.upload.disable_flushing=true -esplora.upload.use_1200bps_touch=true -esplora.upload.wait_for_upload_port=true - -esplora.bootloader.tool=avrdude -esplora.bootloader.low_fuses=0xff -esplora.bootloader.high_fuses=0xd8 -esplora.bootloader.extended_fuses=0xcb -esplora.bootloader.file=caterina/Caterina-Esplora.hex -esplora.bootloader.unlock_bits=0x3F -esplora.bootloader.lock_bits=0x2F - -esplora.build.mcu=atmega32u4 -esplora.build.f_cpu=16000000L -esplora.build.vid=0x2341 -esplora.build.pid=0x803c -esplora.build.usb_product="Arduino Esplora" -esplora.build.board=AVR_ESPLORA -esplora.build.core=arduino -esplora.build.variant=leonardo -esplora.build.extra_flags={build.usb_flags} - -############################################################## - -mini.name=Arduino Mini - -mini.upload.tool=avrdude -mini.upload.protocol=arduino - -mini.bootloader.tool=avrdude -mini.bootloader.low_fuses=0xff -mini.bootloader.unlock_bits=0x3F -mini.bootloader.lock_bits=0x0F - -mini.build.f_cpu=16000000L -mini.build.board=AVR_MINI -mini.build.core=arduino -mini.build.variant=eightanaloginputs - -## Arduino Mini w/ ATmega328 -## ------------------------- -mini.menu.cpu.atmega328=ATmega328 - -mini.menu.cpu.atmega328.upload.maximum_size=28672 -mini.menu.cpu.atmega328.upload.maximum_data_size=2048 -mini.menu.cpu.atmega328.upload.speed=115200 - -mini.menu.cpu.atmega328.bootloader.high_fuses=0xd8 -mini.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -mini.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328-Mini.hex - -mini.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino Mini w/ ATmega168 -## ------------------------- -mini.menu.cpu.atmega168=ATmega168 - -mini.menu.cpu.atmega168.upload.maximum_size=14336 -mini.menu.cpu.atmega168.upload.maximum_data_size=1024 -mini.menu.cpu.atmega168.upload.speed=19200 - -mini.menu.cpu.atmega168.bootloader.high_fuses=0xdd -mini.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -mini.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex - -mini.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -ethernet.name=Arduino Ethernet - -ethernet.upload.tool=avrdude -ethernet.upload.protocol=arduino -ethernet.upload.maximum_size=32256 -ethernet.upload.maximum_data_size=2048 -ethernet.upload.speed=115200 - -ethernet.bootloader.tool=avrdude -ethernet.bootloader.low_fuses=0xff -ethernet.bootloader.high_fuses=0xde -ethernet.bootloader.extended_fuses=0x05 -ethernet.bootloader.file=optiboot/optiboot_atmega328.hex -ethernet.bootloader.unlock_bits=0x3F -ethernet.bootloader.lock_bits=0x0F - -ethernet.build.variant=ethernet -ethernet.build.mcu=atmega328p -ethernet.build.f_cpu=16000000L -ethernet.build.board=AVR_ETHERNET -ethernet.build.core=arduino - -############################################################## - -fio.name=Arduino Fio - -fio.upload.tool=avrdude -fio.upload.protocol=arduino -fio.upload.maximum_size=30720 -fio.upload.maximum_data_size=2048 -fio.upload.speed=57600 - -fio.bootloader.tool=avrdude -fio.bootloader.low_fuses=0xFF -fio.bootloader.high_fuses=0xDA -fio.bootloader.extended_fuses=0x05 -fio.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex -fio.bootloader.unlock_bits=0x3F -fio.bootloader.lock_bits=0x0F - -fio.build.mcu=atmega328p -fio.build.f_cpu=8000000L -fio.build.board=AVR_FIO -fio.build.core=arduino -fio.build.variant=eightanaloginputs - -############################################################## - -bt.name=Arduino BT - -bt.upload.tool=avrdude -bt.upload.protocol=arduino -bt.upload.speed=19200 -bt.upload.disable_flushing=true - -bt.bootloader.tool=avrdude -bt.bootloader.low_fuses=0xff -bt.bootloader.unlock_bits=0x3F -bt.bootloader.lock_bits=0x0F - -bt.build.f_cpu=16000000L -bt.build.board=AVR_BT -bt.build.core=arduino -bt.build.variant=eightanaloginputs - -## Arduino BT w/ ATmega328 -## ----------------------- -bt.menu.cpu.atmega328=ATmega328 -bt.menu.cpu.atmega328.upload.maximum_size=28672 -bt.menu.cpu.atmega328.upload.maximum_data_size=2048 - -bt.menu.cpu.atmega328.bootloader.high_fuses=0xd8 -bt.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -bt.menu.cpu.atmega328.bootloader.file=bt/ATmegaBOOT_168_atmega328_bt.hex - -bt.menu.cpu.atmega328.build.mcu=atmega328p - -## Arduino BT w/ ATmega168 -## ----------------------- -bt.menu.cpu.atmega168=ATmega168 -bt.menu.cpu.atmega168.upload.maximum_size=14336 -bt.menu.cpu.atmega168.upload.maximum_data_size=1024 - -bt.menu.cpu.atmega168.bootloader.high_fuses=0xdd -bt.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -bt.menu.cpu.atmega168.bootloader.file=bt/ATmegaBOOT_168.hex - -bt.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -LilyPadUSB.name=LilyPad Arduino USB -LilyPadUSB.vid.0=0x1B4F -LilyPadUSB.pid.0=0x9207 -LilyPadUSB.vid.1=0x1B4F -LilyPadUSB.pid.1=0x9208 - -LilyPadUSB.upload.tool=avrdude -LilyPadUSB.upload.protocol=avr109 -LilyPadUSB.upload.maximum_size=28672 -LilyPadUSB.upload.maximum_data_size=2560 -LilyPadUSB.upload.speed=57600 -LilyPadUSB.upload.disable_flushing=true -LilyPadUSB.upload.use_1200bps_touch=true -LilyPadUSB.upload.wait_for_upload_port=true - -LilyPadUSB.bootloader.tool=avrdude -LilyPadUSB.bootloader.low_fuses=0xff -LilyPadUSB.bootloader.high_fuses=0xd8 -LilyPadUSB.bootloader.extended_fuses=0xce -LilyPadUSB.bootloader.file=caterina-LilyPadUSB/Caterina-LilyPadUSB.hex -LilyPadUSB.bootloader.unlock_bits=0x3F -LilyPadUSB.bootloader.lock_bits=0x2F - -LilyPadUSB.build.mcu=atmega32u4 -LilyPadUSB.build.f_cpu=8000000L -LilyPadUSB.build.vid=0x1B4F -LilyPadUSB.build.pid=0x9208 -LilyPadUSB.build.usb_product="LilyPad USB" -LilyPadUSB.build.board=AVR_LILYPAD_USB -LilyPadUSB.build.core=arduino -LilyPadUSB.build.variant=leonardo -LilyPadUSB.build.extra_flags={build.usb_flags} - -############################################################## - -lilypad.name=LilyPad Arduino - -lilypad.upload.tool=avrdude -lilypad.upload.protocol=arduino - -lilypad.bootloader.tool=avrdude -lilypad.bootloader.unlock_bits=0x3F -lilypad.bootloader.lock_bits=0x0F - -lilypad.build.f_cpu=8000000L -lilypad.build.board=AVR_LILYPAD -lilypad.build.core=arduino -lilypad.build.variant=standard - -## LilyPad Arduino w/ ATmega328 -## ---------------------------- -lilypad.menu.cpu.atmega328=ATmega328 - -lilypad.menu.cpu.atmega328.upload.maximum_size=30720 -lilypad.menu.cpu.atmega328.upload.maximum_data_size=2048 -lilypad.menu.cpu.atmega328.upload.speed=57600 - -lilypad.menu.cpu.atmega328.bootloader.low_fuses=0xFF -lilypad.menu.cpu.atmega328.bootloader.high_fuses=0xDA -lilypad.menu.cpu.atmega328.bootloader.extended_fuses=0x05 -lilypad.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex - -lilypad.menu.cpu.atmega328.build.mcu=atmega328p - -## LilyPad Arduino w/ ATmega168 -## ---------------------------- -lilypad.menu.cpu.atmega168=ATmega168 - -lilypad.menu.cpu.atmega168.upload.maximum_size=14336 -lilypad.menu.cpu.atmega168.upload.maximum_data_size=1024 -lilypad.menu.cpu.atmega168.upload.speed=19200 - -lilypad.menu.cpu.atmega168.bootloader.low_fuses=0xe2 -lilypad.menu.cpu.atmega168.bootloader.high_fuses=0xdd -lilypad.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -lilypad.menu.cpu.atmega168.bootloader.file=lilypad/LilyPadBOOT_168.hex - -lilypad.menu.cpu.atmega168.build.mcu=atmega168 - -############################################################## - -pro.name=Arduino Pro or Pro Mini - -pro.upload.tool=avrdude -pro.upload.protocol=arduino - -pro.bootloader.tool=avrdude -pro.bootloader.unlock_bits=0x3F -pro.bootloader.lock_bits=0x0F - -pro.build.board=AVR_PRO -pro.build.core=arduino -pro.build.variant=eightanaloginputs - -## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 -## ------------------------------------------------- -pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz) - -pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720 -pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 -pro.menu.cpu.16MHzatmega328.upload.speed=57600 - -pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF -pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA -pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05 -pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex - -pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p -pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L - -## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 -## -------------------------------------------------- -pro.menu.cpu.8MHzatmega328=ATmega328 (3.3V, 8 MHz) - -pro.menu.cpu.8MHzatmega328.upload.maximum_size=30720 -pro.menu.cpu.8MHzatmega328.upload.maximum_data_size=2048 -pro.menu.cpu.8MHzatmega328.upload.speed=57600 - -pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF -pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA -pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05 -pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex - -pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p -pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L - -## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 -## ------------------------------------------------- -pro.menu.cpu.16MHzatmega168=ATmega168 (5V, 16 MHz) - -pro.menu.cpu.16MHzatmega168.upload.maximum_size=14336 -pro.menu.cpu.16MHzatmega168.upload.maximum_data_size=1024 -pro.menu.cpu.16MHzatmega168.upload.speed=19200 - -pro.menu.cpu.16MHzatmega168.bootloader.low_fuses=0xff -pro.menu.cpu.16MHzatmega168.bootloader.high_fuses=0xdd -pro.menu.cpu.16MHzatmega168.bootloader.extended_fuses=0x00 -pro.menu.cpu.16MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex - -pro.menu.cpu.16MHzatmega168.build.mcu=atmega168 -pro.menu.cpu.16MHzatmega168.build.f_cpu=16000000L - -## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 -## -------------------------------------------------- -pro.menu.cpu.8MHzatmega168=ATmega168 (3.3V, 8 MHz) - -pro.menu.cpu.8MHzatmega168.upload.maximum_size=14336 -pro.menu.cpu.8MHzatmega168.upload.maximum_data_size=1024 -pro.menu.cpu.8MHzatmega168.upload.speed=19200 - -pro.menu.cpu.8MHzatmega168.bootloader.low_fuses=0xc6 -pro.menu.cpu.8MHzatmega168.bootloader.high_fuses=0xdd -pro.menu.cpu.8MHzatmega168.bootloader.extended_fuses=0x00 -pro.menu.cpu.8MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex - -pro.menu.cpu.8MHzatmega168.build.mcu=atmega168 -pro.menu.cpu.8MHzatmega168.build.f_cpu=8000000L - -############################################################## - -atmegang.name=Arduino NG or older - -atmegang.upload.tool=avrdude -atmegang.upload.protocol=arduino -atmegang.upload.speed=19200 - -atmegang.bootloader.tool=avrdude -atmegang.bootloader.unlock_bits=0x3F -atmegang.bootloader.lock_bits=0x0F - -atmegang.build.mcu=atmegang -atmegang.build.f_cpu=16000000L -atmegang.build.board=AVR_NG -atmegang.build.core=arduino -atmegang.build.variant=standard - -## Arduino NG or older w/ ATmega168 -## -------------------------------- -atmegang.menu.cpu.atmega168=ATmega168 - -atmegang.menu.cpu.atmega168.upload.maximum_size=14336 -atmegang.menu.cpu.atmega168.upload.maximum_data_size=1024 - -atmegang.menu.cpu.atmega168.bootloader.low_fuses=0xff -atmegang.menu.cpu.atmega168.bootloader.high_fuses=0xdd -atmegang.menu.cpu.atmega168.bootloader.extended_fuses=0x00 -atmegang.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex - -atmegang.menu.cpu.atmega168.build.mcu=atmega168 - -## Arduino NG or older w/ ATmega8 -## ------------------------------ -atmegang.menu.cpu.atmega8=ATmega8 - -atmegang.menu.cpu.atmega8.upload.maximum_size=7168 -atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024 - -atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xdf -atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca -atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex - -atmegang.menu.cpu.atmega8.build.mcu=atmega8 - -############################################################## - -robotControl.name=Arduino Robot Control -robotControl.vid.0=0x2341 -robotControl.pid.0=0x0038 -robotControl.vid.1=0x2341 -robotControl.pid.1=0x8038 -robotControl.vid.2=0x2A03 -robotControl.pid.2=0x0038 -robotControl.vid.3=0x2A03 -robotControl.pid.3=0x8038 - -robotControl.vid.0x2A03.warning=Uncertified - -robotControl.upload.tool=avrdude -robotControl.upload.protocol=avr109 -robotControl.upload.maximum_size=28672 -robotControl.upload.maximum_data_size=2560 -robotControl.upload.speed=57600 -robotControl.upload.disable_flushing=true -robotControl.upload.use_1200bps_touch=true -robotControl.upload.wait_for_upload_port=true - -robotControl.bootloader.tool=avrdude -robotControl.bootloader.low_fuses=0xff -robotControl.bootloader.high_fuses=0xd8 -robotControl.bootloader.extended_fuses=0xcb -robotControl.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Control.hex -robotControl.bootloader.unlock_bits=0x3F -robotControl.bootloader.lock_bits=0x2F - -robotControl.build.mcu=atmega32u4 -robotControl.build.f_cpu=16000000L -robotControl.build.vid=0x2341 -robotControl.build.pid=0x8038 -robotControl.build.usb_product="Robot Control" -robotControl.build.board=AVR_ROBOT_CONTROL -robotControl.build.core=arduino -robotControl.build.variant=robot_control -robotControl.build.extra_flags={build.usb_flags} - -############################################################## - -robotMotor.name=Arduino Robot Motor -robotMotor.vid.0=0x2341 -robotMotor.pid.0=0x0039 -robotMotor.vid.1=0x2341 -robotMotor.pid.1=0x8039 -robotMotor.vid.2=0x2A03 -robotMotor.pid.2=0x0039 -robotMotor.vid.3=0x2A03 -robotMotor.pid.3=0x8039 - -robotMotor.vid.0x2A03.warning=Uncertified - -robotMotor.upload.tool=avrdude -robotMotor.upload.protocol=avr109 -robotMotor.upload.maximum_size=28672 -robotMotor.upload.maximum_data_size=2560 -robotMotor.upload.speed=57600 -robotMotor.upload.disable_flushing=true -robotMotor.upload.use_1200bps_touch=true -robotMotor.upload.wait_for_upload_port=true - -robotMotor.bootloader.tool=avrdude -robotMotor.bootloader.low_fuses=0xff -robotMotor.bootloader.high_fuses=0xd8 -robotMotor.bootloader.extended_fuses=0xcb -robotMotor.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Motor.hex -robotMotor.bootloader.unlock_bits=0x3F -robotMotor.bootloader.lock_bits=0x2F - -robotMotor.build.mcu=atmega32u4 -robotMotor.build.f_cpu=16000000L -robotMotor.build.vid=0x2341 -robotMotor.build.pid=0x8039 -robotMotor.build.usb_product="Robot Motor" -robotMotor.build.board=AVR_ROBOT_MOTOR -robotMotor.build.core=arduino -robotMotor.build.variant=robot_motor -robotMotor.build.extra_flags={build.usb_flags} - diff --git a/arduino/boards.txt.arduino106 b/arduino/boards.txt.arduino106 deleted file mode 100644 index bc3402c3..00000000 --- a/arduino/boards.txt.arduino106 +++ /dev/null @@ -1,580 +0,0 @@ -# See: http://code.google.com/p/arduino/wiki/Platforms -############################################################# -evse.name=[USBasp]OpenEVSE -evse.upload.using=USBasp -evse.upload.maximum_size=32768 -evse.bootloader.low_fuses=0xff -evse.bootloader.high_fuses=0xdf -evse.bootloader.extended_fuses=0x04 -evse.bootloader.unlock_bits=0x3F -evse.bootloader.lock_bits=0x0F -evse.build.mcu=atmega328p -evse.build.f_cpu=16000000L -evse.build.core=arduino -evse.build.variant=standard - -############################################################## - -uno.name=Arduino Uno -uno.upload.protocol=arduino -uno.upload.maximum_size=32256 -uno.upload.speed=115200 -uno.bootloader.low_fuses=0xff -uno.bootloader.high_fuses=0xde -uno.bootloader.extended_fuses=0x05 -uno.bootloader.path=optiboot -uno.bootloader.file=optiboot_atmega328.hex -uno.bootloader.unlock_bits=0x3F -uno.bootloader.lock_bits=0x0F -uno.build.mcu=atmega328p -uno.build.f_cpu=16000000L -uno.build.core=arduino -uno.build.variant=standard - -############################################################## - -atmega328.name=Arduino Duemilanove w/ ATmega328 - -atmega328.upload.protocol=arduino -atmega328.upload.maximum_size=30720 -atmega328.upload.speed=57600 - -atmega328.bootloader.low_fuses=0xFF -atmega328.bootloader.high_fuses=0xDA -atmega328.bootloader.extended_fuses=0x05 -atmega328.bootloader.path=atmega -atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex -atmega328.bootloader.unlock_bits=0x3F -atmega328.bootloader.lock_bits=0x0F - -atmega328.build.mcu=atmega328p -atmega328.build.f_cpu=16000000L -atmega328.build.core=arduino -atmega328.build.variant=standard - -############################################################## - -diecimila.name=Arduino Diecimila or Duemilanove w/ ATmega168 - -diecimila.upload.protocol=arduino -diecimila.upload.maximum_size=14336 -diecimila.upload.speed=19200 - -diecimila.bootloader.low_fuses=0xff -diecimila.bootloader.high_fuses=0xdd -diecimila.bootloader.extended_fuses=0x00 -diecimila.bootloader.path=atmega -diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex -diecimila.bootloader.unlock_bits=0x3F -diecimila.bootloader.lock_bits=0x0F - -diecimila.build.mcu=atmega168 -diecimila.build.f_cpu=16000000L -diecimila.build.core=arduino -diecimila.build.variant=standard - -############################################################## - -nano328.name=Arduino Nano w/ ATmega328 - -nano328.upload.protocol=arduino -nano328.upload.maximum_size=30720 -nano328.upload.speed=57600 - -nano328.bootloader.low_fuses=0xFF -nano328.bootloader.high_fuses=0xDA -nano328.bootloader.extended_fuses=0x05 -nano328.bootloader.path=atmega -nano328.bootloader.file=ATmegaBOOT_168_atmega328.hex -nano328.bootloader.unlock_bits=0x3F -nano328.bootloader.lock_bits=0x0F - -nano328.build.mcu=atmega328p -nano328.build.f_cpu=16000000L -nano328.build.core=arduino -nano328.build.variant=eightanaloginputs - -############################################################## - -nano.name=Arduino Nano w/ ATmega168 - -nano.upload.protocol=arduino -nano.upload.maximum_size=14336 -nano.upload.speed=19200 - -nano.bootloader.low_fuses=0xff -nano.bootloader.high_fuses=0xdd -nano.bootloader.extended_fuses=0x00 -nano.bootloader.path=atmega -nano.bootloader.file=ATmegaBOOT_168_diecimila.hex -nano.bootloader.unlock_bits=0x3F -nano.bootloader.lock_bits=0x0F - -nano.build.mcu=atmega168 -nano.build.f_cpu=16000000L -nano.build.core=arduino -nano.build.variant=eightanaloginputs - -############################################################## - -mega2560.name=Arduino Mega 2560 or Mega ADK - -mega2560.upload.protocol=wiring -mega2560.upload.maximum_size=258048 -mega2560.upload.speed=115200 - -mega2560.bootloader.low_fuses=0xFF -mega2560.bootloader.high_fuses=0xD8 -mega2560.bootloader.extended_fuses=0xFD -mega2560.bootloader.path=stk500v2 -mega2560.bootloader.file=stk500boot_v2_mega2560.hex -mega2560.bootloader.unlock_bits=0x3F -mega2560.bootloader.lock_bits=0x0F - -mega2560.build.mcu=atmega2560 -mega2560.build.f_cpu=16000000L -mega2560.build.core=arduino -mega2560.build.variant=mega - -############################################################## - -mega.name=Arduino Mega (ATmega1280) - -mega.upload.protocol=arduino -mega.upload.maximum_size=126976 -mega.upload.speed=57600 - -mega.bootloader.low_fuses=0xFF -mega.bootloader.high_fuses=0xDA -mega.bootloader.extended_fuses=0xF5 -mega.bootloader.path=atmega -mega.bootloader.file=ATmegaBOOT_168_atmega1280.hex -mega.bootloader.unlock_bits=0x3F -mega.bootloader.lock_bits=0x0F - -mega.build.mcu=atmega1280 -mega.build.f_cpu=16000000L -mega.build.core=arduino -mega.build.variant=mega - -############################################################## - -leonardo.name=Arduino Leonardo -leonardo.upload.protocol=avr109 -leonardo.upload.maximum_size=28672 -leonardo.upload.speed=57600 -leonardo.upload.disable_flushing=true -leonardo.bootloader.low_fuses=0xff -leonardo.bootloader.high_fuses=0xd8 -leonardo.bootloader.extended_fuses=0xcb -leonardo.bootloader.path=caterina -leonardo.bootloader.file=Caterina-Leonardo.hex -leonardo.bootloader.unlock_bits=0x3F -leonardo.bootloader.lock_bits=0x2F -leonardo.build.mcu=atmega32u4 -leonardo.build.f_cpu=16000000L -leonardo.build.vid=0x2341 -leonardo.build.pid=0x8036 -leonardo.build.core=arduino -leonardo.build.variant=leonardo - -############################################################## - -esplora.name=Arduino Esplora -esplora.upload.protocol=avr109 -esplora.upload.maximum_size=28672 -esplora.upload.speed=57600 -esplora.upload.disable_flushing=true -esplora.bootloader.low_fuses=0xff -esplora.bootloader.high_fuses=0xd8 -esplora.bootloader.extended_fuses=0xcb -esplora.bootloader.path=caterina -esplora.bootloader.file=Caterina-Esplora.hex -esplora.bootloader.unlock_bits=0x3F -esplora.bootloader.lock_bits=0x2F -esplora.build.mcu=atmega32u4 -esplora.build.f_cpu=16000000L -esplora.build.vid=0x2341 -esplora.build.pid=0x803C -esplora.build.core=arduino -esplora.build.variant=leonardo - -############################################################## - -micro.name=Arduino Micro -micro.upload.protocol=avr109 -micro.upload.maximum_size=28672 -micro.upload.speed=57600 -micro.upload.disable_flushing=true -micro.bootloader.low_fuses=0xff -micro.bootloader.high_fuses=0xd8 -micro.bootloader.extended_fuses=0xcb -micro.bootloader.path=caterina -micro.bootloader.file=Caterina-Micro.hex -micro.bootloader.unlock_bits=0x3F -micro.bootloader.lock_bits=0x2F -micro.build.mcu=atmega32u4 -micro.build.f_cpu=16000000L -micro.build.vid=0x2341 -micro.build.pid=0x8037 -micro.build.core=arduino -micro.build.variant=micro - -############################################################## - -mini328.name=Arduino Mini w/ ATmega328 - -mini328.upload.protocol=arduino -mini328.upload.maximum_size=28672 -mini328.upload.speed=115200 - -mini328.bootloader.low_fuses=0xff -mini328.bootloader.high_fuses=0xd8 -mini328.bootloader.extended_fuses=0x05 -mini328.bootloader.path=optiboot -mini328.bootloader.file=optiboot_atmega328-Mini.hex -mini328.bootloader.unlock_bits=0x3F -mini328.bootloader.lock_bits=0x0F - -mini328.build.mcu=atmega328p -mini328.build.f_cpu=16000000L -mini328.build.core=arduino -mini328.build.variant=eightanaloginputs - -############################################################## - -mini.name=Arduino Mini w/ ATmega168 - -mini.upload.protocol=arduino -mini.upload.maximum_size=14336 -mini.upload.speed=19200 - -mini.bootloader.low_fuses=0xff -mini.bootloader.high_fuses=0xdd -mini.bootloader.extended_fuses=0x00 -mini.bootloader.path=atmega -mini.bootloader.file=ATmegaBOOT_168_ng.hex -mini.bootloader.unlock_bits=0x3F -mini.bootloader.lock_bits=0x0F - -mini.build.mcu=atmega168 -mini.build.f_cpu=16000000L -mini.build.core=arduino -mini.build.variant=eightanaloginputs - -############################################################## - -ethernet.name=Arduino Ethernet - -ethernet.upload.protocol=arduino -ethernet.upload.maximum_size=32256 -ethernet.upload.speed=115200 - -ethernet.bootloader.low_fuses=0xff -ethernet.bootloader.high_fuses=0xde -ethernet.bootloader.extended_fuses=0x05 -ethernet.bootloader.path=optiboot -ethernet.bootloader.file=optiboot_atmega328.hex -ethernet.bootloader.unlock_bits=0x3F -ethernet.bootloader.lock_bits=0x0F - -ethernet.build.variant=ethernet -ethernet.build.mcu=atmega328p -ethernet.build.f_cpu=16000000L -ethernet.build.core=arduino - -############################################################## - -fio.name=Arduino Fio - -fio.upload.protocol=arduino -fio.upload.maximum_size=30720 -fio.upload.speed=57600 - -fio.bootloader.low_fuses=0xFF -fio.bootloader.high_fuses=0xDA -fio.bootloader.extended_fuses=0x05 -fio.bootloader.path=arduino:atmega -fio.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex -fio.bootloader.unlock_bits=0x3F -fio.bootloader.lock_bits=0x0F - -fio.build.mcu=atmega328p -fio.build.f_cpu=8000000L -fio.build.core=arduino -fio.build.variant=eightanaloginputs - -############################################################## - -bt328.name=Arduino BT w/ ATmega328 - -bt328.upload.protocol=arduino -bt328.upload.maximum_size=28672 -bt328.upload.speed=19200 -bt328.upload.disable_flushing=true - -bt328.bootloader.low_fuses=0xff -bt328.bootloader.high_fuses=0xd8 -bt328.bootloader.extended_fuses=0x05 -bt328.bootloader.path=bt -bt328.bootloader.file=ATmegaBOOT_168_atmega328_bt.hex -bt328.bootloader.unlock_bits=0x3F -bt328.bootloader.lock_bits=0x0F - -bt328.build.mcu=atmega328p -bt328.build.f_cpu=16000000L -bt328.build.core=arduino -bt328.build.variant=eightanaloginputs - -############################################################## - -bt.name=Arduino BT w/ ATmega168 - -bt.upload.protocol=arduino -bt.upload.maximum_size=14336 -bt.upload.speed=19200 -bt.upload.disable_flushing=true - -bt.bootloader.low_fuses=0xff -bt.bootloader.high_fuses=0xdd -bt.bootloader.extended_fuses=0x00 -bt.bootloader.path=bt -bt.bootloader.file=ATmegaBOOT_168.hex -bt.bootloader.unlock_bits=0x3F -bt.bootloader.lock_bits=0x0F - -bt.build.mcu=atmega168 -bt.build.f_cpu=16000000L -bt.build.core=arduino -bt.build.variant=eightanaloginputs - -############################################################## - -LilyPadUSB.name=LilyPad Arduino USB -LilyPadUSB.upload.protocol=avr109 -LilyPadUSB.upload.maximum_size=28672 -LilyPadUSB.upload.speed=57600 -LilyPadUSB.upload.disable_flushing=true -LilyPadUSB.bootloader.low_fuses=0xff -LilyPadUSB.bootloader.high_fuses=0xd8 -LilyPadUSB.bootloader.extended_fuses=0xce -LilyPadUSB.bootloader.path=caterina-LilyPadUSB -LilyPadUSB.bootloader.file=Caterina-LilyPadUSB.hex -LilyPadUSB.bootloader.unlock_bits=0x3F -LilyPadUSB.bootloader.lock_bits=0x2F -LilyPadUSB.build.mcu=atmega32u4 -LilyPadUSB.build.f_cpu=8000000L -LilyPadUSB.build.vid=0x1B4F -LilyPadUSB.build.pid=0x9208 -LilyPadUSB.build.core=arduino -LilyPadUSB.build.variant=leonardo - -############################################################## - -lilypad328.name=LilyPad Arduino w/ ATmega328 - -lilypad328.upload.protocol=arduino -lilypad328.upload.maximum_size=30720 -lilypad328.upload.speed=57600 - -lilypad328.bootloader.low_fuses=0xFF -lilypad328.bootloader.high_fuses=0xDA -lilypad328.bootloader.extended_fuses=0x05 -lilypad328.bootloader.path=atmega -lilypad328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex -lilypad328.bootloader.unlock_bits=0x3F -lilypad328.bootloader.lock_bits=0x0F - -lilypad328.build.mcu=atmega328p -lilypad328.build.f_cpu=8000000L -lilypad328.build.core=arduino -lilypad328.build.variant=standard - -############################################################## - -lilypad.name=LilyPad Arduino w/ ATmega168 - -lilypad.upload.protocol=arduino -lilypad.upload.maximum_size=14336 -lilypad.upload.speed=19200 - -lilypad.bootloader.low_fuses=0xe2 -lilypad.bootloader.high_fuses=0xdd -lilypad.bootloader.extended_fuses=0x00 -lilypad.bootloader.path=lilypad -lilypad.bootloader.file=LilyPadBOOT_168.hex -lilypad.bootloader.unlock_bits=0x3F -lilypad.bootloader.lock_bits=0x0F - -lilypad.build.mcu=atmega168 -lilypad.build.f_cpu=8000000L -lilypad.build.core=arduino -lilypad.build.variant=standard - -############################################################## - -pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 - -pro5v328.upload.protocol=arduino -pro5v328.upload.maximum_size=30720 -pro5v328.upload.speed=57600 - -pro5v328.bootloader.low_fuses=0xFF -pro5v328.bootloader.high_fuses=0xDA -pro5v328.bootloader.extended_fuses=0x05 -pro5v328.bootloader.path=atmega -pro5v328.bootloader.file=ATmegaBOOT_168_atmega328.hex -pro5v328.bootloader.unlock_bits=0x3F -pro5v328.bootloader.lock_bits=0x0F - -pro5v328.build.mcu=atmega328p -pro5v328.build.f_cpu=16000000L -pro5v328.build.core=arduino -pro5v328.build.variant=standard - -############################################################## - -pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 - -pro5v.upload.protocol=arduino -pro5v.upload.maximum_size=14336 -pro5v.upload.speed=19200 - -pro5v.bootloader.low_fuses=0xff -pro5v.bootloader.high_fuses=0xdd -pro5v.bootloader.extended_fuses=0x00 -pro5v.bootloader.path=atmega -pro5v.bootloader.file=ATmegaBOOT_168_diecimila.hex -pro5v.bootloader.unlock_bits=0x3F -pro5v.bootloader.lock_bits=0x0F - -pro5v.build.mcu=atmega168 -pro5v.build.f_cpu=16000000L -pro5v.build.core=arduino -pro5v.build.variant=standard - -############################################################## - -pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 - -pro328.upload.protocol=arduino -pro328.upload.maximum_size=30720 -pro328.upload.speed=57600 - -pro328.bootloader.low_fuses=0xFF -pro328.bootloader.high_fuses=0xDA -pro328.bootloader.extended_fuses=0x05 -pro328.bootloader.path=atmega -pro328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex -pro328.bootloader.unlock_bits=0x3F -pro328.bootloader.lock_bits=0x0F - -pro328.build.mcu=atmega328p -pro328.build.f_cpu=8000000L -pro328.build.core=arduino -pro328.build.variant=standard - -############################################################## - -pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 - -pro.upload.protocol=arduino -pro.upload.maximum_size=14336 -pro.upload.speed=19200 - -pro.bootloader.low_fuses=0xc6 -pro.bootloader.high_fuses=0xdd -pro.bootloader.extended_fuses=0x00 -pro.bootloader.path=atmega -pro.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex -pro.bootloader.unlock_bits=0x3F -pro.bootloader.lock_bits=0x0F - -pro.build.mcu=atmega168 -pro.build.f_cpu=8000000L -pro.build.core=arduino -pro.build.variant=standard - -############################################################## - -atmega168.name=Arduino NG or older w/ ATmega168 - -atmega168.upload.protocol=arduino -atmega168.upload.maximum_size=14336 -atmega168.upload.speed=19200 - -atmega168.bootloader.low_fuses=0xff -atmega168.bootloader.high_fuses=0xdd -atmega168.bootloader.extended_fuses=0x00 -atmega168.bootloader.path=atmega -atmega168.bootloader.file=ATmegaBOOT_168_ng.hex -atmega168.bootloader.unlock_bits=0x3F -atmega168.bootloader.lock_bits=0x0F - -atmega168.build.mcu=atmega168 -atmega168.build.f_cpu=16000000L -atmega168.build.core=arduino -atmega168.build.variant=standard - -############################################################## - -atmega8.name=Arduino NG or older w/ ATmega8 - -atmega8.upload.protocol=arduino -atmega8.upload.maximum_size=7168 -atmega8.upload.speed=19200 - -atmega8.bootloader.low_fuses=0xdf -atmega8.bootloader.high_fuses=0xca -atmega8.bootloader.path=atmega8 -atmega8.bootloader.file=ATmegaBOOT-prod-firmware-2009-11-07.hex -atmega8.bootloader.unlock_bits=0x3F -atmega8.bootloader.lock_bits=0x0F - -atmega8.build.mcu=atmega8 -atmega8.build.f_cpu=16000000L -atmega8.build.core=arduino -atmega8.build.variant=standard - -############################################################## - -robotControl.name=Arduino Robot Control -robotControl.upload.protocol=avr109 -robotControl.upload.maximum_size=28672 -robotControl.upload.speed=57600 -robotControl.upload.disable_flushing=true -robotControl.bootloader.low_fuses=0xff -robotControl.bootloader.high_fuses=0xd8 -robotControl.bootloader.extended_fuses=0xcb -robotControl.bootloader.path=caterina-Arduino_Robot -robotControl.bootloader.file=Caterina-Robot-Control.hex -robotControl.bootloader.unlock_bits=0x3F -robotControl.bootloader.lock_bits=0x2F -robotControl.build.mcu=atmega32u4 -robotControl.build.f_cpu=16000000L -robotControl.build.vid=0x2341 -robotControl.build.pid=0x8038 -robotControl.build.core=robot -robotControl.build.variant=robot_control - -############################################################## - -robotMotor.name=Arduino Robot Motor -robotMotor.upload.protocol=avr109 -robotMotor.upload.maximum_size=28672 -robotMotor.upload.speed=57600 -robotMotor.upload.disable_flushing=true -robotMotor.bootloader.low_fuses=0xff -robotMotor.bootloader.high_fuses=0xd8 -robotMotor.bootloader.extended_fuses=0xcb -robotMotor.bootloader.path=caterina-Arduino_Robot -robotMotor.bootloader.file=Caterina-Robot-Motor.hex -robotMotor.bootloader.unlock_bits=0x3F -robotMotor.bootloader.lock_bits=0x2F -robotMotor.build.mcu=atmega32u4 -robotMotor.build.f_cpu=16000000L -robotMotor.build.vid=0x2341 -robotMotor.build.pid=0x8039 -robotMotor.build.core=robot -robotMotor.build.variant=robot_motor - diff --git a/firmware/open_evse/CHANGELOG b/firmware/CHANGELOG similarity index 95% rename from firmware/open_evse/CHANGELOG rename to firmware/CHANGELOG index 276c4a92..60d514dd 100644 --- a/firmware/open_evse/CHANGELOG +++ b/firmware/CHANGELOG @@ -1,5 +1,40 @@ Change Log +20260527 SCL +- get rid of old V6 detection code (and INVERT_V6_DETECTION) + -> new globals g_isV6 and g_hasCGMI initialized in initTarget() +- PP + -> if no resistor present, disable auto ampacity + -> add EVSE_STATE_PP_SHORTED + -> if shorted PP detected on boot, spin until the cable is removed + -> if cable isn't present at boot, shorted PP will only be detected + on transition to STATE B/C + -> LCD: CABLE FAULT/PP SHORTED + +20260219 SCL +- added $FF L 0|1 command to enable/disable boot lock feature + added ECF_BOOT_LOCK_DISABLED +- added $FF O 0|1 command to enable/disable overcurrent check + added ECF_OVERCURRENT_DISABLED +- fix bug: J1772EvseController::ButtonIsEnabled() was returning true when disabled +- fix bug: when in fault countdown, 16x2 LCD was still counting down on 2nd + line of LCD when in menus + +20260218 SCL +- added TEMPERATURE_THROTTLING - if not enabled, only TEMPERATURE_AMBIENT_PANIC + is enforced +- RAPI: added $FO - set panic temperature, $GO get panic temperature + panic temperature is saved to EEPROM. if exceeded, go into EVSE_STATE_OVER_TEMPERATURE +- it's a NO-OP, but don't enable BTN_MENU by default in open_evse.h, anyway + +20260205 SCL +- OEV6 w/ CGMI - when power is lost, temporarily triggers NO GROUND fault + delay recording of NO GROUND fault by NO_GND_RECORD_DELAY (currently 2s) + to avoid recording this spurious fault +- add RAPI $FC to clear fault counters + total energy +- had bug in max fault counters.. was checking < 254 instead of <253, so when + maxed out would be zero instead of 255 (since returned value is count+1) + 20230207 SCL - PP_AUTO_AMPACITY changes -> used to change current capacity to PP ampacity. now, only change it @@ -220,7 +255,7 @@ D5.0.1 20181018 SCL - added RELAY_AUTO_PWM code - not tested - needs PWM-capable pin to function 20180523 SCL -- when RTC not defined, g++ bug pops out: +- when HAVE_RTC not defined, g++ bug pops out: open_evse:2384: error: unable to find a register to spill in class 'NO_REGS' -> add GPPBUGKLUDGE diff --git a/firmware/open_evse/AutoCurrentCapacityController.cpp b/firmware/open_evse/AutoCurrentCapacityController.cpp index 7532adde..bb365e62 100644 --- a/firmware/open_evse/AutoCurrentCapacityController.cpp +++ b/firmware/open_evse/AutoCurrentCapacityController.cpp @@ -16,6 +16,7 @@ #ifdef PP_AUTO_AMPACITY +#if (ADC_RESOLUTION_BITS == 10) static PP_AMPS s_ppAmps[] = { {0,0}, {93,63}, // 100 = 93 @@ -24,6 +25,16 @@ static PP_AMPS s_ppAmps[] = { {615,13}, // 1.5K = 615 {1023,0} }; +#elif (ADC_RESOLUTION_BITS == 12) +static PP_AMPS s_ppAmps[] = { + {0,0}, + {93*4,63}, // 100 = 93 + {185*4,32}, // 220 = 185 + {415*4,20}, // 680 = 415 + {615*4,13}, // 1.5K = 615 + {4095,0} +}; +#endif AutoCurrentCapacityController::AutoCurrentCapacityController() : adcPP(PP_PIN) @@ -35,7 +46,7 @@ uint8_t AutoCurrentCapacityController::ReadPPMaxAmps() // n.b. should probably sample a few times and average it uint16_t adcval = adcPP.read(); - uint8_t amps = 0; + uint8_t amps = PP_AMPS_ABSENT; for (uint8_t i=1;i < sizeof(s_ppAmps)/sizeof(s_ppAmps[0]);i++) { if (adcval <= (s_ppAmps[i].adcVal - (s_ppAmps[i].adcVal - s_ppAmps[i-1].adcVal)/2)) { amps = s_ppAmps[i-1].amps; @@ -54,13 +65,18 @@ uint8_t AutoCurrentCapacityController::AutoSetCurrentCapacity() { uint8_t amps = ReadPPMaxAmps(); - if (amps) { + if (amps == PP_AMPS_ABSENT) { + // open circuit - no cable present, charge at configured capacity + return 0; + } + else if (amps) { if (g_EvseController.GetCurrentCapacity() > ppMaxAmps) { g_EvseController.SetCurrentCapacity(ppMaxAmps,1,1); } return 0; } else { + // ADC near zero - short on PP pin, block charging return 1; } } diff --git a/firmware/open_evse/AutoCurrentCapacityController.h b/firmware/open_evse/AutoCurrentCapacityController.h index 076d570b..6f8c405a 100644 --- a/firmware/open_evse/AutoCurrentCapacityController.h +++ b/firmware/open_evse/AutoCurrentCapacityController.h @@ -13,7 +13,10 @@ // See LICENSE for a copy of the GNU General Public License or see // it online at . -#include "avrstuff.h" +#include "open_evse.h" + +// fake value denoting no resistor present +#define PP_AMPS_ABSENT 0xFF typedef struct pp_amps { uint16_t adcVal; diff --git a/firmware/open_evse/EnergyMeter.cpp b/firmware/open_evse/EnergyMeter.cpp index 7f7e4b68..4b0f4af5 100644 --- a/firmware/open_evse/EnergyMeter.cpp +++ b/firmware/open_evse/EnergyMeter.cpp @@ -5,7 +5,7 @@ EnergyMeter g_EnergyMeter; -EnergyMeter::EnergyMeter() +void EnergyMeter::Init() { m_bFlags = 0; m_wattSeconds = 0; @@ -127,5 +127,11 @@ void EnergyMeter::SaveTotkWh() eeprom_write_dword((uint32_t*)EOFS_KWH_ACCUMULATED,m_wattHoursTot); } + +void EnergyMeter::ResetTotkWh() { + eeprom_write_dword((uint32_t*)EOFS_KWH_ACCUMULATED,0); + m_wattHoursTot = 0; +} + #endif // KWH_RECORDING diff --git a/firmware/open_evse/EnergyMeter.h b/firmware/open_evse/EnergyMeter.h index 7db9e4fd..713526d1 100644 --- a/firmware/open_evse/EnergyMeter.h +++ b/firmware/open_evse/EnergyMeter.h @@ -31,13 +31,15 @@ class EnergyMeter { void endSession(); public: - EnergyMeter(); + EnergyMeter() {} + void Init(); void Update(); void SaveTotkWh(); void SetTotkWh(uint32_t whtot) { m_wattHoursTot = whtot; } uint32_t GetTotkWh() { return m_wattHoursTot; } uint32_t GetSessionWs() { return m_wattSeconds; } + void ResetTotkWh(); }; diff --git a/firmware/open_evse/J1772EvseController.cpp b/firmware/open_evse/J1772EvseController.cpp index cc971c0c..5eb11b1b 100644 --- a/firmware/open_evse/J1772EvseController.cpp +++ b/firmware/open_evse/J1772EvseController.cpp @@ -26,9 +26,6 @@ long g_CycleHalfStart; uint8_t g_CycleState; #endif -// A/B B/C C/D D DS -THRESH_DATA J1772EVSEController::m_ThreshData = {875,780,690,0,260}; - J1772EVSEController g_EvseController; #ifdef AMMETER @@ -59,6 +56,9 @@ void J1772EVSEController::readAmmeter() { WDT_RESET(); +#ifdef AMMETER_TEST + uint32_t max = 0; +#endif unsigned long sum = 0; uint8_t zero_crossings = 0; unsigned long last_zero_crossing_time = 0, now_ms; @@ -66,11 +66,13 @@ void J1772EVSEController::readAmmeter() uint16_t last_sample; unsigned int sample_count = 0; for(unsigned long start = millis(); ((now_ms = millis()) - start) < CURRENT_SAMPLE_INTERVAL; ) { - // the A/d is 0 to 1023. uint16_t sample = adcCurrent.read(); +#ifdef AMMETER_TEST + if (max < sample) max = sample; +#endif // If this isn't the first sample, and if the sign of the value differs from the // sign of the previous value, then count that as a zero crossing. - if (!is_first_sample && ((last_sample > 512) != (sample > 512))) { + if (!is_first_sample && ((last_sample > ADC_HALF) != (sample > ADC_HALF))) { // Once we've seen a zero crossing, don't look for one for a little bit. // It's possible that a little noise near zero could cause a two-sample // inversion. @@ -87,7 +89,7 @@ void J1772EVSEController::readAmmeter() case 1: case 2: // Gather the sum-of-the-squares and count how many samples we've collected. - sum += (unsigned long)(((long)sample - 512) * ((long)sample - 512)); + sum += (unsigned long)(((long)sample - ADC_HALF) * ((long)sample - ADC_HALF)); sample_count++; continue; case 3: @@ -95,6 +97,14 @@ void J1772EVSEController::readAmmeter() // But additionally, that value must be scaled to a real current value. // we will do that elsewhere m_AmmeterReading = ulong_sqrt(sum / sample_count); +#ifdef AMMETER_TEST + { + char s[80]; + long instantma = m_AmmeterReading*m_CurrentScaleFactor - m_AmmeterCurrentOffset; + sprintf(s,"%u %u %d",max,m_AmmeterReading,instantma); + RAPI_SERIAL_PORT.println(s); + } +#endif return; } } @@ -146,7 +156,7 @@ uint32_t MovingAverage(uint32_t samp) #endif // AMMETER J1772EVSEController::J1772EVSEController() : - adcPilot(PILOT_PIN) + adcPilot(PILOT_SENSE_PIN) #ifdef CURRENT_PIN , adcCurrent(CURRENT_PIN) #endif @@ -204,9 +214,13 @@ void J1772EVSEController::Reboot() wdt_delay(3000); } +#ifdef TARGET_SAMD + NVIC_SystemReset(); +#else // !TARGET_SAMD // hardware reset by forcing watchdog to timeout - wdt_enable(WDTO_1S); // enable watchdog timer + WDT_ENABLE_1S(); // enable watchdog timer delay(1500); +#endif } @@ -272,8 +286,8 @@ void J1772EVSEController::chargingOn() #ifdef OEV6 if (isV6()) { #ifdef RELAY_PWM - Serial.print("\nrelayCloseMs: ");Serial.println(m_relayCloseMs); - Serial.print("relayHoldPwm: ");Serial.println(m_relayHoldPwm); +// Serial.print("\nrelayCloseMs: ");Serial.println(m_relayCloseMs); +// Serial.print("relayHoldPwm: ");Serial.println(m_relayHoldPwm); // turn on charging pin to close relay digitalWrite(V6_CHARGING_PIN,HIGH); digitalWrite(V6_CHARGING_PIN2,HIGH); @@ -298,7 +312,7 @@ void J1772EVSEController::chargingOn() } #endif // OEV6 #ifdef CHARGINGAC_REG - pinChargingAC.write(1); + pinChargingAC.write(1); #endif setVFlags(ECVF_CHARGING_ON); @@ -352,6 +366,23 @@ void J1772EVSEController::chargingOff() #endif } +#ifdef PP_AUTO_AMPACITY +void J1772EVSEController::DoPPShorted() +{ + m_EvseState = EVSE_STATE_PP_SHORTED; + g_OBD.Update(OBD_UPD_FORCE); +#ifdef RAPI + RapiSendEvseState(); +#endif + while (g_ACCController.ReadPPMaxAmps() == 0) { + ProcessInputs(); + WDT_RESET(); + delay(100); + } + m_EvseState = EVSE_STATE_UNKNOWN; +} +#endif // PP_AUTO_AMPACITY + void J1772EVSEController::HardFault(int8_t recoverable) { SetHardFault(); @@ -475,7 +506,7 @@ uint8_t J1772EVSEController::EnableAutoSvcLevel(uint8_t tf) { int rc = 0; if (tf) { - if (CGMIisEnabled()) rc = 1; + if (hasCGMI()) rc = 1; else clrFlags(ECF_AUTO_SVC_LEVEL_DISABLED); } else { @@ -678,7 +709,7 @@ uint8_t J1772EVSEController::doPost() WDT_RESET(); uint8_t RelayOff; -#ifndef OPENEVSE_2 +#if !defined(OPENEVSE_2) && defined(AUTOSVCLEVEL) uint8_t Relay1, Relay2; //Relay Power status #endif uint8_t svcState = UD; // service state = undefined @@ -689,8 +720,16 @@ uint8_t J1772EVSEController::doPost() } #endif //#ifdef SERDBG +#ifdef CALIBRATE + while (1) { + CALIB_DATA cd; + Calibrate(&cd); +} + +#endif // CALIBRATE - m_Pilot.SetState(PILOT_STATE_P12); //check to see if EV is plugged in + + m_Pilot.SetState(PILOT_STATE_PWM); //check to see if EV is plugged in g_OBD.SetRedLed(1); #ifdef LCD16X2 //Adafruit RGB LCD @@ -720,7 +759,7 @@ uint8_t J1772EVSEController::doPost() #else //!OPENEVSE_2 delay(150); // delay reading for stable pilot before reading - int reading = adcPilot.read(); //read pilot + uint16_t reading = adcPilot.read(); //read pilot #ifdef SERDBG if (SerDbgEnabled()) { Serial.print("Pilot: ");Serial.println((int)reading); @@ -729,10 +768,10 @@ uint8_t J1772EVSEController::doPost() m_Pilot.SetState(PILOT_STATE_N12); if (reading >= m_ThreshData.m_ThreshAB) { // IF EV is not connected its Okay to open the relay the do the L1/L2 and ground Check - + // save state with both relays off - for stuck relay state RelayOff = ReadACPins(); - + // save state with Relay 1 on #ifdef OEV6 if (isV6()) { @@ -750,7 +789,7 @@ uint8_t J1772EVSEController::doPost() pinChargingAC.write(1); #endif - delay(RelaySettlingTime); + wdt_delay(RelaySettlingTime); Relay1 = ReadACPins(); #ifdef OEV6 @@ -873,8 +912,8 @@ uint8_t J1772EVSEController::doPost() #endif if (StuckRelayChkEnabled()) { RelayOff = ReadACPins(); - if ((CGMIisEnabled() && !(RelayOff & RLY_TEST_PIN_OPEN)) || - (!CGMIisEnabled() && (RelayOff != ACPINS_OPEN))) { + if ((hasCGMI() && !(RelayOff & RLY_TEST_PIN_OPEN)) || + (!hasCGMI() && (RelayOff != ACPINS_OPEN))) { svcState = SR; #ifdef LCD16X2 g_OBD.LcdMsg_P(g_psTestFailed,g_psStuckRelay); @@ -925,18 +964,6 @@ uint8_t J1772EVSEController::doPost() void J1772EVSEController::Init() { -#ifdef OEV6 - DPIN_MODE_INPUT(V6_ID_REG,V6_ID_IDX); -#ifdef INVERT_V6_DETECTION - if (DPIN_READ(V6_ID_REG,V6_ID_IDX)) m_isV6 = 0; - else m_isV6 = 1; -#else - if (DPIN_READ(V6_ID_REG,V6_ID_IDX)) m_isV6 = 1; - else m_isV6 = 0; -#endif - // Serial.print("isV6: ");Serial.println(isV6()); -#endif - #ifdef MENNEKES_LOCK m_MennekesLock.Init(); #endif // MENNEKES_LOCK @@ -960,8 +987,8 @@ void J1772EVSEController::Init() m_relayCloseMs = DEFAULT_RELAY_CLOSE_MS; m_relayHoldPwm = DEFAULT_RELAY_HOLD_PWM; } - Serial.print("\nrelayCloseMs: ");Serial.println(m_relayCloseMs); - Serial.print("relayHoldPwm: ");Serial.println(m_relayHoldPwm); +// Serial.print("\nrelayCloseMs: ");Serial.println(m_relayCloseMs); +// Serial.print("relayHoldPwm: ");Serial.println(m_relayHoldPwm); #endif // RELAY_PWM @@ -1032,11 +1059,12 @@ void J1772EVSEController::Init() m_wFlags |= ECF_AUTO_SVC_LEVEL_DISABLED; #endif -#ifdef ENABLE_CGMI - m_wFlags |= ECF_CGMI; -#endif // ENABLE_CGMI - - if (CGMIisEnabled() && !flagIsSet(ECF_AUTO_SVC_LEVEL_DISABLED)) { +#ifdef OEV6 + if (g_hasCGMI) { + m_wFlags |= ECF_CGMI; + } +#endif + if (hasCGMI() && !flagIsSet(ECF_AUTO_SVC_LEVEL_DISABLED)) { // can't do auto svc level when CGMI enabled, revert to default setFlags(ECF_AUTO_SVC_LEVEL_DISABLED); svclvl = DEFAULT_SERVICE_LEVEL; @@ -1053,8 +1081,8 @@ void J1772EVSEController::Init() #endif #ifdef AMMETER - m_AmmeterCurrentOffset = eeprom_read_word((uint16_t*)EOFS_AMMETER_CURR_OFFSET); - m_CurrentScaleFactor = eeprom_read_word((uint16_t*)EOFS_CURRENT_SCALE_FACTOR); + m_AmmeterCurrentOffset = (int16_t)eeprom_read_word((uint16_t*)EOFS_AMMETER_CURR_OFFSET); + m_CurrentScaleFactor = (int16_t)eeprom_read_word((uint16_t*)EOFS_CURRENT_SCALE_FACTOR); if (m_AmmeterCurrentOffset == (int16_t)0xffff) { m_AmmeterCurrentOffset = DEFAULT_AMMETER_CURRENT_OFFSET; @@ -1065,6 +1093,20 @@ void J1772EVSEController::Init() m_AmmeterReading = 0; m_ChargingCurrent = 0; + +#ifdef AMMETER_TESTtt + // for debugging only + while (1) { + char s[80]; + readAmmeter(); + long instantma = m_AmmeterReading*m_CurrentScaleFactor - m_AmmeterCurrentOffset; + sprintf(s,"%u %u %d\n",(unsigned)adcCurrent.read(),m_AmmeterReading,instantma); + RAPI_SERIAL_PORT.print(s); + delay(250); + } +#endif // AMMETER_TEST + + #ifdef OVERCURRENT_THRESHOLD m_OverCurrentStartMs = 0; #endif //OVERCURRENT_THRESHOLD @@ -1087,10 +1129,11 @@ void J1772EVSEController::Init() m_wFlags |= ECF_MONO_LCD; #endif - m_wVFlags = ECVF_DEFAULT; + setVFlags(ECVF_DEFAULT); #ifdef BOOTLOCK - m_wVFlags |= ECVF_BOOT_LOCK; + if (BootLockIsEnabled()) + setVFlags(ECVF_BOOT_LOCK); #endif m_MaxHwCurrentCapacity = eeprom_read_byte((uint8_t*)EOFS_MAX_HW_CURRENT_CAPACITY); @@ -1192,10 +1235,10 @@ void J1772EVSEController::Init() void J1772EVSEController::ReadPilot(uint16_t *plow,uint16_t *phigh) { - uint16_t pl = 1023; + uint16_t pl = ADC_MAX; uint16_t ph = 0; - // 1x = 114us 20x = 2.3ms 100x = 11.3ms + // uint32_t sms = millis(); for (int i=0;i < PILOT_LOOP_CNT;i++) { uint16_t reading = adcPilot.read(); // measures pilot voltage @@ -1206,6 +1249,7 @@ void J1772EVSEController::ReadPilot(uint16_t *plow,uint16_t *phigh) pl = reading; } } + // RAPI_SERIAL_PORT.print("pilotread ");RAPI_SERIAL_PORT.println(millis()-sms); if (m_Pilot.GetState() != PILOT_STATE_N12) { // update prev state @@ -1244,9 +1288,10 @@ void J1772EVSEController::ReadPilot(uint16_t *plow,uint16_t *phigh) void J1772EVSEController::Update(uint8_t forcetransition) { uint16_t plow; - uint16_t phigh = 0xffff; + uint16_t phigh = ADC_MAX; unsigned long curms = millis(); + WDT_RESET(); if (m_EvseState == EVSE_STATE_DISABLED) { m_PrevEvseState = m_EvseState; // cancel state transition @@ -1332,29 +1377,32 @@ void J1772EVSEController::Update(uint8_t forcetransition) #ifdef ADVPWR uint8_t acpinstate = ReadACPins(); - if (CGMIisEnabled() && GndChkEnabled() && (acpinstate & GND_TEST_PIN_OPEN)) { + if (hasCGMI() && GndChkEnabled() && (acpinstate & GND_TEST_PIN_OPEN)) { // bad ground tmpevsestate = EVSE_STATE_NO_GROUND; m_EvseState = EVSE_STATE_NO_GROUND; chargingOff(); // open the relay - if ((prevevsestate != EVSE_STATE_NO_GROUND) && - (((uint8_t)(m_NoGndTripCnt+1)) < 254)) { - m_NoGndTripCnt++; - eeprom_write_byte((uint8_t*)EOFS_NOGND_TRIP_CNT,m_NoGndTripCnt); + if (prevevsestate != EVSE_STATE_NO_GROUND) { + m_NoGndStart = curms; + } + else if (m_NoGndStart && ((curms - m_NoGndStart) >= NO_GND_RECORD_DELAY) && + (((uint8_t)(m_NoGndTripCnt+1)) < 253)) { + eeprom_write_byte((uint8_t*)EOFS_NOGND_TRIP_CNT,++m_NoGndTripCnt); + m_NoGndStart = 0; } nofault = 0; } if (nofault) { if (chargingIsOn()) { // relay closed - if (StuckRelayChkEnabled() && CGMIisEnabled() && ((curms - m_ChargeOnTimeMS) > GROUND_CHK_DELAY) && (acpinstate & RLY_TEST_PIN_OPEN)) { + if (StuckRelayChkEnabled() && hasCGMI() && ((curms - m_ChargeOnTimeMS) > GROUND_CHK_DELAY) && (acpinstate & RLY_TEST_PIN_OPEN)) { // relay didn't close chargingOff(); // open the relay tmpevsestate = EVSE_STATE_RELAY_CLOSURE_FAULT; m_EvseState = EVSE_STATE_RELAY_CLOSURE_FAULT; nofault = 0; } - else if (!CGMIisEnabled() && ((curms - m_ChargeOnTimeMS) > GROUND_CHK_DELAY)) { + else if (!hasCGMI() && ((curms - m_ChargeOnTimeMS) > GROUND_CHK_DELAY)) { // ground check - can only test when relay closed if (GndChkEnabled() && (acpinstate == ACPINS_OPEN)) { // bad ground @@ -1362,7 +1410,7 @@ void J1772EVSEController::Update(uint8_t forcetransition) m_EvseState = EVSE_STATE_NO_GROUND; chargingOff(); // open the relay - if ((prevevsestate != EVSE_STATE_NO_GROUND) && (((uint8_t)(m_NoGndTripCnt+1)) < 254)) { + if ((prevevsestate != EVSE_STATE_NO_GROUND) && (((uint8_t)(m_NoGndTripCnt+1)) < 253)) { m_NoGndTripCnt++; eeprom_write_byte((uint8_t*)EOFS_NOGND_TRIP_CNT,m_NoGndTripCnt); } @@ -1385,7 +1433,7 @@ void J1772EVSEController::Update(uint8_t forcetransition) } } else { // !chargingIsOn() - relay open - if (!CGMIisEnabled() && (prevevsestate == EVSE_STATE_NO_GROUND)) { + if (!hasCGMI() && (prevevsestate == EVSE_STATE_NO_GROUND)) { // check to see if EV disconnected if (!EvConnected()) { // EV disconnected - cancel fault @@ -1405,8 +1453,8 @@ void J1772EVSEController::Update(uint8_t forcetransition) } } else if (StuckRelayChkEnabled()) { // stuck relay check - can test only when relay open - if ((CGMIisEnabled() && !(acpinstate & RLY_TEST_PIN_OPEN)) || - (!CGMIisEnabled() && (acpinstate != ACPINS_OPEN))) { // Stuck Relay reading + if ((hasCGMI() && !(acpinstate & RLY_TEST_PIN_OPEN)) || + (!hasCGMI() && (acpinstate != ACPINS_OPEN))) { // Stuck Relay reading if ((prevevsestate != EVSE_STATE_STUCK_RELAY) && !m_StuckRelayStartTimeMS) { //check for first occurence m_StuckRelayStartTimeMS = curms; // mark start state } @@ -1414,7 +1462,7 @@ void J1772EVSEController::Update(uint8_t forcetransition) ((curms - m_StuckRelayStartTimeMS) > STUCK_RELAY_DELAY) ) || // start delay de-bounce (prevevsestate == EVSE_STATE_STUCK_RELAY) ) { // already in error state // stuck relay - if ((prevevsestate != EVSE_STATE_STUCK_RELAY) && (((uint8_t)(m_StuckRelayTripCnt+1)) < 254)) { + if ((prevevsestate != EVSE_STATE_STUCK_RELAY) && (((uint8_t)(m_StuckRelayTripCnt+1)) < 253)) { m_StuckRelayTripCnt++; eeprom_write_byte((uint8_t*)EOFS_STUCK_RELAY_TRIP_CNT,m_StuckRelayTripCnt); } @@ -1435,7 +1483,7 @@ void J1772EVSEController::Update(uint8_t forcetransition) m_EvseState = EVSE_STATE_GFCI_FAULT; if (prevevsestate != EVSE_STATE_GFCI_FAULT) { // state transition - if (((uint8_t)(m_GfiTripCnt+1)) < 254) { + if (((uint8_t)(m_GfiTripCnt+1)) < 253) { m_GfiTripCnt++; eeprom_write_byte((uint8_t*)EOFS_GFI_TRIP_CNT,m_GfiTripCnt); } @@ -1475,9 +1523,10 @@ void J1772EVSEController::Update(uint8_t forcetransition) #ifdef TEMPERATURE_MONITORING // A state for OverTemp fault if (TempChkEnabled()) { + int16_t thresh = g_TempMonitor.GetPanicTemperature(); if ((g_TempMonitor.m_TMP007_temperature >= TEMPERATURE_INFRARED_PANIC) || - (g_TempMonitor.m_MCP9808_temperature >= TEMPERATURE_AMBIENT_PANIC) || - (g_TempMonitor.m_DS3231_temperature >= TEMPERATURE_AMBIENT_PANIC)) { + (g_TempMonitor.m_MCP9808_temperature >= thresh) || + (g_TempMonitor.m_DS3231_temperature >= thresh)) { tmpevsestate = EVSE_STATE_OVER_TEMPERATURE; m_EvseState = EVSE_STATE_OVER_TEMPERATURE; nofault = 0; @@ -1752,6 +1801,13 @@ if (TempChkEnabled()) { chargingOff(); // turn off charging current m_Pilot.SetState(PILOT_STATE_P12); } +#ifdef PP_AUTO_AMPACITY + else if (m_EvseState == EVSE_STATE_PP_SHORTED) { + // Ground not detected + chargingOff(); // turn off charging current + m_Pilot.SetState(PILOT_STATE_P12); + } +#endif // PP_AUTO_AMPACITY else if (m_EvseState == EVSE_STATE_STUCK_RELAY) { // Stuck relay detected chargingOff(); // turn off charging current @@ -1828,40 +1884,45 @@ if (TempChkEnabled()) { } #ifdef OVERCURRENT_THRESHOLD - if (m_EvseState == EVSE_STATE_C) { - //testing m_ChargingCurrent = (m_CurrentCapacity+OVERCURRENT_THRESHOLD+12)*1000L; - if (m_ChargingCurrent >= ((m_CurrentCapacity+OVERCURRENT_THRESHOLD)*1000L)) { - if (m_OverCurrentStartMs) { // already in overcurrent state - if ((millis()-m_OverCurrentStartMs) >= OVERCURRENT_TIMEOUT) { - // - // overcurrent for too long. stop charging and hard fault - // - m_EvseState = EVSE_STATE_OVER_CURRENT; - - m_Pilot.SetState(PILOT_STATE_P12); // Signal the EV to pause - curms = millis(); - while ((millis()-curms) < 1000) { // give EV 1s to stop charging - wdt_reset(); - } - chargingOff(); // open the EVSE relays hopefully the EV has already discon - - // spin until EV is disconnected - HardFault(1); - - m_OverCurrentStartMs = 0; // clear overcurrent - } + if (OverCurrentCheckIsEnabled()) { + if (m_EvseState == EVSE_STATE_C) { + // testing m_ChargingCurrent = + // (m_CurrentCapacity+OVERCURRENT_THRESHOLD+12)*1000L; + if (m_ChargingCurrent >= + ((m_CurrentCapacity + OVERCURRENT_THRESHOLD) * 1000L)) { + if (m_OverCurrentStartMs) { // already in overcurrent state + if ((millis() - m_OverCurrentStartMs) >= OVERCURRENT_TIMEOUT) { + // + // overcurrent for too long. stop charging and hard fault + // + m_EvseState = EVSE_STATE_OVER_CURRENT; + + m_Pilot.SetState(PILOT_STATE_P12); // Signal the EV to pause + curms = millis(); + while ((millis() - curms) < 1000) { // give EV 1s to stop charging + wdt_reset(); + } + chargingOff(); // open the EVSE relays hopefully the EV + // has already discon + + // spin until EV is disconnected + HardFault(1); + + m_OverCurrentStartMs = 0; // clear overcurrent + } + } + else { + m_OverCurrentStartMs = millis(); + } } else { - m_OverCurrentStartMs = millis(); + m_OverCurrentStartMs = 0; // clear overcurrent } } else { m_OverCurrentStartMs = 0; // clear overcurrent } } - else { - m_OverCurrentStartMs = 0; // clear overcurrent - } #endif // OVERCURRENT_THRESHOLD #endif // AMMETER @@ -1870,7 +1931,7 @@ if (TempChkEnabled()) { this->HsExpirationCheck(); //Check to see if HS is engaged, and if so whether we missed a pulse #endif //HEARTBEAT_SUPERVISION -#ifdef TEMPERATURE_MONITORING +#ifdef TEMPERATURE_THROTTLING if(TempChkEnabled()) { uint8_t currcap = GetMaxCurrentCapacity(); uint8_t setit = 0; @@ -1983,7 +2044,7 @@ void J1772EVSEController::Calibrate(PCALIB_DATA pcd) for (int l=0;l < 2;l++) { int reading; uint32_t tot = 0; - uint16_t plow = 1023; + uint16_t plow = ADC_MAX uint16_t phigh = 0; uint16_t avg = 0; m_Pilot.SetState(l ? PILOT_STATE_N12 : PILOT_STATE_P12); @@ -2017,6 +2078,10 @@ void J1772EVSEController::Calibrate(PCALIB_DATA pcd) pavg = avg; } } + + sprintf(g_sTmp,"p %d %d %d,n %d %d %d",pmax,pavg,pmin,nmax,navg,nmin); + RAPI_SERIAL_PORT.println(g_sTmp); + pcd->m_pMax = pmax; pcd->m_pAvg = pavg; pcd->m_pMin = pmin; @@ -2034,16 +2099,17 @@ int J1772EVSEController::SetCurrentCapacity(uint8_t amps,uint8_t updatelcd,uint8 if (nosave) { // temporary amps can't be > max set in EEPROM maxcurrentcap = GetMaxCurrentCapacity(); - } #ifdef PP_AUTO_AMPACITY if ((GetState() >= EVSE_STATE_B) && (GetState() <= EVSE_STATE_C)) { uint8_t mcc = g_ACCController.ReadPPMaxAmps(); - if (mcc && (mcc < maxcurrentcap)) { + if (mcc && (mcc != PP_AMPS_ABSENT) && (mcc < maxcurrentcap)) { maxcurrentcap = mcc; } } #endif // PP_AUTO_AMPACITY + } + if ((amps >= MIN_CURRENT_CAPACITY_J1772) && (amps <= maxcurrentcap)) { m_CurrentCapacity = amps; diff --git a/firmware/open_evse/J1772EvseController.h b/firmware/open_evse/J1772EvseController.h index a35cb354..82a5ae3e 100644 --- a/firmware/open_evse/J1772EvseController.h +++ b/firmware/open_evse/J1772EvseController.h @@ -38,7 +38,9 @@ //reserved #define EVSE_STATE_PILOT_ERROR 0x0C // pilot self test error //reserved #define EVSE_STATE_TEMP_SENSOR_FAULT 0x0D // temp sensor dead #define EVSE_STATE_RELAY_CLOSURE_FAULT 0x0E -#define EVSE_FAULT_STATE_END EVSE_STATE_RELAY_CLOSURE_FAULT +#define EVSE_STATE_PP_SHORTED 0x0F // PP pin shorted +#define EVSE_STATE_EEPROM_FAILURE 0x10 // SAMD only +#define EVSE_FAULT_STATE_END EVSE_STATE_EEPROM_FAILURE #define EVSE_STATE_SLEEPING 0xfe // waiting for timer #define EVSE_STATE_DISABLED 0xff // disabled @@ -77,13 +79,14 @@ typedef uint8_t (*EvseStateTransitionReqFunc)(uint8_t prevPilotState,uint8_t cur #define ECF_GND_CHK_DISABLED 0x0008 // no chk for ground fault #define ECF_STUCK_RELAY_CHK_DISABLED 0x0010 // no chk for stuck relay #define ECF_AUTO_SVC_LEVEL_DISABLED 0x0020 // auto detect svc level - requires ADVPWR -// Ability set the EVSE for manual button press to start charging - GoldServe -#define ECF_AUTO_START_DISABLED 0x0040 // no auto start charging +//obsolete #define ECF_AUTO_START_DISABLED 0x0040 // no auto start charging #define ECF_SERIAL_DBG 0x0080 // enable debugging messages via serial #define ECF_MONO_LCD 0x0100 // monochrome LCD backlight #define ECF_GFI_TEST_DISABLED 0x0200 // no GFI self test #define ECF_TEMP_CHK_DISABLED 0x0400 // no Temperature Monitoring #define ECF_CGMI 0x1000 // continuous GMI +#define ECF_BOOT_LOCK_DISABLED 0x2000 // boot lock +#define ECF_OVERCURRENT_DISABLED 0x0400 // disable overcurrent check #define ECF_BUTTON_DISABLED 0x8000 // front panel button disabled #define ECF_DEFAULT 0x0000 @@ -204,9 +207,6 @@ class J1772EVSEController { #ifdef OVERCURRENT_THRESHOLD unsigned long m_OverCurrentStartMs; #endif // OVERCURRENT_THRESHOLD -#ifdef OEV6 - uint8_t m_isV6; -#endif void setFlags(uint16_t flags) { @@ -232,7 +232,7 @@ class J1772EVSEController { } #ifdef OEV6 - uint8_t isV6() { return m_isV6; } + uint8_t isV6() { return g_isV6; } #endif #ifdef ADVPWR @@ -263,8 +263,8 @@ class J1772EVSEController { #ifdef AMMETER unsigned long m_AmmeterReading; int32_t m_ChargingCurrent; - int16_t m_AmmeterCurrentOffset; - int16_t m_CurrentScaleFactor; + int32_t m_AmmeterCurrentOffset; + int32_t m_CurrentScaleFactor; #ifdef CHARGE_LIMIT uint8_t m_chargeLimitkWh; // kWh to extend session uint32_t m_chargeLimitTotWs; // total Ws limit @@ -299,6 +299,9 @@ class J1772EVSEController { uint8_t GetState() { return m_EvseState; } + void SetState(uint8_t state) { + m_EvseState = state; + } uint8_t GetPrevState() { return m_PrevEvseState; } @@ -324,7 +327,19 @@ class J1772EVSEController { void SetHardFault() { setVFlags(ECVF_HARD_FAULT); } void ClrHardFault() { clrVFlags(ECVF_HARD_FAULT); } int8_t InHardFault() { return vFlagIsSet(ECVF_HARD_FAULT); } - int8_t CGMIisEnabled() { return flagIsSet(ECF_CGMI); } + int8_t hasCGMI() { return flagIsSet(ECF_CGMI); } + int8_t BootLockIsEnabled() { return !flagIsSet(ECF_BOOT_LOCK_DISABLED); } + void EnableBootLock(uint8_t tf) { + if (!tf) setFlags(ECF_BOOT_LOCK_DISABLED); + else clrFlags(ECF_BOOT_LOCK_DISABLED); + SaveEvseFlags(); + } + int8_t OverCurrentCheckIsEnabled() { return !flagIsSet(ECF_OVERCURRENT_DISABLED); } + void EnableOverCurrentCheck(uint8_t tf) { + if (!tf) setFlags(ECF_OVERCURRENT_DISABLED); + else clrFlags(ECF_OVERCURRENT_DISABLED); + SaveEvseFlags(); + } unsigned long GetResetMs(); uint8_t SetMaxHwCurrentCapacity(uint8_t amps); @@ -394,7 +409,8 @@ class J1772EVSEController { } uint8_t IsBootLocked() { #ifdef BOOTLOCK - return vFlagIsSet(ECVF_BOOT_LOCK) ? 1 : 0; + if (flagIsSet(ECF_BOOT_LOCK_DISABLED)) return 0; + return vFlagIsSet(ECVF_BOOT_LOCK); #else return 0; #endif @@ -473,13 +489,13 @@ int GetHearbeatTrigger(); int16_t GetAmmeterCurrentOffset() { return m_AmmeterCurrentOffset; } int16_t GetCurrentScaleFactor() { return m_CurrentScaleFactor; } - void SetAmmeterCurrentOffset(int16_t offset) { + void SetAmmeterCurrentOffset(int32_t offset) { m_AmmeterCurrentOffset = offset; - eeprom_write_word((uint16_t*)EOFS_AMMETER_CURR_OFFSET,offset); + eeprom_write_word((uint16_t*)EOFS_AMMETER_CURR_OFFSET,((int16_t)offset)); } - void SetCurrentScaleFactor(int16_t scale) { + void SetCurrentScaleFactor(int32_t scale) { m_CurrentScaleFactor = scale; - eeprom_write_word((uint16_t*)EOFS_CURRENT_SCALE_FACTOR,scale); + eeprom_write_word((uint16_t*)EOFS_CURRENT_SCALE_FACTOR,((int16_t)scale)); } #ifdef ECVF_AMMETER_CAL uint8_t AmmeterCalEnabled() { @@ -568,6 +584,7 @@ int GetHearbeatTrigger(); } void SetInMenu() { setVFlags(ECVF_UI_IN_MENU); } void ClrInMenu() { clrVFlags(ECVF_UI_IN_MENU); } + int8_t IsInMenu() { return vFlagIsSet(ECVF_UI_IN_MENU); } void SetDelayTimerOnFlag() {setVFlags(ECVF_TIMER_ON); } void ClrDelayTimerOnFlag() {clrVFlags(ECVF_TIMER_ON); } #ifdef BTN_MENU @@ -576,7 +593,7 @@ int GetHearbeatTrigger(); else clrFlags(ECF_BUTTON_DISABLED); SaveEvseFlags(); } - uint8_t ButtonIsEnabled() { return flagIsSet(ECF_BUTTON_DISABLED) ? 0 : 1; } + uint8_t ButtonIsEnabled() { return !flagIsSet(ECF_BUTTON_DISABLED); } #endif // BTN_MENU #if defined(KWH_RECORDING) && !defined(VOLTMETER) @@ -591,6 +608,18 @@ int GetHearbeatTrigger(); void LockMennekes() { m_MennekesLock.Lock(1); } void UnlockMennekes() { m_MennekesLock.Unlock(1); } #endif // MENNEKES_LOCK + void ResetFaultCounters() { + m_GfiTripCnt = 0xff; + m_NoGndTripCnt = 0xff; + m_StuckRelayTripCnt = 0xff; + + eeprom_write_byte((uint8_t*)EOFS_GFI_TRIP_CNT,0xff); + eeprom_write_byte((uint8_t*)EOFS_NOGND_TRIP_CNT,0xff); + eeprom_write_byte((uint8_t*)EOFS_STUCK_RELAY_TRIP_CNT,0xff); + } +#ifdef PP_AUTO_AMPACITY + void DoPPShorted(); +#endif // PP_AUTO_AMPACITY }; diff --git a/firmware/open_evse/Language_default.h b/firmware/open_evse/Language_default.h index f43a10f1..699c9efe 100644 --- a/firmware/open_evse/Language_default.h +++ b/firmware/open_evse/Language_default.h @@ -79,4 +79,6 @@ #define STR_L1 "L1" #define STR_L2 "L2" #define STR_OVER_CURRENT "OVERCURRENT" +#define STR_CABLE_FAULT "CABLE FAULT" +#define STR_PP_SHORTED "PP SHORTED" //#endif diff --git a/firmware/open_evse/__vm/.open_evse.vsarduino.h b/firmware/open_evse/__vm/.open_evse.vsarduino.h deleted file mode 100644 index 3a9a1619..00000000 --- a/firmware/open_evse/__vm/.open_evse.vsarduino.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - Editor: http://www.visualmicro.com - visual micro and the arduino ide ignore this code during compilation. this code is automatically maintained by visualmicro, manual changes to this file will be overwritten - the contents of the Visual Micro sketch sub folder can be deleted prior to publishing a project - all non-arduino files created by visual micro and all visual studio project or solution files can be freely deleted and are not required to compile a sketch (do not delete your own code!). - note: debugger breakpoints are stored in '.sln' or '.asln' files, knowledge of last uploaded breakpoints is stored in the upload.vmps.xml file. Both files are required to continue a previous debug session without needing to compile and upload again - - Hardware: Arduino/Genuino Uno, Platform=avr, Package=arduino -*/ - -#if defined(_VMICRO_INTELLISENSE) - -#ifndef _VSARDUINO_H_ -#define _VSARDUINO_H_ -#define __AVR_ATmega328p__ -#define __AVR_ATmega328P__ -#define _VMDEBUG 1 -#define F_CPU 16000000L -#define ARDUINO 10803 -#define ARDUINO_AVR_UNO -#define ARDUINO_ARCH_AVR -#define __cplusplus 201103L -#define __AVR__ -#define __inline__ -#define __asm__(...) -#define __extension__ -#define __inline__ -#define __volatile__ -#define GCC_VERSION 40902 - -#define __cplusplus 201103L -#undef __cplusplus -#define __cplusplus 201103L - -#define volatile(va_arg) -#define _CONST -#define __builtin_va_start -#define __builtin_va_end -#define __attribute__(...) -#define NOINLINE __attribute__((noinline)) -#define prog_void -#define PGM_VOID_P int - - -#ifndef __builtin_constant_p - #define __builtin_constant_p __attribute__((__const__)) -#endif -#ifndef __builtin_strlen - #define __builtin_strlen __attribute__((__const__)) -#endif - - -#define NEW_H -typedef void *__builtin_va_list; -//extern "C" void __cxa_pure_virtual() {;} - -typedef int div_t; -typedef int ldiv_t; - - -typedef void *__builtin_va_list; -//extern "C" void __cxa_pure_virtual() {;} - - - -#include -#include -#undef F -#define F(string_literal) ((const PROGMEM char *)(string_literal)) -#undef PSTR -#define PSTR(string_literal) ((const PROGMEM char *)(string_literal)) - - -#define pgm_read_byte(address_short) uint8_t() -#define pgm_read_word(address_short) uint16_t() -#define pgm_read_dword(address_short) uint32_t() -#define pgm_read_float(address_short) float() -#define pgm_read_ptr(address_short) short() - -#include "open_evse.ino" -#endif -#endif diff --git a/firmware/open_evse/__vm/Compile.vmps.xml b/firmware/open_evse/__vm/Compile.vmps.xml deleted file mode 100644 index 2185a69a..00000000 --- a/firmware/open_evse/__vm/Compile.vmps.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - 2393 g_RTC.begin(); -2394 #ifdef DELAYTIMER -2395 g_DelayTimer.Init(); -2396 #endif // DELAYTIMER -2397 #endif // RTC -2398 -2399 #ifdef SERIALCLI --->2400 g_CLI.Init(); -2401 #endif // SERIALCLI -2402 -2403 g_OBD.Init(); -2404 -2405 #ifdef RAPI -2406 RapiInit(); -2407 #endif -2408 -2409 g_EvseController.Init(); - - - - - - - - \ No newline at end of file diff --git a/firmware/open_evse/__vm/Configuration.Debug.vmps.xml b/firmware/open_evse/__vm/Configuration.Debug.vmps.xml deleted file mode 100644 index 91724e93..00000000 --- a/firmware/open_evse/__vm/Configuration.Debug.vmps.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/firmware/open_evse/__vm/Configuration.Release.vmps.xml b/firmware/open_evse/__vm/Configuration.Release.vmps.xml deleted file mode 100644 index 52468bef..00000000 --- a/firmware/open_evse/__vm/Configuration.Release.vmps.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/firmware/open_evse/flash.bat b/firmware/open_evse/flash.bat deleted file mode 100644 index 584b2315..00000000 --- a/firmware/open_evse/flash.bat +++ /dev/null @@ -1,3 +0,0 @@ -avrdude -c USBasp -p m328p -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0x05:m -avrdude -c USBasp -p m328p -U flash:w:open_evse-384.hex -pause diff --git a/firmware/open_evse/main.cpp b/firmware/open_evse/main.cpp index d138ac43..b1990c72 100644 --- a/firmware/open_evse/main.cpp +++ b/firmware/open_evse/main.cpp @@ -41,26 +41,8 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#include -#include -#include -#include -#include -#include "./Wire.h" -#include "./RTClib.h" #include "open_evse.h" -// if using I2CLCD_PCF8574 uncomment below line and comment out LiquidTWI2.h above -//#include "./LiquidCrystal_I2C.h" -#ifdef TEMPERATURE_MONITORING - #ifdef MCP9808_IS_ON_I2C - #include "MCP9808.h" // adding the ambient temp sensor to I2C - #endif - #ifdef TMP007_IS_ON_I2C - #include "./Adafruit_TMP007.h" // adding the TMP007 IR I2C sensor - #endif -#endif // TEMPERATURE_MONITORING - #ifdef BTN_MENU SettingsMenu g_SettingsMenu; @@ -126,7 +108,9 @@ Menu *g_SettingsMenuList[] = { Menu *g_SetupMenuList[] = { #ifdef NOSETUP_MENU &g_MaxCurrentMenu, +#ifdef HAVE_RTC &g_RTCMenu, +#endif #else // !NOSETUP_MENU #ifdef DELAYTIMER_MENU &g_RTCMenu, @@ -158,12 +142,20 @@ BtnHandler g_BtnHandler; //-- begin global variables + +#ifdef OEV6 +// set by autodetection code in target.cpp initTarget() +bool g_isV6 = false; +#endif // OEV6 +bool g_hasCGMI = false; + + char g_sTmp[TMP_BUF_SIZE]; OnboardDisplay g_OBD; // Instantiate RTC and Delay Timer - GoldServe -#ifdef RTC +#ifdef HAVE_RTC RTC_DS1307 g_RTC; #if defined(RAPI) @@ -175,7 +167,7 @@ void GetRTC(char *buf) { sprintf(buf,"%d %d %d %d %d %d",t.year()-2000,t.month(),t.day(),t.hour(),t.minute(),t.second()); } #endif // RAPI -#endif // RTC +#endif // HAVE_RTC #ifdef DELAYTIMER DelayTimer g_DelayTimer; #ifdef DELAYTIMER_MENU @@ -203,17 +195,10 @@ AutoCurrentCapacityController g_ACCController; // *do not* call this before WDT_ENABLE() is called void wdt_delay(uint32_t ms) { + uint32_t startms = millis(); do { WDT_RESET(); - if (ms > WATCHDOG_TIMEOUT/2) { - delay(WATCHDOG_TIMEOUT/2); - ms -= WATCHDOG_TIMEOUT/2; - } - else { - delay(ms); - ms = 0; - } - } while(ms); + } while((millis()-startms) < ms); } static inline void wiresend(uint8_t x) { @@ -249,18 +234,6 @@ char *u2a(unsigned long x,int8_t digits) return s; } -// wdt_init turns off the watchdog timer after we use it -// to reboot - -void wdt_init(void) __attribute__((naked,used)) __attribute__((section(".init3"))); -void wdt_init(void) -{ - MCUSR = 0; - wdt_disable(); - - return; -} - #ifdef TEMPERATURE_MONITORING @@ -270,10 +243,8 @@ void TempMonitor::Init() m_MCP9808_temperature = TEMPERATURE_NOT_INSTALLED; // 230 means 23.0C Using an integer to save on floating point library use m_DS3231_temperature = TEMPERATURE_NOT_INSTALLED; // the DS3231 RTC has a built in temperature sensor m_TMP007_temperature = TEMPERATURE_NOT_INSTALLED; - -#ifdef TEMPERATURE_MONITORING_NY - LoadThresh(); -#endif + m_panicTemperature = (int16_t) eeprom_read_word((uint16_t*)EOFS_PANIC_TEMP); + if (m_panicTemperature <= 0) m_panicTemperature = TEMPERATURE_AMBIENT_PANIC; #ifdef MCP9808_IS_ON_I2C m_tempSensor.begin(); @@ -296,7 +267,7 @@ void TempMonitor::Read() #endif -#ifdef RTC +#ifdef HAVE_RTC #ifdef OPENEVSE_2 m_DS3231_temperature = TEMPERATURE_NOT_INSTALLED; // OpenEVSE II does not use the DS3231 #else // !OPENEVSE_2 @@ -327,7 +298,7 @@ void TempMonitor::Read() m_DS3231_temperature = TEMPERATURE_NOT_INSTALLED; #endif // OPENEVSE_2 -#endif // RTC +#endif // HAVE_RTC m_LastUpdate = curms; } @@ -692,13 +663,24 @@ void OnboardDisplay::Update(int8_t updmode) #endif break; #endif // OVERCURRENT_THRESHOLD +#ifdef PP_AUTO_AMPACITY + case EVSE_STATE_PP_SHORTED: + SetGreenLed(0); + SetRedLed(1); +#ifdef LCD16X2 //Adafruit RGB LCD + LcdSetBacklightColor(RED); + LcdPrint_P(0,g_psCableFault); + LcdPrint_P(1,g_psPPShorted); +#endif + break; +#endif // PP_AUTO_AMPACITY case EVSE_STATE_NO_GROUND: SetGreenLed(0); SetRedLed(1); #ifdef LCD16X2 //Adafruit RGB LCD LcdSetBacklightColor(RED); if (updmode == OBD_UPD_HARDFAULT) { - LcdMsg_P(g_EvseController.CGMIisEnabled() ? g_psSvcReq : g_psEvseError,g_psNoGround); + LcdMsg_P(g_EvseController.hasCGMI() ? g_psSvcReq : g_psEvseError,g_psNoGround); } else { // 2nd line will be updated below with auto retry count @@ -797,19 +779,21 @@ void OnboardDisplay::Update(int8_t updmode) if (!g_EvseController.InHardFault() && ((curstate == EVSE_STATE_GFCI_FAULT) || (curstate == EVSE_STATE_NO_GROUND))) { #ifdef LCD16X2 - strcpy(g_sTmp,g_sRetryIn); - int resetsec = (int)(g_EvseController.GetResetMs() / 1000ul); - if (resetsec >= 0) { - sprintf(g_sTmp+sizeof(g_sTmp)-6,g_sHHMMfmt,resetsec / 60,resetsec % 60); - strcat(g_sTmp,g_sTmp+sizeof(g_sTmp)-6); - LcdPrint(1,g_sTmp); + if (!g_EvseController.IsInMenu()) { + strcpy(g_sTmp,g_sRetryIn); + int resetsec = (int)(g_EvseController.GetResetMs() / 1000ul); + if (resetsec >= 0) { + sprintf(g_sTmp+sizeof(g_sTmp)-6,g_sHHMMfmt,resetsec / 60,resetsec % 60); + strcat(g_sTmp,g_sTmp+sizeof(g_sTmp)-6); + LcdPrint(1,g_sTmp); + } } #endif // LCD16X2 return; } #endif // GFI -#ifdef RTC +#ifdef HAVE_RTC DateTime currentTime = g_RTC.now(); #endif @@ -881,7 +865,7 @@ void OnboardDisplay::Update(int8_t updmode) } #endif -#ifdef RTC +#ifdef HAVE_RTC if ( g_TempMonitor.m_DS3231_temperature != TEMPERATURE_NOT_INSTALLED) { sprintf(g_sTmp,tempfmt,g_TempMonitor.m_DS3231_temperature/10, abs(g_TempMonitor.m_DS3231_temperature % 10)); // sensor built into the DS3231 RTC Chip LcdPrint(5,1,g_sTmp); @@ -924,12 +908,12 @@ void OnboardDisplay::Update(int8_t updmode) int m = (elapsedTime % 3600) / 60; int s = elapsedTime % 60; sprintf(g_sTmp,"%02d:%02d:%02d",h,m,s); -#ifdef RTC +#ifdef HAVE_RTC g_sTmp[8]=' '; g_sTmp[9]=' '; g_sTmp[10]=' '; sprintf(g_sTmp+11,g_sHHMMfmt,currentTime.hour(),currentTime.minute()); -#endif //RTC +#endif //HAVE_RTC LcdPrint(1,g_sTmp); #endif // KWH_RECORDING #ifdef TEMPERATURE_MONITORING @@ -1764,8 +1748,8 @@ Menu *RTCMenuDay::Select() RTCMenuYear::RTCMenuYear() { } -#define YEAR_MIN 23 -#define YEAR_MAX 33 +#define YEAR_MIN 26 +#define YEAR_MAX 36 void RTCMenuYear::Init() { g_OBD.LcdPrint_P(0,g_psRTC_Year); @@ -2411,12 +2395,14 @@ void DelayTimer::PrintTimerIcon(){ void ProcessInputs() { #ifdef RAPI + WDT_RESET(); RapiDoCmd(); #endif #ifdef BTN_MENU g_BtnHandler.ChkBtn(); #endif #ifdef TEMPERATURE_MONITORING + WDT_RESET(); g_TempMonitor.Read(); // update temperatures once per second #endif } @@ -2425,20 +2411,27 @@ void ProcessInputs() void EvseReset() { Wire.begin(); + g_OBD.Init(); #ifdef RAPI RapiInit(); #endif - g_EvseController.Init(); +#ifdef TEMPERATURE_MONITORING + g_TempMonitor.Init(); +#endif + + g_EvseController.Init(); #ifdef DELAYTIMER g_DelayTimer.Init(); // this *must* run after g_EvseController.Init() because it sets one of the vFlags #endif // DELAYTIMER #ifdef PP_AUTO_AMPACITY - g_ACCController.AutoSetCurrentCapacity(); + if (g_ACCController.AutoSetCurrentCapacity() == 1) { + g_EvseController.DoPPShorted(); + } #endif } @@ -2452,9 +2445,8 @@ uint8_t StateTransitionReqFunc(uint8_t curPilotState,uint8_t newPilotState,uint8 // already debounces before requesting the state transition, so we can // be absolutely sure that the PP pin has firm contact by the time we // get here - if (g_ACCController.AutoSetCurrentCapacity()) { - // invalid PP so 0 amps - force to stay in State A - retEvseState = EVSE_STATE_A; + if (g_ACCController.AutoSetCurrentCapacity() == 1) { + retEvseState = EVSE_STATE_PP_SHORTED; } } /* else { // EVSE_STATE_A @@ -2473,11 +2465,15 @@ uint8_t StateTransitionReqFunc(uint8_t curPilotState,uint8_t newPilotState,uint8 void setup() { - wdt_disable(); + WDT_DISABLE(); delay(400); // give I2C devices time to be ready before running code that wants to initialize I2C devices. Otherwise a hang can occur upon powerup. - Serial.begin(SERIAL_BAUD); + RAPI_SERIAL_PORT.begin(SERIAL_BAUD); + + initTarget(); + + g_EnergyMeter.Init(); #ifdef BTN_MENU g_BtnHandler.init(); @@ -2486,13 +2482,8 @@ void setup() #ifdef PP_AUTO_AMPACITY g_EvseController.SetStateTransitionReqFunc(&StateTransitionReqFunc); #endif //PP_AUTO_AMPACITY - EvseReset(); - -#ifdef TEMPERATURE_MONITORING - g_TempMonitor.Init(); -#endif - + EvseReset(); #ifdef BOOTLOCK #ifdef LCD16X2 diff --git a/firmware/open_evse/open_evse.h b/firmware/open_evse/open_evse.h index ffecb5ba..03b72f0a 100644 --- a/firmware/open_evse/open_evse.h +++ b/firmware/open_evse/open_evse.h @@ -31,19 +31,12 @@ #define OPEN_EVSE -#include -#include -#include #include -#include "./Wire.h" -#include "avrstuff.h" +#include "Wire.h" #include "i2caddr.h" - -#if defined(ARDUINO) && (ARDUINO >= 100) +#include "pindefs.h" #include "Arduino.h" -#else -#include "WProgram.h" // shouldn't need this but arduino sometimes messes up and puts inside an #ifdef -#endif // ARDUINO +#include "target.h" #define setBits(flags,bits) (flags |= (bits)) #define clrBits(flags,bits) (flags &= ~(bits)) @@ -54,11 +47,18 @@ #include "Language_default.h" //Default language should always be included as bottom layer -typedef unsigned long time_t; - //Language preferences: Add your custom languagefile here. See Language_default.h for more info. //#include "Language_norwegian.h" + +#ifdef OEV6 +// set by autodetection code in target.cpp initTarget() +extern bool g_isV6; +#endif // OEV6 +extern bool g_hasCGMI; + + + //-- begin features #ifndef PLATFORMIO @@ -66,13 +66,10 @@ typedef unsigned long time_t; // support V6 hardware #define OEV6 #ifdef OEV6 -//#define INVERT_V6_DETECTION // DO NOT USE: ONLY FOR lincomatic's BETA V6 board #define RELAY_PWM #define RELAY_HOLD_DELAY_TUNING // enable Z0 -#endif // OEV6 -// enable CGMI support -//#define ENABLE_CGMI +#endif // OEV6 // auto detect L1/L2 #ifndef NO_AUTOSVCLEVEL @@ -140,11 +137,9 @@ typedef unsigned long time_t; #endif // !PLATFORMIO -// enable $GI -#define MCU_ID_LEN 10 // enable watchdog timer -#define WATCHDOG +//#define WATCHDOG #ifdef PP_AUTO_AMPACITY #define STATE_TRANSITION_REQ_FUNC @@ -192,8 +187,17 @@ extern AutoCurrentCapacityController g_ACCController; #endif //UL_COMPLIANT #define TEMPERATURE_MONITORING // Temperature monitoring support +// TEMPERATURE_THROTTLING enables adjusting max current based on temperature +// if not defined, and TEMPERATURE_MONITORING is enabled, then only +// TEMPERATURE_AMBIENT_PANIC is checked +//#define TEMPERATURE_THROTTLING + -#define HEARTBEAT_SUPERVISION // Heartbeat Supervision support +//#define HEARTBEAT_SUPERVISION // Heartbeat Supervision support + +#ifdef MENNEKES_LOCK +#include "MennekesLock.h" +#endif #ifdef AMMETER @@ -230,7 +234,7 @@ extern AutoCurrentCapacityController g_ACCController; #endif //AMMETER //Adafruit RGBLCD (MCP23017) - can have RGB or monochrome backlight -#define RGBLCD +//#define RGBLCD //select default LCD backlight mode. can be overridden w/CLI/RAPI #define BKL_TYPE_MONO 0 @@ -259,7 +263,7 @@ extern AutoCurrentCapacityController g_ACCController; // How to use 1-button menu // Long press activates menu // When within menus, short press cycles menu items, long press selects and exits current submenu -#define BTN_MENU +//#define BTN_MENU // take out basic setup stuff that the user really shouldn't be changing, // which can be set via RAPI/WiFi module.. reclaims a lot of code space @@ -276,11 +280,11 @@ extern AutoCurrentCapacityController g_ACCController; #endif // RGBLCD #endif // BTN_MENU -// Option for RTC and DelayTime +// Option for HAVE_RTC and DelayTime // REQUIRES HARDWARE RTC: DS1307 or DS3231 connected via I2C -#define RTC // enable RTC & timer functions +//#define HAVE_RTC // enable RTC & timer functions -#ifdef RTC +#ifdef HAVE_RTC // Option for Delay Timer - GoldServe #define DELAYTIMER @@ -288,7 +292,7 @@ extern AutoCurrentCapacityController g_ACCController; #define DELAYTIMER_MENU #endif -#else // !RTC +#else // !HAVE_RTC // this weird error comes out if RTC not defined, due to a bug in g++ //D:\git\open_evse\firmware\open_evse\open_evse.ino: In function 'ProcessInputs'//: // @@ -304,7 +308,7 @@ extern AutoCurrentCapacityController g_ACCController; // //// (subreg:QI (reg/f:HI 1065) 1)) C:\Users\Geek\AppData\Local\Temp\arduino_build_853681\sketch\rapi_proc.cpp:418 1 {pushqi1} #define GPPBUGKLUDGE -#endif // RTC +#endif // HAVE_RTC #ifdef OCPP #define AUTH_LOCK 1 @@ -312,21 +316,6 @@ extern AutoCurrentCapacityController g_ACCController; #endif // OCPP -// if defined, this pin goes HIGH when the EVSE is sleeping, and LOW otherwise -//#define SLEEP_STATUS_REG &PINB -//#define SLEEP_STATUS_IDX 4 - -#ifdef AUTH_LOCK -// AUTH_LOCK_REG/IDX - use an input pin to control AUTH_LOCK instead of -// manual function calls -// digital pin is configured as input with internal pull-up enabled -// EVSE is locked when input HIGH and unlocked when input LOW -//#define AUTH_LOCK_REG &PINC -//#define AUTH_LOCK_IDX 2 -#endif // AUTH_LOCK - - - // for stability testing - shorter timeout/higher retry count //#define GFI_TESTING @@ -349,6 +338,12 @@ extern AutoCurrentCapacityController g_ACCController; // PWM parameters written to/loaded from EEPROM #define RELAY_HOLD_DELAY_TUNING // enable Z0 +// OEV6 w/ CGMI - when power is loss, temporarily triggers NO GROUND fault +// delay recording of NO GROUND fault to avoid recording this spurious fault +#ifndef NO_GND_RECORD_DELAY +#define NO_GND_RECORD_DELAY 0 +#endif + //-- end features #ifndef DEFAULT_LCD_BKL_TYPE @@ -425,7 +420,7 @@ extern AutoCurrentCapacityController g_ACCController; // WARNING: ALL DELAYS *MUST* BE SHORTER THAN THIS TIMER OR WE WILL GET INTO // AN INFINITE RESET LOOP -#define WATCHDOG_TIMEOUT WDTO_2S +#define WATCHDOG_TIMEOUT_MS (WATCHDOG_TIMEOUT_SEC * 1000UL) #define LCD_MAX_CHARS_PER_LINE 16 @@ -460,72 +455,6 @@ extern AutoCurrentCapacityController g_ACCController; //J1772EVSEController -#define CURRENT_PIN 0 // analog current reading pin ADCx -#define PILOT_PIN 1 // analog pilot voltage reading pin ADCx -#define PP_PIN 2 // PP_READ - ADC2 -#ifdef VOLTMETER -// N.B. Note, ADC2 is already used as PP_PIN so beware of potential clashes -// voltmeter pin is ADC2 on OPENEVSE_2 -#define VOLTMETER_PIN 2 // analog AC Line voltage voltmeter pin ADCx -#endif // VOLTMETER -#ifdef OPENEVSE_2 -// This pin must match the last write to CHARGING_PIN, modulo a delay. If -// it is low when CHARGING_PIN is high, that's a missing ground. -// If it's high when CHARGING_PIN is low, that's a stuck relay. -// Auto L1/L2 is done with the voltmeter. -#define ACLINE1_REG &PIND // OpenEVSE II has only one AC test pin. -#define ACLINE1_IDX 3 - -#define CHARGING_REG &PIND // OpenEVSE II has just one relay pin. -#define CHARGING_IDX 7 // OpenEVSE II has just one relay pin. -#else // !OPENEVSE_2 - - // TEST PIN 1 for L1/L2, ground and stuck relay -#define ACLINE1_REG &PIND -#define ACLINE1_IDX 3 - // TEST PIN 2 for L1/L2, ground and stuck relay -#define ACLINE2_REG &PIND -#define ACLINE2_IDX 4 - -#define V6_CHARGING_PIN 5 -#define V6_CHARGING_PIN2 6 - -// digital Relay trigger pin -#define CHARGING_REG &PINB -#define CHARGING_IDX 0 -// digital Relay trigger pin for second relay -#define CHARGING2_REG &PIND -#define CHARGING2_IDX 7 -//digital Charging pin for AC relay -#define CHARGINGAC_REG &PINB -#define CHARGINGAC_IDX 1 - -// obsolete LED pin -//#define RED_LED_REG &PIND -//#define RED_LED_IDX 5 -// obsolete LED pin -//#define GREEN_LED_REG &PINB -//#define GREEN_LED_IDX 5 -#endif // OPENEVSE_2 - -// N.B. if PAFC_PWM is enabled, then pilot pin can be PB1 or PB2 -// if using fast PWM (PAFC_PWM disabled) pilot pin *MUST* be PB2 -#define PILOT_REG &PINB -#define PILOT_IDX 2 - -#ifdef MENNEKES_LOCK -// requires external 12V H-bridge driver such as Polulu 1451 - -//D11 - MOSI -#define MENNEKES_LOCK_PINA_REG &PINB -#define MENNEKES_LOCK_PINA_IDX 3 - -//D12 - MISO -#define MENNEKES_LOCK_PINB_REG &PINB -#define MENNEKES_LOCK_PINB_IDX 4 -#include "MennekesLock.h" -#endif // MENNEKES_LOCK - @@ -555,8 +484,8 @@ extern AutoCurrentCapacityController g_ACCController; #define EOFS_VOLT_OFFSET 20 // 4 bytes #define EOFS_VOLT_SCALE_FACTOR 24 // 2 bytes -#define EOFS_THRESH_AMBIENT 26 // 2 bytes -#define EOFS_THRESH_IR 28 // 2 bytes +#define EOFS_PANIC_TEMP 26 // 2 bytes +//notused#define EOFS_THRESH_IR 28 // 2 bytes // for I2C RAPI #define EOFS_LOCAL_I2C_ADDR 30 // 1 byte @@ -600,25 +529,8 @@ extern AutoCurrentCapacityController g_ACCController; #define AC_SAMPLE_MS 20 // 1 cycle @ 60Hz = 16.6667ms @ 50Hz = 20ms -// V6 has PD7 tied to ground -#define V6_ID_REG D -#define V6_ID_IDX 7 - #ifdef GFI -#define GFI_INTERRUPT 0 // interrupt number 0 = PD2, 1 = PD3 -// interrupt number 0 = PD2, 1 = PD3 -#define GFI_REG &PIND -#define GFI_IDX 2 - #ifdef GFI_SELFTEST -// pin is supposed to be wrapped around the GFI CT 5+ times -#define GFITEST_REG &PIND -#define GFITEST_IDX 6 -// V6 GFI test pin PB0 -#define V6_GFITEST_REG &PINB -#define V6_GFITEST_IDX 0 - - #define GFI_TEST_CYCLES 60 // GFI pulse should be 50% duty cycle @@ -663,62 +575,22 @@ extern AutoCurrentCapacityController g_ACCController; #endif // I2CLCD_PCF8574 #endif // RGBLCD || I2CLCD -// button sensing pin -#define BTN_REG &PINC -#define BTN_IDX 3 #define BTN_PRESS_SHORT 50 // ms #define BTN_PRESS_LONG 500 // ms #define BTN_PRESS_VERYLONG 10000 -#ifdef RTC +#ifdef HAVE_RTC // Default start/stop timers for un-initialized EEPROMs. // Makes it easy to compile in default time without need to set it up the first time. #define DEFAULT_START_HOUR 0x00 //Start time: 00:05 #define DEFAULT_START_MIN 0x05 #define DEFAULT_STOP_HOUR 0x06 //End time: 6:55 #define DEFAULT_STOP_MIN 0x37 -#endif // RTC +#endif // HAVE_RTC -// for J1772.ReadPilot() -// 1x = 114us 20x = 2.3ms 100x = 11.3ms -#define PILOT_LOOP_CNT 100 #ifdef AMMETER -// This multiplier is the number of milliamps per A/d converter unit. - -// First, you need to select the burden resistor for the CT. You choose the largest value possible such that -// the maximum peak-to-peak voltage for the current range is 5 volts. To obtain this value, divide the maximum -// outlet current by the Te. That value is the maximum CT current RMS. You must convert that to P-P, so multiply -// by 2*sqrt(2). Divide 5 by that value and select the next lower standard resistor value. For the reference -// design, Te is 1018 and the outlet maximum is 30. 5/((30/1018)*2*sqrt(2)) = 59.995, so a 56 ohm resistor -// is called for. Call this value Rb (burden resistor). - -// Next, one must use Te and Rb to determine the volts-per-amp value. Note that the readCurrent() -// method calculates the RMS value before the scaling factor, so RMS need not be taken into account. -// (1 / Te) * Rb = Rb / Te = Volts per Amp. For the reference design, that's 55.009 mV. -// Each count of the A/d converter is 4.882 mV (5/1024). V/A divided by V/unit is unit/A. For the reference -// design, that's 11.26. But we want milliamps per unit, so divide that into 1000 to get 88.7625558. Round near... -//#define DEFAULT_CURRENT_SCALE_FACTOR 106 // for RB = 47 - recommended for 30A max -//#define DEFAULT_CURRENT_SCALE_FACTOR 184 // for RB = 27 - recommended for 50A max -// Craig K, I arrived at 213 by scaling my previous multiplier of 225 down by the ratio of my panel meter reading of 28 with the OpenEVSE uncalibrated reading of 29.6 -// then upped the scale factor to 220 after fixing the zero offset by subtracing 900ma -//#define DEFAULT_CURRENT_SCALE_FACTOR 220 // for RB = 22 - measured by Craig on his new OpenEVSE V3 -// NOTE: setting DEFAULT_CURRENT_SCALE_FACTOR TO 0 will disable the ammeter -// until it is overridden via RAPI -//#define DEFAULT_CURRENT_SCALE_FACTOR 220 // Craig K, average of three OpenEVSE controller calibrations -#ifdef OPENEVSE_2 -#define DEFAULT_CURRENT_SCALE_FACTOR 186 // OpenEVSE II with a 27 Ohm burden resistor, after a 2-point calibration at 12.5A and 50A -#else -#define DEFAULT_CURRENT_SCALE_FACTOR 220 // OpenEVSE v2.5 and v3 with a 22 Ohm burden resistor (note that the schematic may say 28 Ohms by mistake) -#endif - -// subtract this from ammeter current reading to correct zero offset -#ifdef OPENEVSE_2 -#define DEFAULT_AMMETER_CURRENT_OFFSET 230 // OpenEVSE II with a 27 Ohm burden resistor, after a 2-point calibration at 12.5A and 50A -#else -#define DEFAULT_AMMETER_CURRENT_OFFSET 0 // OpenEVSE v2.5 and v3 with a 22 Ohm burden resistor. Could use a more thorough calibration exercise to nails this down. -#endif // The maximum number of milliseconds to sample an ammeter pin in order to find three zero-crossings. // one and a half cycles at 50 Hz is 30 ms. @@ -828,14 +700,6 @@ typedef union union4b { //-- begin class definitions -#ifdef WATCHDOG -#define WDT_RESET() wdt_reset() // pat the dog -#define WDT_ENABLE() wdt_enable(WATCHDOG_TIMEOUT) -#else -#define WDT_RESET() -#define WDT_ENABLE() -#endif // WATCHDOG - // OnboardDisplay.m_bFlags #define OBDF_MONO_BACKLIGHT 0x01 #define OBDF_AMMETER_DIRTY 0x80 @@ -973,9 +837,13 @@ class OnboardDisplay #endif // GFI #ifdef TEMPERATURE_MONITORING -#include "./MCP9808.h" // adding the ambient temp sensor to I2C -#include "./Adafruit_TMP007.h" // adding the TMP007 IR I2C sensor +#ifdef MCP9808_IS_ON_I2C +#include "MCP9808.h" // adding the ambient temp sensor to I2C +#endif +#ifdef TMP007_IS_ON_I2C +#include "./Adafruit_TMP007.h" // adding the TMP007 IR I2C sensor +#endif #define TEMPERATURE_NOT_INSTALLED -2560 // fake temp to return when hardware not installed #define TEMPMONITOR_UPDATE_INTERVAL 1000ul @@ -998,6 +866,7 @@ class TempMonitor { int16_t m_MCP9808_temperature; // 230 means 23.0C Using an integer to save on floating point library use int16_t m_DS3231_temperature; // the DS3231 RTC has a built in temperature sensor int16_t m_TMP007_temperature; + int16_t m_panicTemperature; TempMonitor() {} void Init(); @@ -1013,6 +882,11 @@ class TempMonitor { else m_Flags &= ~TMF_OVERTEMPERATURE; } int8_t OverTemperature() { return (m_Flags & TMF_OVERTEMPERATURE) ? 1 : 0; } + int16_t GetPanicTemperature() { return m_panicTemperature; } + void SetPanicTemperature(int16_t panictemp) { + m_panicTemperature = panictemp; + eeprom_write_word((uint16_t*)EOFS_PANIC_TEMP, panictemp); + } void SetOverTemperatureShutdown(int8_t tf) { if (tf) m_Flags |= (TMF_OVERTEMPERATURE_SHUTDOWN|TMF_OVERTEMPERATURE_LOGGED); else m_Flags &= ~TMF_OVERTEMPERATURE_SHUTDOWN; @@ -1421,6 +1295,5 @@ extern TempMonitor g_TempMonitor; char *GetFirmwareVersion(char *str); void wdt_delay(uint32_t ms); - #include "strings.h" #include "rapi_proc.h" diff --git a/firmware/open_evse/open_evse.ino b/firmware/open_evse/open_evse.ino deleted file mode 100644 index 1966b9fb..00000000 --- a/firmware/open_evse/open_evse.ino +++ /dev/null @@ -1 +0,0 @@ -// placeholder for Arduino IDE builds - see main.cpp for code diff --git a/firmware/open_evse/open_evse.ino.with_bootloader.standard.hex b/firmware/open_evse/open_evse.ino.with_bootloader.standard.hex deleted file mode 100644 index 6de5eafb..00000000 --- a/firmware/open_evse/open_evse.ino.with_bootloader.standard.hex +++ /dev/null @@ -1,2004 +0,0 @@ -:100000000C94D4010C94B2240C948B240C9408020C -:100010000C9408020C9408020C9408020C94080238 -:100020000C9408020C9408020C9408020C94080228 -:100030000C9408020C9408020C9408020C94080218 -:100040000C9441240C9408020C941F230C94F92264 -:100050000C9408020C9408020C9408020C940802F8 -:100060000C940D100C9408022606A50A3C064606C0 -:100070004A065406A50AA50AA50AA50AA50AA50ABC -:10008000A50AA50AA50AA50A6806A50A7206A50A70 -:100090007C06E008A50AA50AF108A50A0909A50A2F -:1000A000A50AA50AA50AA50AA50AA50AA50AA50AD8 -:1000B000A50AA50A1F09A50A2E09430965097A0997 -:1000C0008E09AB09AE09A50AA50AA50AA50AA50AC3 -:1000D000A50AEF09A50AA50A0A0A3B0A5F0A8A0AC5 -:1000E00044382E312E31005665722E20004F706537 -:1000F0006E204556534500000E111D150E000000E0 -:100100000E0C1F03060C0800080C0E0C0800000063 -:10011000000E0E0E000000000E1517110E00005309 -:100120007663204C6576656C3A204C3200537663DA -:10013000204C6576656C3A204C31004175746F2017 -:100140004465746563740053656C6620546573740C -:1001500000506F776572204F6E0054656D70657248 -:1001600061747572652043686B004746492053658A -:100170006C66205465737400537475636B2052650C -:100180006C61792043686B0047726F756E64204321 -:100190006865636B0056656E742052657127642034 -:1001A000436865636B0044696F64652043686563F9 -:1001B0006B00352E322E300045786974005265731D -:1001C00074617274204E6F773F005445535420443D -:1001D000495341424C4544005265737461727469DD -:1001E0006E672E2E2E0020202020304100484947E7 -:1001F000482054454D5000536C656570696E67002A -:10020000474643490054455354204641494C4544D0 -:100210000044697361626C6564004F50454E205222 -:10022000454C415900535455434B2052454C41597C -:10023000004E4F2047524F554E44004F56455243B3 -:10024000555252454E54004F5645522054454D503C -:100250004552415455524500474643492046415571 -:100260004C54005345525649434520524551554937 -:100270005245440044494F444520434845434B00C0 -:1002800056454E5420524551554952454400455615 -:100290005345204552524F52004368617267696E60 -:1002A0006700436F6E6E65637465640052656164D8 -:1002B000790053657420446174652F54696D653FFE -:1002C000004D6F6E74680044617900596561720079 -:1002D000486F7572004D696E757465005374617274 -:1002E0007420486F75720053746F7020486F757278 -:1002F000005374617274204D696E0053746F7020E6 -:100300004D696E0053657475700053657474696E41 -:1003100067730054696D65204C696D6974004368AA -:1003200061726765204C696D69740044656C617920 -:100330002054696D657200446174652F54696D6560 -:100340000052657374617274004D61782043757258 -:1003500072656E74000000000800020100000304D2 -:100360000700000000000000000000000025002839 -:10037000002B0000000000240027002A00040404D1 -:10038000040404040402020202020203030303033E -:10039000030102040810204080010204081020011B -:1003A000020408102000903611241FBECFEFD8E0C1 -:1003B000DEBFCDBF14BE0FB6F894A8958091600043 -:1003C000886180936000109260000FBE13E0A0E08F -:1003D000B1E0EAE9F8E702C005900D92A236B10754 -:1003E000D9F726E0A2E6B3E001C01D92A636B20717 -:1003F000E1F711E0C4EDD1E004C02197FE010E94B5 -:10040000C438C33DD107C9F70E9431290C944B3C35 -:100410000C9400002F923F924F925F926F927F92C6 -:100420008F929F92AF92BF92CF92DF92EF92FF9204 -:100430000F931F93CF93DF93CDB7DEB72C970FB6F3 -:10044000F894DEBF0FBECDBFE091DF04F091E00471 -:100450000190F081E02D8FED94E009957C01892BCE -:10046000F9F4A89580913A05882309F4B5C08091E4 -:10047000380580620E94A22082E10E94E20E0E9462 -:10048000492080913805806261E070E090E00E9430 -:10049000A22181EC95E00E94180B80958F719CC081 -:1004A00000E010E06AE7262E62E0362E2E0137E0EB -:1004B000430E511C7AEEC72E72E0D72E0E151F0583 -:1004C00084F6E091DF04F091E0040280F381E02DF6 -:1004D0008FED94E00995482F80911705882369F0E6 -:1004E000E091DF04F091E0040084F185E02D642FB9 -:1004F0008FED94E04B8709954B85443231F440935E -:10050000E10481E08093010564C09091E10494329C -:1005100009F05FC02091010520320CF056C081E047 -:10052000820F022E000C330B80930105F901E1527A -:10053000FB4F4D3009F047C0128222EE34E0309379 -:1005400003052093020581E0809316058091E20463 -:1005500024E2280FB82EB926E3EEF4E030813323ED -:1005600009F4B7C2303211F5809116058A3064F073 -:10057000109216051092E1041092010510921805D0 -:1005800080E00E94152825C0205EB3261192A0911C -:10059000160581E08A0F80931605AA0FBB0BA152A6 -:1005A000BB4F9496FC93EE939397D8CFCF010196CF -:1005B0003A3209F481C23E3511F40C94ED0A230F4E -:1005C000FC01B326CBCF428304C01092E104109209 -:1005D00001050F5F1F4F72CF982F917080FD12C0E1 -:1005E00080915605823071F440915705509158051D -:1005F0006091590570915A05452B462B472B11F4F4 -:100600001092560510915605112389F0113009F00A -:100610005AC0409157055091580560915905709105 -:100620005A05452B462B472B09F042C04CC0992355 -:1006300009F440C08091570590915805A091590543 -:10064000B0915A05892B8A2B8B2B51F40E943524AB -:1006500060935705709358058093590590935A05F8 -:100660000E94352400915705109158052091590595 -:1006700030915A05DC01CB01801B910BA20BB30B0F -:1006800020915605211107C0C297A105B10508F4B4 -:100690006CC081E00AC0213009F067C0843F9140FE -:1006A000A105B10508F461C082E0809356055DC0E4 -:1006B0009111D6CF109257051092580510925905F6 -:1006C00010925A0552C0992309F44FC080915B05DE -:1006D00090915C05A0915D05B0915E05892B8A2BF8 -:1006E0008B2B09F442C0123009F03FC00E94352420 -:1006F000C0905B05D0905C05E0905D05F0905E05D4 -:10070000DC01CB018C199D09AE09BF0980319742EC -:10071000A105B10550F110925B0510925C05109295 -:100720005D0510925E051F921F931F9284E28F93C6 -:100730008BE892E09F938F938EEA93E09F938F9341 -:100740000E940A390E940316E091DF04F091E00450 -:100750000284F385E02D6EEA73E08FED94E0099555 -:100760000FB6F894DEBF0FBECDBF2091FC053091CF -:10077000FD059091560537FD68C1809100068450B3 -:1007800011E08B3008F010E09130A9F4809157050A -:1007900090915805A0915905B0915A05892B8A2B43 -:1007A0008B2B09F0CAC010925605812F0E94B427E6 -:1007B000811126C0C2C0923009F0BFC08091570598 -:1007C00090915805A0915905B0915A050097A1053F -:1007D000B10509F4B2C080935B0590935C05A093CA -:1007E0005D05B0935E051092570510925805109262 -:1007F000590510925A0580911905877F8093190534 -:1008000080915F0590916005009709F45CC0DC0160 -:10081000ED91FC910480F581E02D099590936005A0 -:1008200080935F05009779F1B5E08A3B9B0721F043 -:10083000E5E0843B9E0721F4DC0114961C9101C085 -:1008400010E0DC01ED91FC910190F081E02D099523 -:1008500080915F0590916005B5E08A3B9B0729F088 -:10086000E5E0843B9E0709F068C0112309F465C0E8 -:100870001150DC0114961C931497ED91FC910280A9 -:10088000F381E02D59C00E94351780913D05982FC6 -:100890009F7B20916105213011F48E7B02C0892F4E -:1008A000816080933D0581E00E94381181E00E94C3 -:1008B00038118091FE059091FF05977F9093FF0579 -:1008C0008093FE053AC08091FE059091FF059860E7 -:1008D0009093FF058093FE0580910006825021E0F1 -:1008E000823008F020E091E029272093C005809114 -:1008F0003D05817098279093610587E00E94EE2066 -:1009000080913D05806480933D05112319F084EBAF -:1009100095E004C00E9424168AEB95E09093600550 -:1009200080935F0580915F0590916005DC01ED91FA -:10093000FC910190F081E02D09950E9435246B0116 -:100940007C0180911A0590911B05A0911C05B09126 -:100950001D05A7019601281B390B4A0B5B0BDA0119 -:10096000C901883E9340A105B10508F438C68091BD -:100970001E058823A9F085E00E943B279C013F715A -:1009800094FD306F4AE0429FC001439F900D1124B7 -:1009900097FD0F9654E0959587955A95E1F702C01B -:1009A00080E096EF9093200580931F0588E60E94D3 -:1009B000A2206EE081EC95E00E94710B60E281EC78 -:1009C00095E00E94710B0E94492088E60E94A220B7 -:1009D00061E181EC95E00E94710B0E94492062E088 -:1009E00070E088E690E00E94A2218823F9F081EC73 -:1009F00095E00E94180B182F81EC95E00E94180BCF -:100A0000712E612C9301282B46E0359527954A9548 -:100A1000E1F74AE0429FC001439F900D112497FDEA -:100A20000396959587959595879502C080E096EFFA -:100A30009093220580932105C0921A05D0921B0540 -:100A4000E0921C05F0921D05CAC5913089F4809191 -:100A5000570590915805A0915905B0915A05892BD9 -:100A60008A2B8B2B09F069CF1092560580E021C0AC -:100A7000923009F062CF8091570590915805A0916E -:100A80005905B0915A050097A105B10509F455CF54 -:100A900080935B0590935C05A0935D05B0935E0524 -:100AA00010925705109258051092590510925A0548 -:100AB00081E00E94F02741CF31E010822C873B87F4 -:100AC0000E9489253B852C85313009F082C582132F -:100AD0004FCD81E08093570610921805B09016050F -:100AE000EB2DEE0FFF0BE352FB4F83A194A141E0EE -:100AF0004B1564F4DC012C912A3341F401960E94D9 -:100B0000892580931805BA94B092160510920105B4 -:100B1000E0910205F09103058081873409F440C318 -:100B2000833509F42EC1863409F00FC581818534DF -:100B300009F466C064F4813361F11CF48033C1F0C0 -:100B400004C5823499F1843409F43FC0FEC4803571 -:100B500009F4E0C024F4863409F455C0F6C48235A3 -:100B600009F40CC1833509F0F0C40E942416E7C4CF -:100B700080911605823009F0E8C4E0910405F091F7 -:100B80000505908180913D05903309F0F4C480649F -:100B9000F3C490910006945081E09B3008F080E00F -:100BA0000E94B42781E00E943811C9C480911605C3 -:100BB000823009F0CAC480910405909105050E9415 -:100BC0001A38862F0E94EE20BAC4809100068F3F0B -:100BD00009F4B5C482E090E00E94BD1F8FEF8093BE -:100BE00000060E94861F8091FE059091FF0597FFE9 -:100BF000CAC481E00E94381180E00E940D259FC484 -:100C00000E9435179CC480911605833009F09DC45D -:100C1000E0910605F091070580818053823008F04D -:100C200094C4E0910405F0910505E0814E2FEE0F8C -:100C3000550B660B770BFA01E254F109E531F1052A -:100C400008F083C4EC5CFF4F0C94C4382091FC0581 -:100C50003091FD05811102C0306801C03F773093AB -:100C6000FD052093FC056091FC057091FD0582E077 -:100C700090E00E94FF3B63C42091FC053091FD058C -:100C8000882311F02D7F41C022603FC081E0809316 -:100C9000170555C42091FC053091FD05882311F0FE -:100CA0003D7F33C0326031C02091FC053091FD059D -:100CB000882311F0277F29C01092F3051092EF05C9 -:100CC0001092F0051092F1051092F20528601DC0F7 -:100CD0002091FC053091FD05882311F02F7E15C071 -:100CE000206113C02091FC053091FD05882311F08F -:100CF0003B7F0BC0346009C02091FC053091FD059D -:100D0000882311F02B7F01C024603093FD052093D0 -:100D1000FC0599C08091160584300CF416C48091AE -:100D2000FE0581FD12C480910405909105050E9485 -:100D30001A384B015C0180910605909107050E94CD -:100D40001A38AAE0B5E044E050E0FA014F5F5F4F87 -:100D500020911605022E000C330BE217F30734F432 -:100D6000ED91FD91319720E22083EFCF409108056E -:100D700050910905C4010E943721E1C30E94AB18BC -:100D8000DEC38181833409F4F9C08CF4833309F420 -:100D90009CC034F4803389F1813309F45BC0D5C33E -:100DA000853309F49EC0813409F4C8C0CEC38C34A5 -:100DB00009F46BC1DCF4883409F45BC18B3409F0AD -:100DC000C4C380910405909105050E941A38AB01B7 -:100DD000BC0140934D0650934E0660934F067093AE -:100DE00050068DE090E00E94F73BA9C3843509F4DA -:100DF00076C1863509F4C0C1A8C38091160582303A -:100E000009F0A3C3E0910405F0910505BB24B39458 -:100E1000908180913D05903319F4B12C816001C01F -:100E20008E7F80933D0581E00E9438118091FC0502 -:100E30009091FD05B11002C0916001C09E7F90931A -:100E4000FD058093FC058091FC059091FD050E94B5 -:100E5000E30F75C380911605873009F076C3809142 -:100E60000E0590910F050E941A38B62E80910C0540 -:100E700090910D050E941A38A62E80910A05909136 -:100E80000B050E941A38962E80910805909109054D -:100E90000E941A38862E80910605909107050E94BF -:100EA0001A38262F80910405909105052C870E9401 -:100EB0001A3869832C852A838B829C82AD82BE82FC -:100EC000CE0101960E94660E3AC3809116058230CB -:100ED00009F03BC3809100068250823008F035C390 -:100EE00056C380911605823009F02FC3E0910405A6 -:100EF000F09105058081813399F03CF4803309F04D -:100F000021C381E00E944B261AC3813469F08D34DD -:100F100009F018C38091FE059091FF05906809C003 -:100F200081E00E94AA260BC38091FE059091FF05E7 -:100F30009F779093FF058093FE0501C3809116056E -:100F4000833009F002C380910405909105050E9449 -:100F50001A3870933F0660933E0689E090E00E9445 -:100F6000FF3B80910605909107050E941A38709307 -:100F70003D0660933C068BE090E07BCEA09016058A -:100F80008EEF8A0D823008F0E0C2809104059091C6 -:100F900005050E941A38B62E33E0A31242C0E09134 -:100FA0000605F091070580818D34C9F58AEF8B0D18 -:100FB0008B34C0F48FEF91E00E94D53B81508E3F7F -:100FC00088F06B2D8FEF91E00E94E93BB0920D0607 -:100FD00080910E06B81640F441E061E08B2D0E942E -:100FE0009D1602C021E001C020E030E080910D0696 -:100FF0001F928F938CE493E09F938F9381EE94E004 -:101000009F938F932C873B870E940A390F900F90F4 -:101010000F900F900F900F902C853B8526C041E0DC -:1010200001C040E08091190580FFBBC280910E068F -:101030008B1508F0B6C221E030E080910E061F92B9 -:101040008F938CE493E09F938F9381EE94E09F9332 -:101050008F932C873B870E940A390F900F900F9037 -:101060000F900F900F903B852C8581E080930105B8 -:101070006EC280911605823009F067C28091000629 -:101080008250823008F061C292C28091160582308F -:1010900009F05BC2E0910405F09105058081813380 -:1010A0000CF453C283331CF0813459F04EC261E01A -:1010B00080530E94FE168091FC059091FD05806290 -:1010C00009C00E949D2181113AC28091FC05909136 -:1010D000FD058F7D9093FD058093FC05B8CE809132 -:1010E0001605853009F031C28091040590910505FF -:1010F0000E941A38A62E80910605909107050E943D -:101100001A38862E80910805909109050E941A3898 -:10111000B62E80910A0590910B050E941A38962EE2 -:10112000A11009C0811007C0B11005C0611103C032 -:101130000E94992804C2A0922605809227056A2D54 -:1011400085E090E00E94E93B6091270586E090E011 -:101150000E94E93BB0922805909229056B2D87E00B -:1011600090E00E94E93B6091290588E090E00E94B0 -:10117000E93B0E948128E3C180911605823009F085 -:10118000E4C180910405909105050E941A3860938E -:101190004506709346068093470690934806CFC154 -:1011A000E1818E2FEE0F990BAA0BBB0BFC01F09780 -:1011B000E732F10508F0C9C1E75BFF4F0C94C43872 -:1011C0008091CD059091CE05029739F00E944D1F78 -:1011D00091E0811103C090E001C092E01F929F93C3 -:1011E00004C080912F061F928F938CE493E09F930D -:1011F0008F9381EE94E09F938F930E940A3981E050 -:10120000809301050F900F900F900F900F900F900B -:1012100096C18091FE059091FF0597FD02C081E483 -:1012200001C08DE41F928F9380912306282F082EF2 -:10123000000C330B3F938F9387E492E052C0809170 -:101240003D068F9380913C068F9380913F068F934C -:1012500080913E068F938DE792E043C08091FC051C -:1012600080FDB3C1A0E1AA2EB12C0E9471161F927D -:101270008F9380910E061F928F93BF92AF921F9211 -:1012800086E08F931FC080912505882361F04091EF -:1012900026058091270590E02091280530E0609197 -:1012A000290570E007C040E060E070E020E030E039 -:1012B00080E090E07F936F933F932F939F938F9362 -:1012C0001F924F9387E792E043C08091FD058F9373 -:1012D0008091FC058F9380910E061F928F938CE373 -:1012E00093E09F938F9381EE94E09F938F930E945E -:1012F0000A3907C18091F9058F5F1F928F93809102 -:10130000F4058F5F1F928F938091DD058F5F1F9291 -:101310008F938DE492E09F938F9375C080914806E0 -:101320008F93809147068F93809146068F9380918B -:1013300045068F9380913B068F9380913A068F9359 -:10134000809139068F93809138068F9386E592E0DD -:101350009F938F93D0C08091400645CFDE011196B8 -:101360009D0180E090E041E2FC013E9640935700F1 -:101370005491F90151939F0101968A309105A1F78B -:1013800080E28093E104E2EEF4E08D918193A41574 -:10139000B505D9F7F6E0AF2EB12CE1E0F0E0EC0FA7 -:1013A000FD1FEA0DFB1D80811F928F93DF92CF926C -:1013B000C501880F991F84529B4F9F938F930E9462 -:1013C0000A39FFEFAF1ABF0A0F900F900F900F90DE -:1013D0000F900F902AE0A216B104F9F6ADC08091EB -:1013E00024058F93809123058F93809120058F93FF -:1013F00080911F058F93809122058F938091210505 -:101400008F933F922F9281EE94E09F938F930E944F -:101410000A3977C08091FF058F938091FE058F93E5 -:10142000809104061F928F9340911F0650912006D1 -:1014300060912106709122068091170690911806FE -:10144000A0911906B0911A06840F951FA61FB71F09 -:10145000BF93AF939F938F93809100061F928F93BA -:10146000AEE5B2E0BF93AF9381EE94E09F938F938C -:101470000E940A3946C00E94D90D29833A834B83C2 -:101480005C836D837E831F927F938D811F928F93E8 -:101490008C811F928F938B811F928F938A811F92D1 -:1014A0008F9389811F928F93A1E7B2E0BF93AF938F -:1014B00081EE94E09F938F930E940A3922C080911D -:1014C00050068F9380914F068F9380914E068F9395 -:1014D00080914D068F93809154068F93809153068F -:1014E0008F93809152068F93809151068F93A3E83A -:1014F000B2E0BF93AF9381EE94E09F938F930E94ED -:101500000A3981E0809301050FB6F894DEBF0FBE63 -:10151000CDBF15C060EE70E081EE94E00E94BF3B4D -:1015200065E472E081EE94E00E94F83862EB71E0CD -:1015300081EE94E00E94B43B81E08093010520E0BD -:1015400030E005C021E030E002C02FEF3FEF809196 -:1015500001058F3F31F081E0232B09F080E00E94EC -:1015600015281092E104109201051092570680E0B0 -:101570000E940D252EC88F7B80933D05808180338E -:1015800009F010CBDCCF81E00E944B2632CB80915A -:101590000405909105050E941A38862F0E94841731 -:1015A0000FC061E08B2D0E949D169C0146CD80915D -:1015B0000405909105050E941A38862F0E944D1748 -:1015C00080913D0586FDBBCFEDCAA0900D06B12CE4 -:1015D0004CCE8B110C94B8027CCA32E06ECA2C96A9 -:1015E0000FB6F894DEBF0FBECDBFDF91CF911F9134 -:1015F0000F91FF90EF90DF90CF90BF90AF909F90B2 -:101600008F907F906F905F904F903F902F900895B4 -:101610000895E091D7038091D603E81730F4F0E005 -:10162000E550FC4F808190E008958FEF9FEF089583 -:101630009091D7038091D603981750F4E92FF0E0EA -:10164000E550FC4F208130E09F5F9093D70302C0AC -:101650002FEF3FEFC90108958091D60390E02091CC -:10166000D703821B91090895CF92DF92EF92FF92E8 -:101670000F931F93CF93DF937C018A018091D8034E -:10168000882389F0EB016B01C40ED51ECC15DD0556 -:10169000F1F06991D701ED91FC910190F081E02D7D -:1016A000C7010995F3CF842F413288F4909141040A -:1016B000943069F44093AD03FB012DE833E0D90188 -:1016C0009A2F921B981718F491919D93F9CFC80106 -:1016D000DF91CF911F910F91FF90EF90DF90CF900E -:1016E00008952091D8032223C9F02091FA032032D3 -:1016F00040F021E030E0FC013383228380E090E081 -:1017000008958091D903E82FF0E0E652FC4F608302 -:101710008F5F8093D9038093FA0309C080914104BD -:10172000843029F481E08093AD0360938D0381E0E0 -:1017300090E0089585ED8093BC008091BC0084FD0D -:10174000FCCF109241040895DC011496EC9114979B -:1017500015962C91E21740F4F0E0EE0FFF1FEE5AC1 -:10176000FE4F808191810895FC0114820E94AB1884 -:1017700084EB95E00895CF93DF93EC0145E952E0C7 -:1017800061E070E080E090E00E943721EC81F0E0C1 -:10179000EE0FFF1FEC5DFE4F608171818FE295E0DF -:1017A0000E940F2664EF71E080E090E00E94FB232E -:1017B0008C81811102C00E94AB1880E090E0DF9123 -:1017C000CF910895CF93DF93EC018C818F5F8230AE -:1017D00010F48C8301C01C820E94AC21EC81F0E0EB -:1017E000EE0FFF1FEC5DFE4F4081518161E070E024 -:1017F00080E090E0DF91CF910C943721FC011482BE -:101800006DEB71E080E090E00E947C2167E972E07E -:1018100081E090E00C944721FC0184818F5F8483F8 -:101820009581981708F41482E481E91758F4F0E0E0 -:10183000EE0FFF1FEE5AFE4F0190F081E02D628106 -:10184000738102C068EB71E081E090E00C947C2130 -:10185000FC0114826281738180E090E00E947C210F -:101860006091AF057091B00581E090E00C947C210F -:10187000CF93DF93DC0114968C9114978F5F1496AD -:101880008C93149715969C911597981718F41496A5 -:101890001C92149716968C9116971496EC911497A7 -:1018A0008823A1F0CE2FD0E0CC0FDD1FCE59DE4F24 -:1018B0002881398145E02736340729F4EF5F1496F3 -:1018C000EC931497EACF22563540C1F3E91758F448 -:1018D000F0E0EE0FFF1FEE59FE4F0190F081E02D7A -:1018E0006281738102C068EB71E081E090E0DF917A -:1018F000CF910C947C21CF93DF93EC011C829E81CD -:10190000992399F08C81E82FF0E0EE0FFF1FEE593C -:10191000FE4F2081318145E02736340719F48F5F6F -:101920008C83EECF22563540D1F36A817B8180E0F3 -:1019300090E00E947C21EC81F0E0EE0FFF1FEE5959 -:10194000FE4F0190F081E02D6281738181E090E093 -:10195000DF91CF910C947C21CF93DF93EC0145E98B -:1019600052E061E070E080E090E00E9437214C811D -:1019700050E060E070E02AE08FE295E00E94C6252A -:1019800067EC72E08FE295E00E940F2664EF71E051 -:1019900080E090E00E94FB236C818091FC0580FD3B -:1019A00002C021E001C022E081E090E0213011F48A -:1019B00080E090E00E94E93B40E060E08C810E9482 -:1019C0009D1684EB95E0DF91CF910895CF93DF933F -:1019D000EC018091FC0580FD02C081E001C082E045 -:1019E00096E09D83813029F480E18E838BE992E03B -:1019F00005C080910D068E838EE992E09F938F93B0 -:101A000081EA92E09F938F938EEA93E09F938F9366 -:101A10000E940A396EEA73E080E090E00E9447215C -:101A200090910E069C838D810F900F900F900F90D8 -:101A30000F900F90981708F48C838C811F928F93CE -:101A400080EB92E09F938F938EEA93E09F938F9326 -:101A50000E940A390F900F900F900F900F900F90E7 -:101A60006EEA73E081E090E0DF91CF910C94472122 -:101A70008091D405882321F081E08093D3050895D7 -:101A80008091FE059091FF0580689093FF058093FB -:101A9000FE050E94861F80E090E00E94BD1F81E04D -:101AA0008093D2050895BF92CF92DF92EF92FF927A -:101AB0000F931F93CF93DF93B42E1092CF03CFECED -:101AC000D3E02AE0C22ED12CE12CF12C8E01A7010B -:101AD00096010E948338605D6A93B901CA0161155D -:101AE00071058105910599F73C2F301B3B0D1316AD -:101AF00074F3CE01DF91CF911F910F91FF90EF9082 -:101B0000DF90CF90BF900895CF92DF92EF92FF9237 -:101B10006B017C01A89584E0C816D104E104F104AE -:101B200060F063E070E080E090E00E94FB2383E0DF -:101B3000C81AD108E108F108EDCFC701B601FF903E -:101B4000EF90DF90CF900C94FB23FC018081877095 -:101B5000806480937C0080917A00806480937A0016 -:101B600080917A0086FDFCCF8091780020917900E9 -:101B700090E0922B0895DC016115710561F0ED9103 -:101B8000FC91119712969C9112976130710569F43E -:101B90008281982B9283ED91FC91119791811296FD -:101BA0008C9180958923818308958181982B9183DD -:101BB00008951F93CF93DF93CDB7DEB72B970FB662 -:101BC000F894DEBF0FBECDBF88E60E94A22060E081 -:101BD00081EC95E00E94710B0E94492067E070E063 -:101BE00088E690E00E94A22181EC95E00E94180B0B -:101BF0008F77982F92959F701AEF782F919F700D85 -:101C0000112481EC95E07B870E94180B9C013327FF -:101C100094E0359527959A95E1F7682F129F600D0E -:101C2000112481EC95E06A870E94180B9C013327F0 -:101C300044E0359527954A95E1F7582F129F500DAE -:101C4000112481EC95E059870E94180B81EC95E0F6 -:101C50000E94180B9C01332754E0359527955A951F -:101C6000E1F7482F129F400D112481EC95E0488741 -:101C70000E94180B9C01332764E0359527956A95DF -:101C8000E1F7382F129F300D112481EC95E03F834E -:101C90000E94180BFC01FF2774E0F595E7957A95F3 -:101CA000E1F7282F1E9F200D11243F81488559857B -:101CB0006A857B8580E090E02B960FB6F894DEBFB6 -:101CC0000FBECDBFDF91CF911F9108950F931F934A -:101CD000CF938C0188E60E94A22060E081EC95E021 -:101CE0000E94710BF8012581CAE0822F6C2F0E949F -:101CF0004F38682F660F860F682F660F620F81ECD2 -:101D000095E00E94710BF8012481822F6C2F0E94B4 -:101D10004F38682F660F860F682F660F620F81ECB1 -:101D200095E00E94710BF8012381822F6C2F0E9495 -:101D30004F38682F660F860F682F660F620F81EC91 -:101D400095E00E94710B60E081EC95E00E94710BC0 -:101D5000F8012281822F6C2F0E944F38682F660F66 -:101D6000860F682F660F620F81EC95E00E94710B61 -:101D7000F8012181822F6C2F0E944F38682F660F47 -:101D8000860F682F660F620F81EC95E00E94710B41 -:101D9000F8012081822F6C2F0E944F38682F660F28 -:101DA000860F682F660F620F81EC95E00E94710B21 -:101DB00060E081EC95E00E94710BCF911F910F9133 -:101DC0000C944920682F81EC95E00C94710BCF9313 -:101DD000DF931F92CDB7DEB7FC01818580626983F6 -:101DE0000E94A22083E10E94E20E6981862F0E9458 -:101DF000E20E0E9449208111FCCF0F90DF91CF911C -:101E00000895FF920F931F93CF93DF9300D0CDB728 -:101E1000DEB78C01F62EFC01958564FD9061F5FC22 -:101E20009860F6FC9460F7FC9260292F442311F02F -:101E3000206A01C02062622FC80129834A830E9460 -:101E4000E70E2981622F6F7DC8010E94E70EF8011D -:101E500095854A81F0FC9061F1FC9860F2FC9460F9 -:101E6000F3FC9260292F442311F0206A01C0206204 -:101E7000622FC80129830E94E70E2981622F6F7D9E -:101E8000C8010F900F90DF91CF911F910F91FF909C -:101E90000C94E70EFC012385222319F041E00E94F7 -:101EA000010F81E090E00895CF93DF93CDB7DEB7C7 -:101EB00028970FB6F894DEBF0FBECDBF9C01FC0182 -:101EC0008385882321F188E0E4E0F1E0DE011196CA -:101ED00001900D928A95E1F7F9018781841710F43A -:101EE0004FEF480FFE013196E40FF11DE40FF11D95 -:101EF0009081690F606840E0C90128960FB6F89498 -:101F0000DEBF0FBECDBFDF91CF910C94010F28969D -:101F10000FB6F894DEBF0FBECDBFDF91CF9108950D -:101F2000CF93DF93EC018C818F5F8C839E81981718 -:101F300010F48D818C830E94AC2141E060E08FE23F -:101F400095E00E94540F90910E068C81981306C064 -:101F500065E972E08FE295E00E940F264C8150E027 -:101F600060E070E02AE08FE295E00E94C62567EC11 -:101F700072E08FE295E0DF91CF910C940F26FC0187 -:101F80002385222341F040E061E00E94010F8BE3B2 -:101F90009FE10197F1F70895DC011496EC911497F5 -:101FA00015968C91E81740F4F0E0EE0FFF1FEE5904 -:101FB000FE4F8081918108958FE295E00E94BF0FCE -:101FC00080E090E00895BC0182E090E00C94FF3B3B -:101FD000DC01ED91FC911197928112968C91892BE5 -:101FE0008283089561110C94E80FDC01ED91FC915E -:101FF0001197228112968C91809582238283089575 -:10200000DC01ED91FC911197208112968C91922F19 -:10201000982381E009F480E008951F920F920FB693 -:102020000F9211242F933F934F935F936F937F935E -:102030008F939F93AF93BF93EF93FF938091B900DA -:10204000887F803609F49CC068F5883209F45BC04B -:1020500090F4803109F454C038F4882309F4F3C0B3 -:10206000883009F44DC0F3C0883109F44CC0803287 -:1020700009F45DC0ECC0803409F468C048F48033D2 -:1020800009F455C0883309F0E2C080933F04D5C0FD -:10209000803509F44FC0883509F45DC0883409F0F3 -:1020A000D6C0D3C0883909F4C4C0A8F4883709F46D -:1020B00067C038F4883609F463C0803709F460C01B -:1020C000C6C0883809F4B5C0803909F45FC08038CB -:1020D00009F0BDC05BC0803B09F483C038F4803A8E -:1020E00009F466C0883A09F47CC0B1C0803C09F4A8 -:1020F000A4C0883C09F4A1C0883B09F487C0A7C0EC -:1021000080913C0410C090913E0480913D0498174A -:1021100070F5E0913E0481E08E0F80933E04F0E084 -:10212000E55EFB4F80818093BB0085EC83C080938C -:102130003F048BC0E0913E0481E08E0F80933E040B -:102140008091BB00F0E0E55EFB4F808390913E0400 -:1021500080913D046BC0E0913E0481E08E0F80933E -:102160003E048091BB00F0E0E55EFB4F80838091F0 -:10217000400481116AC081E080933B0484EA5EC020 -:1021800083E08093410410928C03CFCF80918C0325 -:10219000803208F04EC0E0918C0381E08E0F809376 -:1021A0008C038091BB00F0E0E459FC4F8083BDCFED -:1021B00080918C03803230F4E0918C03F0E0E4599C -:1021C000FC4F10820E949A0B60918C0370E0E091AA -:1021D0006A03F0916B038CE693E0099510928C03EF -:1021E0002CC084E080934104109269031092AD03E7 -:1021F000E0916703F091680309958091AD03811127 -:1022000005C081E08093AD0310928D03E0916903D6 -:1022100081E08E0F80936903F0E0E357FC4F8081EB -:102220008093BB00909169038091AD03981708F4E7 -:102230007CCF85E88093BC000AC085EC8093BC000D -:102240001092410404C010923F040E949A0BFF9127 -:10225000EF91BF91AF919F918F917F916F915F911E -:102260004F913F912F910F900FBE0F901F90189597 -:102270008F929F92AF92BF92CF92DF92EF92FF9296 -:102280000F931F93CF93DF9300D000D000D0CDB732 -:10229000DEB7082F80913D0586FDA2C4109100068F -:1022A0008091FC0580FD03C0DD24D39402C032E0A0 -:1022B000D32EC0900E060E9435244B015C019091F4 -:1022C000000680910106981709F495C228EE820E47 -:1022D00023E0921EA11CB11C8091FE0581FD02E04D -:1022E0001F92CF921F92DF9286E191E09F938F938E -:1022F0002EEAE22E23E0F22EFF92EF920E940A399C -:102300000FB6F894DEBF0FBECDBF173009F48AC1F7 -:10231000A8F4133009F402C130F4113061F1123025 -:1023200009F483C0E0C1153009F42BC108F031C1B4 -:1023300081E00E94EE2060E872E028C11B3009F4C1 -:1023400031C158F4193009F4A5C108F483C181E002 -:102350000E94EE2067E472E08AC11E3F09F4A4C126 -:1023600008F088C11E3009F0BEC181E00E94EE2055 -:102370006AE172E07CC18FE295E00E94BF0F40E00D -:1023800060E08FE295E00E94540F82E00E94EE2010 -:102390000E9416218CEA92E00E9428214EEA53E026 -:1023A00060E070E08AE090E00E9437216091510681 -:1023B00070915206809153069091540620E13EE0C0 -:1023C00040E050E00E9483385F934F933F932F93F8 -:1023D00085EB92E09F938F93FF92EF920E940A39D0 -:1023E0004EEA53E061E070E080E090E00E94372127 -:1023F00060914D0670914E0680914F069091500667 -:1024000028EE33E040E050E00E9483385F934F9322 -:102410003F932F938CEB92E09F938F93FF92EF92D9 -:102420000E940A394EEA53E06DC08FE295E00E94A7 -:10243000BF0F40E060E08FE295E00E94540F83E020 -:102440000E94EE2080914006882329F063E08FE20D -:1024500095E00E944A0F80912F06882329F065E0BD -:102460008FE295E00E944A0F0E94162182EA92E0D4 -:102470000E9428214EEA53E060E070E08AE090E09C -:102480000E94372160915106709152068091530647 -:102490009091540620E13EE040E050E00E948338F5 -:1024A0005F934F933F932F9385EB92E09F938F938E -:1024B0009EEAE92E93E0F92EFF92EF920E940A39EC -:1024C000A70161E070E080E090E00E943721609118 -:1024D0004D0670914E0680914F069091500628EE61 -:1024E00033E040E050E00E9483385F934F933F9386 -:1024F0002F938CEB92E09F938F93FF92EF920E9429 -:102500000A39A70161E070E087E090E00E9437217E -:102510000FB6F894DEBF0FBECDBFE5C086E00E94C7 -:10252000EE208FE295E00E94BF0F40E060E08FE276 -:1025300095E00E94540F8091410690914206A0912F -:102540004306B0914406892B8A2B8B2B29F063E03C -:102550008FE295E00E944A0F80912F06882329F090 -:1025600065E08FE295E00E944A0F0E94162189E9FA -:1025700092E00E94282180913D05806880933D056E -:10258000B2C081E00E94EE2064E772E08EE892E043 -:1025900088C081E00E94EE2068E572E0023009F018 -:1025A00054C065C081E00E94EE2063E672E080E0E6 -:1025B00090E00E947C216BE372E08EEA93E00E943F -:1025C000BF3BF70101900020E9F77F0160913806D9 -:1025D0007091390680913A0690913B0628EE33E0DF -:1025E00040E050E00E94A53880910E0690E0281B44 -:1025F000390B3F932F9384EC92E09F938F93C70105 -:1026000001979F938F930E940A396EEA73E081E0ED -:1026100090E00E9447210F900F900F900F900F9025 -:102620000F9061C081E00E94EE20023061F40E94B0 -:102630009D21811103C08EE892E002C083E692E002 -:1026400061E372E02EC061E372E080E090E00E94FE -:102650007C2149C081E00E94EE20023019F08EE812 -:1026600092E002C083E692E065E272E01AC083E67F -:1026700092E017C085E00E94EE208FE295E00E9474 -:10268000BF0F40E060E08FE295E00E94540F81E1CF -:1026900092E01FC081E00E94EE2060E072E085E0E1 -:1026A00092E00E948E211FC00E944D1F811102C026 -:1026B00085E001C087E00E94EE208FE295E00E9455 -:1026C000BF0F40E060E08FE295E00E94540F87EF7B -:1026D00091E00E9428214EEA53E060E070E08AE039 -:1026E00090E00E94372180911905897069F08091EE -:1026F000FE0581FD09C081E00E94EE206DEE71E0D3 -:1027000080E090E00E947C2180914F0590915005DF -:10271000A0915105B0915205A5019401281B390BD8 -:102720004A0B5B0BDA01C901883E9340A105B10554 -:1027300018F4013009F054C280924F059092500570 -:10274000A0925105B09252058091FE0581FD05C011 -:102750008AEF810F823008F451C00E94D90D5C834A -:102760006D837E83133009F0B3C080913D0587FFF0 -:102770005FC18F7780933D0560913806709139066F -:1027800080913A0690913B06683E53E075078105BB -:10279000910510F128EE33E040E050E00E948338CC -:1027A000122F032F24E630E040E050E00E948338EF -:1027B0003F932F930F931F9389EC92E09F938F93F6 -:1027C0008EEA93E09F938F930E940A390FB6F89494 -:1027D000DEBF0FBECDBF06C066EE71E08EEA93E0AD -:1027E0000E94BF3B4EEA53E060E070E08AE090E078 -:1027F0000E9437211DC1011169CD86CF6CE071E0C7 -:102800008EEA93E00E94033980910006863049F4F5 -:10281000C090D805D090D905E090DA05F090DB059E -:1028200008C0C090EF05D090F005E090F105F09061 -:10283000F2050E94352440EEC40E43E9D41E44E064 -:10284000E41EF11CA7019601261B370B480B590B00 -:10285000CA01B90128EE33E040E050E00E9483381D -:10286000C90137FDBDC16CE370E00E946F389F93D2 -:102870008F937F936F938FED92E09F938F938AEC6A -:1028800093E09F938F930E940A396AEC73E08EEA7B -:1028900093E00E94F8380FB6F894DEBF0FBECDBFAC -:1028A0006EEA73E081E090E026960FB6F894DEBF02 -:1028B0000FBECDBFDF91CF911F910F91FF90EF9091 -:1028C000DF90CF90BF90AF909F908F900C94472156 -:1028D0001E3F09F085C140E060E08FE295E00E9474 -:1028E000540F0E94162187EF91E00E9428218E81CB -:1028F0001F928F938D811F928F938C811F928F9344 -:102900008AED92E09F938F930EEA13E01F930F934B -:102910000E940A39A80161E070E080E090E00E9426 -:1029200037210FB6F894DEBF0FBECDBF80912505CD -:10293000882309F452C040E069E08FE295E00E94EC -:10294000540F62E08FE295E00E944A0F60E08FE250 -:1029500095E00E944A0F809127051F928F938091E6 -:1029600026051F928F938FEDE82E82E0F82EFF92BE -:10297000EF921F930F930E940A39A80160E070E064 -:102980008BE090E00E94372141E069E08FE295E022 -:102990000E94540F61E08FE295E00E944A0F60E0D0 -:1029A0008FE295E00E944A0F809129051F928F9334 -:1029B000809128051F928F93FF92EF921F930F93A0 -:1029C0000E940A390FB6F894DEBF0FBECDBFA80132 -:1029D00061E070E08BE090E017C01F92CF921F92F1 -:1029E000DF9286E191E09F938F931F930F930E9454 -:1029F0000A390FB6F894DEBF0FBECDBF4EEA53E0E2 -:102A000060E070E08AE090E026960FB6F894DEBFB2 -:102A10000FBECDBFDF91CF911F910F91FF90EF902F -:102A2000DF90CF90BF90AF909F908F900C94372104 -:102A30006091510670915206809153069091540610 -:102A400020E13EE040E050E00E9483385F934F93E6 -:102A50003F932F9385EB92E09F938F930EEA13E0C1 -:102A60001F930F930E940A39A80161E070E080E093 -:102A700090E00E94372160914D0670914E06809142 -:102A80004F069091500628EE33E040E050E00E945F -:102A900083385F934F933F932F938CEB92E09F93F8 -:102AA0008F931F930F930E940A39A80161E070E091 -:102AB00087E090E00E943721809119050FB6F894C5 -:102AC000DEBF0FBECDBF80FF71C00E94AC21E09180 -:102AD0001F05F0912005E11596EFF90751F1CF019F -:102AE0006AE070E00E946F3897FF03C0919581956E -:102AF00091099F938F93CF016AE070E00E946F3835 -:102B00007F936F9381ED92E09F938F938EEA93E092 -:102B10009F938F930E940A394EEA53E061E070E080 -:102B200080E090E00E9437210FB6F894DEBF0FBE20 -:102B3000CDBFE0912105F0912205E11526EFF207C6 -:102B400051F1CF016AE070E00E946F3897FF03C037 -:102B50009195819591099F938F93CF016AE070E0E1 -:102B60000E946F387F936F9381ED92E09F938F93D4 -:102B70008EEA93E09F938F930E940A394EEA53E0C6 -:102B800061E070E085E090E00E9437210FB6F89494 -:102B9000DEBF0FBECDBF80911905982F967096307D -:102BA00029F48B7F8093190581E006C082FD18C04F -:102BB00084608093190586E026960FB6F894DEBFF0 -:102BC0000FBECDBFDF91CF911F910F91FF90EF907E -:102BD000DF90CF90BF90AF909F908F900C94EE209D -:102BE00026960FB6F894DEBF0FBECDBFDF91CF9112 -:102BF0001F910F91FF90EF90DF90CF90BF90AF901B -:102C00009F908F900895CF93DF93EEEAF3E080E0FA -:102C1000EF019191992311F08927FACF1F928F9399 -:102C200089EE92E09F938F93DF93CF930E940A39AE -:102C30008DE08B831C820F900F900F900F900F9060 -:102C40000F90DF91CF910895809100068E3FB9F0EB -:102C500080E090E00E94BD1F8EEF809300060E94EE -:102C60003524609313067093140680931506909391 -:102C7000160681E00E94381180E00C940D2508951D -:102C80009C01265031092E32310538F445E8489F21 -:102C90009001499F300D112414C09C012453310927 -:102CA0002D313105D8F4092E000CAA0BBB0B805630 -:102CB0009F4FAF4FBF4F9C0185E0220F331F8A9576 -:102CC000E1F730938B0020938A0081E090E09093AD -:102CD000CE058093CD0580E090E0089581E090E0FE -:102CE0000895CF938091FC0580FD02C0C1E001C032 -:102CF000C2E081E090E0C13011F480E090E00E94F9 -:102D0000D53B9FEF980F9E3F20F0C13091F080E1BE -:102D100002C0863060F0C13021F4813160F080E182 -:102D20000AC090910D06981730F4892F04C086E0F0 -:102D300002C08CE0F2CFCF910895CF92DF92FF9244 -:102D40000F931F93CF93DF931F92CDB7DEB7D82E8B -:102D5000F62E8091FC059091FD058C0101701127E4 -:102D600080FD3FC080E1442321F049830E94711619 -:102D7000498195E09D1538F48D1560F0D0920E06CE -:102D8000C12CD12C0CC086E080930E06CC24C394B9 -:102D9000D12C05C080930E0682E0C82ED12C4111A3 -:102DA0000FC060910E06012B11F421E001C022E05A -:102DB00081E090E0213011F480E090E00E94E93B56 -:102DC0008091CD059091CE05019729F480910E0652 -:102DD00090E00E944016FF2039F081E00E943811F7 -:102DE00003C080910D06BFCFC6010F90DF91CF9138 -:102DF0001F910F91FF90DF90CF900895CF93C62F32 -:102E00002091FC053091FD05823051F42160309312 -:102E1000FD052093FC0580E899EAA3E0B0E009C035 -:102E20002E7F3093FD052093FC0580EC94EDA1E00E -:102E3000B0E08093450690934606A0934706B09372 -:102E400048068091FC059091FD050E94E30F0E94C9 -:102E5000711641E060E00E949D16CC2321F081E0D4 -:102E6000CF910C943811CF910895809100068E5F18 -:102E7000823090F48091FE059091FF058B7F9093B6 -:102E8000FF058093FE058FEF8093010610920006E8 -:102E900080E090E00C94BD1F0895E091FE05F09154 -:102EA000FF058823F9F080934006A82FB0E020E8C2 -:102EB0003EEE46E350E00E94E03860934106709396 -:102EC000420680934306909344068091250588230B -:102ED00019F081E080932A05F062F093FF05E093FA -:102EE000FE05089510924106109242061092430684 -:102EF0001092440610924006FF7DF093FF05E09388 -:102F0000FE0510922A0508954091FE055091FF0597 -:102F10008823E9F080932F06282F30E0A4E8B3E05F -:102F20000E94CA386093300670933106809332064F -:102F30009093330680912505882319F081E08093D2 -:102F40002A0540615093FF054093FE0508951092B5 -:102F5000300610923106109232061092330610920B -:102F60002F064F7E5093FF054093FE0510922A05D1 -:102F700008952F923F924F925F926F927F928F921D -:102F80009F92AF92BF92CF92DF92EF92FF920F93F8 -:102F90001F93CF93DF9300D000D000D0CDB7DEB722 -:102FA000A8950E9435242B013C011E821D8201E060 -:102FB000812C912C540110E0C12CD12C76010E945F -:102FC0003524AB01BC01DB01CA0184199509A609AE -:102FD000B7098397A105B10508F09BC08FED95E077 -:102FE00049835A836B837C830E94A50DFC01498130 -:102FF0005A816B817C8101111CC091E021E0221675 -:1030000022E0320608F490E081E0E13022E0F207AD -:1030100008F480E0981769F0DB01CA018819990962 -:10302000AA09BB090697A105B10518F01F5F4A015F -:103030005B01113008F46AC01330A8F0133009F0B6 -:1030400065C08D819E819C0140E050E0C701B601C2 -:103050000E948338DA01C90189019A0140E050E0F9 -:1030600060E070E416C0CF01A0E0B0E0BC01CD018B -:103070007250810991099B01AC010E943F38C60E34 -:10308000D71EE81EF91E8D819E8101969E838D8339 -:103090003DC084179507A607B70740F4E2E0769590 -:1030A000679557954795EA95D1F7F3CF80E090E083 -:1030B000DC014115510561057105F9F06A017B01DB -:1030C000C80ED91EEA1EFB1EB695A7959795879543 -:1030D0000C151D052E053F0540F00C191D092E0984 -:1030E0003F09840F951FA61FB71FE2E076956795ED -:1030F00057954795EA95D1F7DCCF809334069093A6 -:103100003506A0933606B09337060CC000E01F01C9 -:1031100056CF109234061092350610923606109251 -:103120003706A89526960FB6F894DEBF0FBECDBF22 -:10313000DF91CF911F910F91FF90EF90DF90CF9093 -:10314000BF90AF909F908F907F906F905F904F90C7 -:103150003F902F90089580E090E00E94BD1F68EDA1 -:1031600071E081E090E00E947C218091FE0586FD67 -:1031700010C09EE088E10FB6F894A8958093600097 -:103180000FBE909360006CED75E080E090E00C94D1 -:10319000FB2368EB7BE080E090E00E94840DE9CFA8 -:1031A000BC018AEC91E00E948E216CED75E080E01C -:1031B00090E00C94FB23CF93DF93EC0164EF71E07C -:1031C00080E090E00E94FB238C81882329F08130ED -:1031D00031F086E795E005C080E895E002C08BE716 -:1031E00095E0DF91CF910895FC0114826BE273E0CA -:1031F00080E090E00E947C216FEE72E081E090E040 -:103200000C944721FC01148262EB72E080E090E0B4 -:103210000E947C2167E972E081E090E00C944721F4 -:103220001F93CF93DF93D82FC62F142F1092AE0386 -:10323000411106C065E972E08EEA93E00E94F83819 -:103240006D2F70E080E090E042E00E94530DBC01E1 -:103250008EEA93E00E94F83866EF72E08EEA93E01F -:103260000E94F838113031F465E972E08EEA93E09B -:103270000E94F8386C2F70E080E090E042E00E94FD -:10328000530DBC018EEA93E00E94F8386EEA73E0B9 -:1032900081E090E0DF91CF911F910C944721FC01D8 -:1032A00084818F5F8C3310F4848301C0148241E0E9 -:1032B00064818091D4030C941019CF93DF93EC01B7 -:1032C0006BEF72E080E090E00E947C216091D5037A -:1032D0006C8341E08091D403DF91CF910C9410195D -:1032E000FC0184818F5F8C3310F4848301C01482CD -:1032F00041E064818091D4030C941019CF93DF9343 -:10330000EC0161EF72E080E090E00E947C2160912E -:10331000D5036C8341E08091D403DF91CF910C946D -:103320001019FC0184818093D40340E06091D5039F -:103330000E94101964EF71E080E090E00E94FB238E -:103340008CE695E00895FC0184818F5F883110F44C -:10335000848301C0148240E06091D50384810C9481 -:103360001019CF93DF93EC0167EE72E080E090E0FC -:103370000E947C21E5E2F5E083818093D40364819F -:103380006093D5038C8340E0DF91CF910C941019AA -:10339000FC0184818093D40340E06091D5030E94B6 -:1033A000101964EF71E080E090E00E94FB2381E758 -:1033B00095E00895FC0184818F5F883110F4848347 -:1033C00001C0148240E06091D50384810C941019EF -:1033D000CF93DF93EC016CED72E080E090E00E940F -:1033E0007C21E5E2F5E081818093D40362816093E2 -:1033F000D5038C8340E0DF91CF910C941019CF92CC -:10340000DF92EF92FF920F931F93CF93DF936C01A4 -:10341000F62E142FD22FCE2D1092AE03E11006C03F -:1034200065E972E08EEA93E00E94F8386F2D70E053 -:1034300080E090E042E00E94530DBC018EEA93E0F0 -:103440000E94F83868EF72E08EEA93E00E94F83844 -:10345000C13031F465E972E08EEA93E00E94F838F9 -:10346000612F70E080E090E042E00E94530DBC01CB -:103470008EEA93E00E94F83868EF72E08EEA93E0FB -:103480000E94F838C23031F465E972E08EEA93E0C8 -:103490000E94F838B60180E090E042E00E94530DAF -:1034A000BC018EEA93E00E94F83865E472E08EEA8F -:1034B00093E00E94F838C33031F465E972E08EEA97 -:1034C00093E00E94F8386D2F70E080E090E042E0D9 -:1034D0000E94530DBC018EEA93E00E94F83866EF1B -:1034E00072E08EEA93E00E94F838C43031F465E966 -:1034F00072E08EEA93E00E94F838602F70E080E07E -:1035000090E042E00E94530DBC018EEA93E00E94DD -:10351000F8386EEA73E081E090E0DF91CF911F917F -:103520000F91FF90EF90DF90CF900C944721EF9296 -:103530000F93CF93DF93EC0165ED72E080E090E0B4 -:103540000E947C210091D5030C8384E0E82E209119 -:10355000D4034091D3036091D2038091D003909122 -:10356000D1030E94FF19DF91CF910F91EF90089541 -:10357000EF920F93FC0124812093D40383E0E82E83 -:103580000091D5034091D3036091D2038091D00381 -:103590009091D1030E94FF1964EF71E080E090E008 -:1035A0000E94FB238AE895E00F91EF900895EF9237 -:1035B0000F93CF93DF93EC0160ED72E080E090E039 -:1035C0000E947C212091D4032C8383E0E82E00917B -:1035D000D5034091D3036091D2038091D0039091A1 -:1035E000D1030E94FF19DF91CF910F91EF900895C1 -:1035F000EF920F93FC01848190E09093D10380932C -:10360000D00322E0E22E0091D5032091D403409113 -:10361000D3036091D2030E94FF1964EF71E080E050 -:1036200090E00E94FB238FE895E00F91EF900895C2 -:10363000EF920F93FC0184818F5F8D3108F082E15E -:103640008483848192E0E92E0091D5032091D403F4 -:103650004091D3036091D20390E00E94FF190F9133 -:10366000EF900895EF920F93CF93DF93EC016BEC03 -:1036700072E080E090E00E947C218091D0039EEE79 -:10368000980F9B3010F48C8308C082E18C8382E118 -:1036900090E09093D1038093D0038C8192E0E92E47 -:1036A0000091D5032091D4034091D3036091D203BC -:1036B00090E00E94FF19DF91CF910F91EF90089554 -:1036C000EF920F93FC0144814093D303EE24E394E3 -:1036D0000091D5032091D4036091D2038091D0034F -:1036E0009091D1030E94FF1964EF71E080E090E0B7 -:1036F0000E94FB2384E995E00F91EF900895EF92EB -:103700000F93CF93DF93EC0167EC72E080E090E0E1 -:103710000E947C214091D3034C83EE24E3940091DA -:10372000D5032091D4036091D2038091D00390916E -:10373000D1030E94FF19DF91CF910F91EF9008956F -:10374000EF920F93FC0164816093D203E12C00910E -:10375000D5032091D4034091D3038091D00390915D -:10376000D1030E94FF1964EF71E080E090E00E94B5 -:10377000FB2389E995E00F91EF900895CF93DF93B4 -:10378000FC01C481FFE0CF9FE00111241092AE0341 -:10379000662331F065E972E08EEA93E00E94033916 -:1037A000209719F46AEF72E02BC0CC33D10574F482 -:1037B000BE0180E090E040E00E94530DBC018EEA23 -:1037C00093E00E94F8386EEF72E01AC0CE016CE30D -:1037D00070E00E945B38EC0180E090E040E00E94E5 -:1037E000530DBC018EEA93E00E94F838CD2B31F0E6 -:1037F00063E073E08EEA93E00E94F83866E073E0DD -:103800008EEA93E00E94F8386EEA73E081E090E07F -:10381000DF91CF910C944721CF93DF93EC0161E0CE -:103820000E94BE1B8C810E94841764EF71E080E0CF -:1038300090E00E94FB238C81882319F080E090E0C7 -:1038400002C08AEB95E0DF91CF910895FC0194814D -:10385000943010F49F5F05C09C3010F49E5F01C04F -:103860009C5F94838481813208F0148261E090919E -:103870002F068481981360E0CF010C94BE1BCF9378 -:10388000DF93EC0180912F068C8363E173E080E08D -:1038900090E00E947C2161E0CE01DF91CF910C94F9 -:1038A000BE1BCF93DF93EC011092AE03662331F081 -:1038B00065E972E08EEA93E00E9403396C81611140 -:1038C00003C06AEF72E00DC070E080E090E040E07D -:1038D0000E94530DBC018EEA93E00E94F8386AE022 -:1038E00073E08EEA93E00E94F8386EEA73E081E0BC -:1038F00090E0DF91CF910C944721FC0184818530C9 -:1039000010F48F5F01C08B5F84838481893208F05B -:10391000148261E0909140068481981360E0CF01A9 -:103920000C94511CCF93DF93EC01809140068C8363 -:103930006EE173E080E090E00E947C2161E0CE01C6 -:10394000DF91CF910C94511CCF93DF93EC0161E098 -:103950000E94511C8C810E944D1764EF71E080E041 -:1039600090E00E94FB238C81882319F080E090E096 -:1039700002C08AEB95E0DF91CF9108950F931F93DA -:10398000CF93DF93FC0104810093D5031091D403FE -:1039900041E0602F812F0E941019C5E2D5E01B8302 -:1039A0000C83612F87E090E00E94E93B6C8188E006 -:1039B00090E00E94E93B64EF71E080E090E00E94BB -:1039C000FB238AEB95E0DF91CF911F910F91089532 -:1039D0000F931F93CF93DF93FC0104810093D503D2 -:1039E0001091D40341E0602F812F0E941019C5E28D -:1039F000D5E019830A83612F85E090E00E94E93BBE -:103A00006A8186E090E00E94E93B64EF71E080E02B -:103A100090E00E94FB238AEB95E0DF91CF911F910C -:103A20000F910895CF93DF93EC0145E952E061E0F7 -:103A300070E080E090E00E943721EC81F0E0EE0F32 -:103A4000FF1FEC5DFE4F608171818FE295E00E9467 -:103A50000F2664EF71E080E090E00E94FB238C81F0 -:103A6000811103C00E94812802C00E9499288AEB1C -:103A700095E0DF91CF910895CF93DF93EC0145E975 -:103A800052E061E070E080E090E00E943721EC813C -:103A9000F0E0EE0FFF1FEC5DFE4F608171818FE261 -:103AA00095E00E940F2664EF71E080E090E00E94B4 -:103AB000FB238C81882319F084EB95E002C08EE90A -:103AC00095E0DF91CF910895CF93DF93EC018C8146 -:103AD0008F5F823010F48C8301C01C820E94AC2165 -:103AE0002C8130E081E090E040912505442311F0E5 -:103AF00080E090E028173907B1F445E952E061E031 -:103B000070E080E090E00E943721EC81F0E0EE0F61 -:103B1000FF1FEC5DFE4F608171818FE295E0DF91C8 -:103B2000CF910C940F26220F331FF901EC5DFE4F4D -:103B30004081518161E070E080E090E0DF91CF91C1 -:103B40000C943721CF93DF93EC0181E09091250510 -:103B5000911180E08C836BE273E080E090E00E9442 -:103B60007C210E94AC2145E952E061E070E080E0F8 -:103B700090E00E943721EC81F0E0EE0FFF1FEC5D3A -:103B8000FE4F608171818FE295E0DF91CF910C94BF -:103B90000F26CF93DF93EC018C818F5F833010F47D -:103BA0008C8301C01C820E94AC21EC81F0E0EE0FFE -:103BB000FF1FE25EFE4F4081518161E070E080E0D6 -:103BC00090E0DF91CF910C943721EF920F93CF9338 -:103BD000DF93EC018C818F5F8C3310F48C8301C0F8 -:103BE0001C820E94AC2184E0E82E0C812091D40339 -:103BF0004091D3036091D2038091D0039091D1037F -:103C00000E94FF19DF91CF910F91EF900895EF92ED -:103C10000F93CF93DF93EC018C818F5F883110F489 -:103C20008C8301C01C820E94AC2183E0E82E0091AD -:103C3000D5032C814091D3036091D2038091D003AE -:103C40009091D1030E94FF19DF91CF910F91EF90D6 -:103C50000895EF920F93CF93DF93EC018C818F5FE8 -:103C6000803208F081E08C830E94AC21EE24E39442 -:103C70000091D5032091D4034C816091D2038091AF -:103C8000D0039091D1030E94FF19DF91CF910F9142 -:103C9000EF900895EF920F93CF93DF93EC018C8117 -:103CA0008F5F8D3008F081E08C830E94AC21E12C85 -:103CB0000091D5032091D4034091D3036C8180916E -:103CC000D0039091D1030E94FF19DF91CF910F9102 -:103CD000EF900895CF93DF93EC018C818F5F82305A -:103CE00010F48C8301C01C820E94AC21EC81F0E0B6 -:103CF000EE0FFF1FEC5DFE4F4081518161E070E0EF -:103D000080E090E0DF91CF910C943721AF92BF9289 -:103D1000CF92DF92EF92FF920F931F93CF93DF9397 -:103D200000D000D000D0CDB7DEB7FC0114811093D5 -:103D3000D503F090D403B090D303A090D203C090E9 -:103D4000D003D090D10384E0E82E012F2F2D4B2DEE -:103D50006A2DC6010E94FF19F0EDCF16F7E0DF06CD -:103D600020F080EDC81A87E0D80AC982AA82BB82F7 -:103D7000FC821D831E82CE0101960E94660E64EFB6 -:103D800071E080E090E00E94FB2384EB95E02696B2 -:103D90000FB6F894DEBF0FBECDBFDF91CF911F915C -:103DA0000F91FF90EF90DF90CF90BF90AF9008956C -:103DB000EF920F931F93CF93DF9300D000D000D0EA -:103DC000CDB7DEB78C0161EC72E080E090E00E943C -:103DD0007C210E94D90D3093D2034093D303822FCC -:103DE00090E09093D1038093D0035093D4036093D9 -:103DF000D503F8013483E12C062F252F632F0E9471 -:103E0000FF1926960FB6F894DEBF0FBECDBFDF9127 -:103E1000CF911F910F91EF900895909141049111CE -:103E2000FCCF91E090934104909340042FEF2093B6 -:103E30003F0410923E04260F20933D0490933C04CF -:103E400090913C04880F892B80933C0480913B0423 -:103E5000813041F410923B0480913C048093BB007C -:103E600085EC01C085EE8093BC00809141048130D7 -:103E7000E1F380913E04861710F460913E04ABE1BB -:103E8000B4E02BEF33E0F9018E2F821B861718F474 -:103E90008D918193F9CF862F08958091FF058170D0 -:103EA00008958091550680FF30C08E7F809355061F -:103EB000609151067091520680915306909154067C -:103EC000611571058105910501F120E13EE040E0B9 -:103ED00050E00E94833880914D0690914E06A0914B -:103EE0004F06B0915006BA01A901480F591F6A1F29 -:103EF0007B1F40934D0650934E0660934F06709380 -:103F000050068DE090E00C94F73B089580912E06CA -:103F100060E0882341F085E00E94512360E086E064 -:103F20000E94512309C080EE95E00E94F20F60E0EC -:103F300083EE95E00E94F20F60E086EE95E00E942D -:103F4000F20F8091FE059091FF058F7B9093FF0506 -:103F50008093FE050E943524609313067093140627 -:103F60008093150690931606109238061092390623 -:103F700010923A0610923B0608952FB7F8940097D6 -:103F800039F440E45FE150938B0040938A0004C011 -:103F900010928B0010928A009093CE058093CD05ED -:103FA0002FBF0895EF92FF920F931F93CF93DF934C -:103FB000C4E1D0E0A8958FEC95E00E940010882322 -:103FC00051F062E370E080E090E00E94FB232197D3 -:103FD00089F782E045C081E08093D4051092D30533 -:103FE000CDE3D0E08FE2E82E82E8F82E03E312E87A -:103FF0008091D305811112C0219781F085ED95E064 -:104000000E94E80FC7010197F1F760E085ED95E0A8 -:104010000E94F20FC8010197F1F7EACFC8E2D0E0A1 -:10402000A8958FEC95E00E940010882351F062E380 -:1040300070E080E090E00E94FB23219789F783E005 -:104040000FC068EE73E080E090E00E94840D109253 -:10405000D2051092D40581E09091D305911180E0B2 -:10406000DF91CF911F910F91FF90EF900895A89548 -:104070001092D4051092D3058FEC95E00E940010A9 -:10408000882321F081E08093D20508951092D20513 -:1040900008952091FA0390915606213208F046C007 -:1040A000809141048111FCCF32E03093410431E032 -:1040B000309340043FEF30933F0410923E0420932E -:1040C0003D04AAEDB3E04BE154E0FA013E2F341B6E -:1040D000321718F43D913193F9CF10923C0420919E -:1040E0003C04990F922B90933C0490913B049130A7 -:1040F00041F410923B0490913C049093BB0095ECEA -:1041000001C095EE9093BC00909141049230E1F390 -:1041100090913F049F3F79F080913F04803241F0BD -:1041200080913F04803331F084E005C081E003C01A -:1041300082E001C083E01092D9031092FA0310923A -:10414000D803089591E09093D80380935606109277 -:10415000D9031092FA030895CF93DF939091390514 -:10416000992311F097E0892780FD03C020EC31E00E -:1041700002C020E831E030933C0520933B0581FFED -:1041800009C020913B0530913C052F7730933C05C9 -:1041900020933B0582FF09C080913B0590913C052F -:1041A0009E7F90933C0580933B05D0913B05C09149 -:1041B0003C058091380580620E94A22082E10E9425 -:1041C000E20E8D2F0E94E20E8C2F0E94E20E0E94C2 -:1041D00049208111FCCFDF91CF91089590913D0549 -:1041E00090FF02C0811187E090913A0591110C94E3 -:1041F000AC200895209126059091280521110AC030 -:1042000080912705811106C0911104C08091290574 -:10421000882359F081E0291308C020912705909147 -:104220002905291302C080E00895089580912A0588 -:1042300081110DC080912505882349F00E94FA2044 -:10424000882329F060E08FE295E00C944A0F0895EE -:1042500040E150E0BC018EE395E00E94C63B109225 -:104260004E056EE375E08FE295E00C940F26CF9338 -:10427000DF93EA01462F682F8FE295E00E94540FEA -:10428000BE018FE295E0DF91CF910C940F26EF9263 -:10429000FF920F931F93CF93DF937B01482F60E032 -:1042A0008FE295E00E94540FF70101900020E9F79A -:1042B0003197CE2FCE19C13108F0C0E1DE2D870134 -:1042C000802F8D1B8C1740F4F80161918F018FE2D4 -:1042D00095E00E944A0FF4CFC03139F060E28FE2DE -:1042E00095E00E944A0FCF5FF7CFDF91CF911F91EA -:1042F0000F91FF90EF900895CF93DF93EC0140E191 -:1043000050E08EE395E00E94C63B10924E056EE3AE -:1043100075E0CE01DF91CF910C944721CF93DF93CD -:10432000EB01BC0180E090E00E947C21BE0181E0B5 -:1043300090E0DF91CF910C947C218091FD058295D6 -:1043400081700895613208F060E20E940D1F1092A2 -:10435000D7038093D6030895CF9341E060E08FE2C6 -:1043600095E00E94540FC0E160E28FE295E00E9468 -:104370004A0FC150C9F741E060E08FE295E0CF916C -:104380000C94540FCF92DF92EF92FF920F931F93F2 -:10439000CF93DF936C017A018B01C0E0D0E0CE15A2 -:1043A000DF0589F0D8016D918D01D601ED91FC9169 -:1043B0000190F081E02DC6010995892B11F47E0151 -:1043C00002C02196ECCFC701DF91CF911F910F91D1 -:1043D000FF90EF90DF90CF900895FC01918D828D3A -:1043E000981761F0828DDF01A80FB11D5D968C9149 -:1043F000928D9F5F9F73928F90E008958FEF9FEF54 -:104400000895FC01918D828D981731F0828DE80F0F -:10441000F11D858D90E008958FEF9FEF0895FC01C9 -:10442000918D228D892F90E0805C9F4F821B910996 -:104430008F739927089582E494E00E940F2221E06F -:10444000892B09F420E0822F0895FC01848DDF017F -:10445000A80FB11DA35ABF4F2C91848D90E00196F7 -:104460008F739927848FA689B7892C93A089B189E6 -:104470008C9180648C93938D848D981306C00288F0 -:10448000F389E02D80818F7D80830895EF92FF92E4 -:104490000F931F93CF93DF93EC0181E0888F9B8D67 -:1044A0008C8D981305C0E889F989808185FD24C029 -:1044B000F62E0B8D10E00F5F1F4F0F731127E02EAC -:1044C0008C8DE8120CC00FB607FCFACFE889F98989 -:1044D000808185FFF5CFCE010E942522F1CF8B8D03 -:1044E000FE01E80FF11DE35AFF4FF0820B8FEA89BE -:1044F000FB898081806207C0EE89FF896083E8893B -:10450000F98980818064808381E090E0DF91CF91A0 -:104510001F910F91FF90EF900895CF93DF93EC01DF -:10452000888D8823C9F0EA89FB89808185FD05C0D3 -:10453000A889B9898C9186FD0FC00FB607FCF5CF0D -:10454000808185FFF2CFA889B9898C9185FFEDCF55 -:10455000CE010E942522E7CFDF91CF91089580E020 -:1045600090E0892B29F00E941B2281110C940000FD -:1045700008953FB7F8948091620690916306A091E8 -:104580006406B091650626B5A89B05C02F3F19F0BB -:104590000196A11DB11D3FBFBA2FA92F982F8827C3 -:1045A000820F911DA11DB11DBC01CD0142E0660F1E -:1045B000771F881F991F4A95D1F708950895089588 -:1045C0000895FC0110AE128212A20895FC0110AEF3 -:1045D000128212A2089582E494E00C94462282E4AE -:1045E00094E00C94ED2182E494E00C940F220E945C -:1045F000F3381F920F920FB60F9211242F933F930F -:104600004F935F936F937F938F939F93AF93BF93DA -:10461000EF93FF9382E494E00E942522FF91EF91B3 -:10462000BF91AF919F918F917F916F915F914F91CA -:104630003F912F910F900FBE0F901F9018951F92D2 -:104640000F920FB60F9211242F938F939F93EF9396 -:10465000FF93E0915204F09153048081E09158045B -:10466000F091590482FD12C0908180915B048F5FAC -:104670008F7320915C04821751F0E0915B04F0E0AD -:10468000EE5BFB4F958F80935B0401C08081FF91AF -:10469000EF919F918F912F910F900FBE0F901F90D0 -:1046A000189590E0FC01EB5AFC4F3491FC01EF5659 -:1046B000FC4F2491FC01E358FC4FE491EE2309F4F4 -:1046C0003BC0332339F1333091F038F43130A9F065 -:1046D000323001F584B58F7D12C0373091F038301B -:1046E000A1F03430B9F4809180008F7D03C08091B7 -:1046F00080008F77809380000DC084B58F7784BD54 -:1047000009C08091B0008F7703C08091B0008F7D89 -:104710008093B000F0E0EE0FFF1FE759FC4FA5912A -:10472000B4918FB7F894EC91611103C020952E23BA -:1047300001C02E2B2C938FBF08951F93CF93DF932F -:10474000182FEB010E941526209711F460E004C099 -:10475000CF3FD10539F461E0812FDF91CF911F91D7 -:104760000C945123E12FF0E0EB5AFC4FE491E3303D -:10477000F9F048F4E130B9F0E230A1F584B5806297 -:1047800084BDC8BD34C0E730E9F0E83019F1E43049 -:1047900049F580918000806280938000D0938B00E7 -:1047A000C0938A0024C084B5806884BDC7BD1FC083 -:1047B00080918000806880938000D0938900C093AE -:1047C000880015C08091B00080688093B000C093CD -:1047D000B3000DC08091B00080628093B000C093A0 -:1047E000B40005C0C038D1050CF0B5CFAFCFDF9114 -:1047F000CF911F9108958F929F92AF92BF92CF92C7 -:10480000DF92EF92FF926B017C010E94B9224B0173 -:104810005C01C114D104E104F104F1F00E94B92259 -:10482000DC01CB0188199909AA09BB09883E93408C -:10483000A105B10570F321E0C21AD108E108F10821 -:1048400088EE880E83E0981EA11CB11CC114D1040F -:10485000E104F10419F7DDCFFF90EF90DF90CF90E6 -:10486000BF90AF909F908F9008952FB7F89460916C -:104870005E0670915F0680916006909161062FBF81 -:1048800008951F920F920FB60F9211242F933F930A -:104890008F939F93AF93BF9380915E0690915F0635 -:1048A000A0916006B091610630915D0623E0230F70 -:1048B0002D3720F40196A11DB11D05C026E8230F58 -:1048C0000296A11DB11D20935D0680935E06909314 -:1048D0005F06A0936006B093610680916206909196 -:1048E0006306A0916406B09165060196A11DB11DF5 -:1048F0008093620690936306A0936406B093650666 -:10490000BF91AF919F918F913F912F910F900FBECB -:104910000F901F9018951F920F920FB60F921124AF -:104920002F933F934F935F936F937F938F939F93B7 -:10493000AF93BF93EF93FF93E0910201F0910301D6 -:104940000995FF91EF91BF91AF919F918F917F91C9 -:104950006F915F914F913F912F910F900FBE0F90EC -:104960001F9018951F920F920FB60F9211242F933C -:104970003F934F935F936F937F938F939F93AF93E7 -:10498000BF93EF93FF93E0910001F091010109952E -:10499000FF91EF91BF91AF919F918F917F916F9117 -:1049A0005F914F913F912F910F900FBE0F901F90ED -:1049B0001895CF93DF93809100061F928F931F92DB -:1049C00084E28F9382E293E09F938F93CEEAD3E0C9 -:1049D000DF93CF930E940A3909900020E9F760EE37 -:1049E00070E0CE0101970E94BF3B0E9403168DB775 -:1049F0009EB708960FB6F8949EBF0FBE8DBFE0918C -:104A0000DF04F091E0040284F385E02D6EEA73E0A8 -:104A10008FED94E0DF91CF910994EF92FF921F9375 -:104A2000CF93DF9390915706911169C0C091000612 -:104A300010910406D0910E062091FE053091FF05DD -:104A400079019AE1E92291E2F922811121C0CC2376 -:104A500009F457C0C13019F430FF07C053C0C23049 -:104A600011F0C33011F430FF4CC080915C068C1300 -:104A70000FC080915B0681130BC080915A068D1385 -:104A800007C080915806909159068E159F05C9F16F -:104A90003F932F931F92DF931F921F931F92CF93E9 -:104AA0001F9284E28F938DE293E09F938F938EEA1F -:104AB00093E09F938F930E940A390E940316E0911E -:104AC000DF04F091E0040284F385E02D6EEA73E0E8 -:104AD0008FED94E00995C0935C0610935B06D0932C -:104AE0005A06F0925906E09258068DB79EB70E9678 -:104AF0000FB6F8949EBF0FBE8DBFC0E003C0C2E0EA -:104B000001C0C1E08C2FDF91CF911F91FF90EF90FA -:104B10000895FC0140E050E090E021912223B9F09B -:104B20004130510511F49295907F80ED820F8A30CB -:104B300010F4980F0CC08FEB820F863010F42753BF -:104B400005C08FE9820F863050F42755920F41300F -:104B5000510519F041E050E0E0CF892F089580E041 -:104B600008956115710579F0FB0101900020E9F7C6 -:104B70003197AF01461B570BDC01ED91FC91028090 -:104B8000F381E02D099480E090E008954F925F92C8 -:104B90006F927F92EF92FF920F931F93CF93DF93C9 -:104BA000CDB7DEB7A1970FB6F894DEBF0FBECDBF6D -:104BB0007C01FA01CB0119A2223008F42AE08E010F -:104BC0000F5D1F4F422E512C612C712CBF01A30190 -:104BD00092010E948338F901CA01015011096A301B -:104BE00014F4605D01C0695CD8016C93232B242B05 -:104BF000252B61F7B801C7010E94B125A1960FB618 -:104C0000F894DEBF0FBECDBFDF91CF911F910F9102 -:104C1000FF90EF907F906F905F904F9008950C946D -:104C2000B12582E494E00C94B12590E0FC01EF56AC -:104C3000FC4F2491FC01E358FC4F8491882399F0A8 -:104C400090E0880F991FFC01ED58FC4FA591B4919D -:104C5000FC01E759FC4F859194918FB7F894EC9142 -:104C6000E22BEC938FBF0895CF93DF93482F50E052 -:104C700060E070E02AE082E494E00E94C625EC0146 -:104C800064E473E082E494E00E94B1258C0F9D1FE0 -:104C9000DF91CF910895811104C08091230688236C -:104CA000D9F060E084E296E00E94F20F87E296E09D -:104CB0000E94E80F6CE271E080E090E00E94FB232C -:104CC00060E084E296E00E94F20F60E087E296E006 -:104CD0000E94F20F109223060895CF92DF92EF9276 -:104CE000FF92CF93DF930E9435246B017C01C1E0DA -:104CF000D2E0DD2331F089EE95E00E940010882398 -:104D000029F1CC23B1F08CEE95E00E9400108111C6 -:104D100003C0DD2389F0C0E00E943524DC01CB0113 -:104D20008C199D09AE09BF094497A105B10508F387 -:104D300004C0D111F1CFD0E0C0E08D2F8C2BDF91DA -:104D4000CF91FF90EF90DF90CF900895CC2399F30F -:104D5000D0E0D9CF811104C08091230681111CC0FD -:104D600084E296E00E94E80F60E087E296E00E940D -:104D7000F20F6CE271E080E090E00E94FB2360E0C3 -:104D800084E296E00E94F20F60E087E296E00E94E3 -:104D9000F20F81E0809323060895AF92BF92CF92E5 -:104DA000DF92EF92FF920F931F93CF93DF937C01DB -:104DB0006B0184E6A82EB12C0FEF13E0C0E0D0E029 -:104DC0008EED95E00E94A50DC817D90728F0801731 -:104DD000910718F48C0101C0EC0181E0A81AB10818 -:104DE00079F78091CD059091CE05029739F10E9417 -:104DF0004D1F2091FE053091FF05882311F034608E -:104E000001C03B7F3093FF052093FE052091FE05F6 -:104E10003091FF05CB36E3E0DE0748F03E7F32609D -:104E20003093FF052093FE0537FF12C007C03160A5 -:104E30003093FF052093FE0537FF0EC0E114F10407 -:104E400079F0F70111830083F601D183C08308C094 -:104E500080E00E944B26F2CF80E00E94AA26EECF8F -:104E6000DF91CF911F910F91FF90EF90DF90CF9046 -:104E7000BF90AF9008950F931F93CF93DF931F922E -:104E8000CDB7DEB7682F88E169830E94A2206981CF -:104E900081EC95E00E94710B0E94492062E088E15C -:104EA0000E940D1F1092D7038093D60381EC95E0EA -:104EB0000E94180B182F002781EC95E00E94180B18 -:104EC0009801282BC9010F90DF91CF911F910F916D -:104ED0000895CF93DF9300D000D000D0CDB7DEB7D8 -:104EE00080912505882361F10E94FA20882399F199 -:104EF0000E94D90D209126058091270590E03CE382 -:104F0000239F800D911D1124409128052091290592 -:104F100030E07CE3479F200D311D112470E04CE30D -:104F2000549F600D711D11242817390758F4681714 -:104F3000790758F02617370768F08617970728F47F -:104F400080E009C068177907D8F381E0621773071A -:104F500010F0F6CF81E026960FB6F894DEBF0FBEB4 -:104F6000CDBFDF91CF91089590911905977F9093D0 -:104F70001905A0915F05B0916005109749F0ED917A -:104F8000FC9111970280F381E02DCD0109951CC0A1 -:104F900081111CC0809100068E5F8230C8F40E948F -:104FA000351780912505882379F00E946927909113 -:104FB00000069E3F81F0811110C080912505882355 -:104FC00019F081E080932A0580E0089581E008953A -:104FD0000E942416E6CF8111F0CF10922A05F4CF5B -:104FE0001F928F931F9284E28F9387E493E09F93A5 -:104FF0008F938EEA93E09F938F930E940A390E94C9 -:1050000003168DB79EB708960FB6F8949EBF0FBED5 -:105010008DBFE091DF04F091E0040284F385E02D80 -:105020006EEA73E08FED94E00994811103C082E58C -:1050300093E002C08FE493E09F938F931F9284E2EA -:105040008F9385E593E09F938F938EEA93E09F93F0 -:105050008F930E940A398DB79EB708960FB6F894C1 -:105060009EBF0FBE8DBF80910105882361F065E46E -:1050700072E08EEA93E00E94F83861EE74E08EEA06 -:1050800093E00E94F838209118052223E1F0EEEA1F -:10509000F3E001900020E9F71F922F931F922AE37B -:1050A0002F932AE533E03F932F93CF0101979F93EE -:1050B0008F930E940A398DB79EB708960FB6F89461 -:1050C0009EBF0FBE8DBF0E940316E091DF04F091DA -:1050D000E0040284F385E02D6EEA73E08FED94E046 -:1050E000099580911705882359F0E091DF04F0912C -:1050F000E0040084F185E02D6AE08FED94E00994EE -:105100000895CF93DF93C5E2D5E081E0888361E025 -:1051100084E090E00E94E93B1D82EDECF5E081A97E -:1051200092A9906192AB81AB81E0DF91CF910C9419 -:105130003811CF93DF93C5E2D5E0188260E084E0B8 -:1051400090E00E94E93B1D82EDECF5E081A992A977 -:105150009F7E92AB81AB81E0DF91CF910C943811AF -:10516000CF93C82F2091FE053091FF052260309328 -:10517000FF052093FE0582E00E94381180E00E9426 -:105180000D250E940A028091CD059091CE050297CF -:10519000C1F360E070E080E090E00E94CD260E94C4 -:1051A0004D1F8111EECFCC2361F310920006809148 -:1051B000FE059091FF058D7F9093FF058093FE057E -:1051C000CF910895CF92DF92EF92FF92CF93DF932A -:1051D0006B017C01E0912F05F09130050190F08189 -:1051E000E02D6DE28FE295E00995EC01442755270B -:1051F000BA014C195D096E097F092AE08FE295E03A -:105200000E94C6258C0F9D1FDF91CF91FF90EF90DC -:10521000DF90CF900895CF93DF93C82F48E050E000 -:105220008EEA93E00E94AB3B80913A058823B1F06F -:10523000C77088E0C89FB0011124606440E08FE22D -:1052400095E00E94010FCEEAD3E069918FE295E0EC -:105250000E944A0F83E0C63BD807B9F7DF91CF9190 -:105260000895CF93DF9300D000D000D0CDB7DEB744 -:10527000789484B5826084BD84B5816084BD85B531 -:10528000826085BD85B5816085BD80916E0081603D -:1052900080936E00109281008091810082608093E3 -:1052A00081008091810081608093810080918000E5 -:1052B0008160809380008091B10084608093B10010 -:1052C0008091B00081608093B00080917A0084600A -:1052D00080937A0080917A00826080937A00809136 -:1052E0007A00816080937A0080917A008068809350 -:1052F0007A001092C1000FB6F894A89580916000D2 -:10530000886180936000109260000FBE60E971E0D8 -:1053100080E090E00E94FB23E0915204F09153045E -:1053200082E08083E0914E04F0914F041082E0917E -:105330005004F091510480E1808310925A04E0916E -:105340005604F091570486E08083E0915404F09174 -:105350005504808180618083E0915404F09155046C -:10536000808188608083E0915404F09155048081AD -:1053700080688083E0915404F091550480818F7D92 -:10538000808386E290E0909354058093530588E0F3 -:105390008093550561E070E083E595E00E94BB0DC8 -:1053A0001092D7031092D6031092D9031092FA03E9 -:1053B0001092410481E08093400410923B0488B134 -:1053C000806388B98091B9008E7F8093B900809105 -:1053D000B9008D7F8093B9008CE08093B80085E49C -:1053E0008093BC00A89510923D058091380580629D -:1053F0000E94A22080E00E94E20E8FE10E94E20E55 -:105400000E944920882339F080913A05823019F4AE -:1054100010923A058CC08091380580620E94A220CB -:105420008CE00E94E20E8FE10E94E20E0E94492071 -:10543000882321F080913A05823051F3809138051C -:1054400080620E94A22081E00E94E20E80E00E9421 -:10545000E20E0E94492090913A05882311F0923083 -:10546000B9F2923019F481E080933A0580913305C6 -:1054700088608093330582E080933605109237056B -:1054800010923C0510923B0513E068E38FE295E033 -:105490000E94E70E68E18FE295E00E94E70E11504E -:1054A000A1F768E28FE295E00E94E70E68E08FE2E4 -:1054B00095E00E94E70E65E070E080E090E00E94D9 -:1054C000FB2360913305606240E08FE295E00E942B -:1054D000010F65E070E080E090E00E94FB236091A6 -:1054E0003305606240E08FE295E00E94010F65E0C5 -:1054F00070E080E090E00E94FB238CE08093340514 -:1055000080913A05882331F040E06CE08FE295E02D -:105510000E94010F8FE295E00E94BF0F82E080930E -:10552000350540E066E08FE295E00E94010F809132 -:105530003A05882319F087E00E94AC2087E00E949A -:10554000EE2067E171E080E00E940B296FE071E0DE -:1055500081E00E940B2967E071E082E00E940B2944 -:105560006FEF70E083E00E940B2967EF70E085E049 -:105570000E940B298FE295E00E94BF0F6DEE70E054 -:1055800080E090E00E947C2140E150E067EE70E016 -:105590008EE395E00E94C63B10924E0541E060E02C -:1055A0008FE295E00E94540F6EE375E08FE295E084 -:1055B0000E940F2680EE90E00E9428216CED75E09D -:1055C00080E090E00E94840DA8951092170510923B -:1055D000E1041092010557984F9B03C010922E06CC -:1055E00003C081E080932E0603E210E010932506AD -:1055F0000093240688E08093260662E070E084E24F -:1056000096E00E94BB0D109328060093270680E1C8 -:105610008093290662E070E087E296E00E94BB0D6D -:1056200081E00E944B26109200061092010682E053 -:1056300090E00E94E33B8C018F3F2FEF920751F0E7 -:1056400090FF08C080913D05816080933D0581E019 -:105650000E94381185E290E00E94D53BF82E80939D -:10566000FA0586E290E00E94D53B8093FB058FEF20 -:105670008F0D8E3F30F089E18093FA058BE48093A3 -:10568000FB0568E272E082E494E00E940F268091BC -:10569000FA050E94342668E372E082E494E00E94F6 -:1056A0000F268091FB050E94342680912E068823C8 -:1056B00039F085E00E94152686E00E9415261EC05E -:1056C00083E290E09093E1058093E00581E0809390 -:1056D000E20562E070E080EE95E00E94BB0D89E299 -:1056E00090E09093E4058093E30580E88093E505DE -:1056F00062E070E083EE95E00E94BB0D83E290E0F3 -:105700009093E7058093E60582E08093E80562E0E8 -:1057100070E086EE95E00E94BB0D89E2E82EF12C48 -:10572000F092EA05E092E90588E08093EB0561E0FC -:1057300070E089EE95E00E94BB0DF092ED05E092DD -:10574000EC0580E18093EE0561E070E08CEE95E081 -:105750000E94BB0DD0902E06F092D005E092CF05AE -:1057600084E08093D10560E070E08FEC95E00E94CA -:10577000BB0D88E39DE0909301018093000180912F -:105780006900836080936900E89A86E08D83DD205C -:1057900021F01D8283E290E002C089E290E02D8139 -:1057A0009093D6058093D50581E001C0880F2A9596 -:1057B000EAF78093D70562E070E085ED95E00E94FE -:1057C000BB0D0E9437200E94861F1092800080E44B -:1057D0009FE1909387008093860081E18093810010 -:1057E000229A8091800080628093800080E090E027 -:1057F0000E94BD1F0F3F3FEF130729F41092FD05D4 -:105800001092FC0509C01093FD050093FC0500FDF6 -:1058100003C0FF24F39402C002E0F02E0E949D21F9 -:10582000882369F08091FC059091FD0585FD07C0F6 -:1058300080629093FD058093FC0512E0F12E8BE0D1 -:1058400090E00E94E33B8C0190933D0680933C06E0 -:1058500089E090E00E94E33B90933F0680933E06F0 -:105860000F3F1F4F21F410923D0610923C06019607 -:1058700031F48CED90E090933F0680933E061092B9 -:1058800034061092350610923606109237061092A2 -:1058900038061092390610923A0610923B06109282 -:1058A0002A0610922B0610922C0610922D0680E0EC -:1058B00092E09093FF058093FE058FEF91E00E94A8 -:1058C000D53B80930D0681508E3F18F080E5809384 -:1058D0000D061092DC0581E190E00E94D53B80939B -:1058E000DD051092F30582E190E00E94D53B8093A4 -:1058F000F4051092F5051092F6051092F705109236 -:10590000F80583E190E00E94D53B8093F905109261 -:10591000EF051092F0051092F1051092F20581E06A -:105920000E940D258091FC059091FD058E71967069 -:10593000892BD1F183E00E94EE208091FC0581FF4C -:1059400004C086EA91E00E94D0188091FC0582FF95 -:1059500004C085E991E00E94D0188091FC0583FF86 -:1059600004C088E891E00E94D0188091FC0584FF73 -:1059700004C088E791E00E94D0188091FC059091C6 -:10598000FD0591FF04C08AE691E00E94D018809145 -:10599000FC059091FD0592FF04C08AE591E00E940C -:1059A000D01887E00E94EE20A89580E090E00E9449 -:1059B000BD1F67E471E081E591E00E948E21809136 -:1059C000FC0585FDEAC066E970E080E090E00E9499 -:1059D000FB238EED95E00E94A50D8C0182E090E006 -:1059E0000E94BD1F0B36134008F4CCC00E946D26E8 -:1059F000182F80912E06882329F061E085E00E940F -:105A0000512304C080EE95E00E94E80F86EE95E0F9 -:105A10000E94E80F6AEF70E080E090E00E94FB23B4 -:105A20000E946D26E82E80912E0660E0882321F0EA -:105A300085E00E94512304C080EE95E00E94F20FA1 -:105A400060E086EE95E00E94F20F6AEF70E080E081 -:105A500090E00E94FB2380912E06882329F061E0CC -:105A600086E00E94512304C083EE95E00E94E80F77 -:105A70006AEF70E080E090E00E94FB230E946D26B8 -:105A8000082F80912E0660E0882321F086E00E9496 -:105A9000512304C083EE95E00E94F20F6AEF70E09C -:105AA00080E090E00E94FB231330C1F582E08E1568 -:105AB00030F08091FC0591E0E91628F020C0A3E0C9 -:105AC000EA1661F0EFC2033011F412E001C010E0F9 -:105AD00084FD2CC0033009F0E3C228C08091FC058E -:105AE00083FD02C0033021F0002321F010E003C049 -:105AF00013E001C012E001500230C0F419C084FD6F -:105B000004C00330A9F014E003C0033089F010E0B2 -:105B1000B1E0EB1208C0023049F4C0C28091FC052C -:105B200084FDC0C2BDC2013009F4B8C2113041F4D5 -:105B30006DE271E08BE391E00E948E2111E008C0DC -:105B4000123031F46FE171E08BE391E00E948E211D -:105B50008DEF810F823098F581E00E94EE201330A6 -:105B600039F461E372E085E092E00E948E213AC050 -:105B7000143029F565E272E085E092E00E948E2102 -:105B800014E030C08091FE059091FF0581609093F4 -:105B9000FF058093FE0511E001C010E08091FC0537 -:105BA00084FD0FC00E946D26082F0E949D2188232E -:105BB00019F001FD06C0DECF0330E1F602C013305C -:105BC00088F48091FC059091FD0591FD0BC00E9429 -:105BD000D21F882339F060E072E085E092E00E94F5 -:105BE0008E2115E08DEF810F833018F481E00E9443 -:105BF000EE2080E090E00E94BD1FA8952091FC055A -:105C00003091FD0525FD05C08FEF810F823008F42E -:105C1000F12E23FD03C0133009F446C280E024FDB9 -:105C200003C0143009F445C231FD03C0153009F436 -:105C300045C2882341F00E94D92481E00E940D25AD -:105C40000E940A02FDCF60E08F2D0E94FE16809117 -:105C5000250581110E9424160E94D92484E090E039 -:105C60000E94D53B8F3F41F41092250560E084E00F -:105C700090E00E94E93B02C0809325052091250514 -:105C80008091FE059091FF05222311F0906101C0E3 -:105C90009F7E9093FF058093FE0585E090E00E9433 -:105CA000D53B8F3F41F41092260560E085E090E0FF -:105CB0000E94E93B02C08093260586E090E00E94A6 -:105CC000D53B8F3F49F485E08093270565E086E06A -:105CD00090E00E94E93B02C08093270587E090E0B6 -:105CE0000E94D53B8F3F49F486E08093280566E00B -:105CF00087E090E00E94E93B02C08093280588E09D -:105D000090E00E94D53B8F3F49F487E380932905BB -:105D100067E388E090E00E94E93B02C08093290598 -:105D200010922A051092190580E096EF90932005B5 -:105D300080931F059093220580932105909324055D -:105D40008093230586E00E943B278435910509F066 -:105D5000B9C187E00E943B278115944009F0B2C188 -:105D600081E080931E059FE088E10FB6F894A89526 -:105D7000809360000FBE9093600022242A94322CFE -:105D8000B8EECB2EB3E0DB2EE12CF12CA8953A82B5 -:105D900029820E9435244B015C01809100068F3FCF -:105DA00009F46EC0BE016F5F7F4FCE0103960E9463 -:105DB000CD266090FE057090FF05C3018827957081 -:105DC0000097B9F081159540A1F00E944D1F8823DE -:105DD00081F010921F061092200610922106109258 -:105DE00022061092170610921806109219061092A9 -:105DF0001A06809100068E3F09F05FC066FE43C020 -:105E00000E94B9172091340630913506409136062C -:105E100050913706A0913E06B0913F06E0913C06B6 -:105E2000F0913D0689819A818C30934008F04DC1F4 -:105E30000E94EB382F01FF0F66087708DC01CB01C9 -:105E400084199509A609B709893E9340A105B105B2 -:105E50000CF43BC18091130690911406A091150695 -:105E6000B0911606881A990AAA0ABB0A58EB851639 -:105E70005BE09506A104B10408F027C180910006FB -:105E80008093010638C062FE27C10E944D1F811118 -:105E900023C1E89462F87092FF056092FE051092AB -:105EA000000600E08091FE059091FF05882795701F -:105EB000009709F00DC10111E1CF109100060E9479 -:105EC0006D26682E0E949D21882331F09091FC055B -:105ED00093FD02C060FC0FC19091FE0596FD0CC6BB -:105EE0008111AEC6173009F0ABC60E944D1F81115B -:105EF00039C6109200060E944D1F082F809155064A -:105F000081FFBCC5011102C00E94511F809155063E -:105F100080FF73C09091FE0596FFDAC5CCC50E9444 -:105F200035242B013C018091490690914A06A091AD -:105F30004B06B0914C0653014201881A990AAA0AED -:105F4000BB0A6BEF86169104A104B10408F450C09B -:105F50008091380690913906A0913A06B0913B069F -:105F60009C01AD0182E056954795379527958A9516 -:105F7000D1F78091450690914606A0914706B091D1 -:105F80004806BC01CD01E4E0969587957795679525 -:105F9000EA95D1F70E943F3829E03DE340E050E028 -:105FA0000E948338CA01B901A50194010E943F38BB -:105FB000A70196010E948338809151069091520664 -:105FC000A0915306B0915406820F931FA41FB51FD2 -:105FD0008093510690935206A0935306B0935406B3 -:105FE0004092490650924A0660924B0670924C06C7 -:105FF0008091550684608093550680915506002354 -:1060000011F0826001C08D7F8093550680E00E9470 -:1060100038110E940A02809100069CEF980F9B3075 -:10602000D0F18F3FC1F1809125058823A1F10E9415 -:10603000FA20882381F10E9435244B015C01809174 -:106040002B0590912C05A0912D05B0912E052401D2 -:106050003501481A590A6A0A7B0A29EE421623E0DA -:10606000520661047104B8F00E94692790910006FD -:1060700020912A05882309F433C521112BC59E3FA1 -:1060800011F40E94351780922B0590922C05A09256 -:106090002D05B0922E050E94AF2278CE12E052CD8F -:1060A00014E056CD10E054CD87E08093000681E0E7 -:1060B000B6CD88E08093000681E0B6CD89E080937C -:1060C0000006B9CD10921E054ECE0E94861FD6CE78 -:1060D0008115954019F4EFCE01E0E4CE0E944D1FEA -:1060E000811102C010922A0581E00E94381180E0DF -:1060F0000E940D25E0CE87E0809300060E94861F57 -:10610000173059F06091F4056F5F6E3F30F4609383 -:10611000F40582E190E00E94E93B00E097E0809185 -:10612000D205882309F450C086E08093000616301B -:10613000C1F06091DD056F5F6E3F30F46093DD0567 -:1061400081E190E00E94E93B1092DC058092D80545 -:106150009092D905A092DA05B092DB0500E096E0B6 -:1061600033C00E944D1F811105C0109200060E948D -:106170003720C1CE8091D8059091D905A091DA053C -:10618000B091DB0524013501481A590A6A0A7B0AD5 -:1061900020EE421623E9520624E06206710490F0D4 -:1061A0008091DC058F5F8093DC05873008F088C321 -:1061B0000E9437201092D8051092D9051092DA0566 -:1061C0001092DB0596E000E02091FC053091FD0582 -:1061D00032FD1AC020912305309124052E3E324015 -:1061E00074F420911F0530912005263C32403CF488 -:1061F0002091210530912205263C32402CF08AE086 -:106200008093000600E09AE0309104060023F9F044 -:106210008CEF810F8B3048F480E090E03E830E9449 -:10622000BD1F1092000610E03E812091FC0521FD6B -:10623000EDC28091CD059091CE05019709F0E6C29F -:106240008B819C818430914008F067C5DFC280E07B -:10625000831721F120910306821749F080920906E5 -:1062600090920A06A0920B06B0920C0617C04091BD -:10627000090650910A0660910B0670910C062401E4 -:106280003501441A550A660A770AB301A2014A3F4A -:1062900051056105710510F0809304068093030693 -:1062A0009093020690910006911709F49DC02FEF7C -:1062B000290F233080F580930406913061F50E9408 -:1062C000861F80E090E00E94BD1F10924106109250 -:1062D00042061092430610924406109240068091A6 -:1062E000FE059091FF051092300610923106109233 -:1062F00032061092330610922F068F7E9F7D909368 -:10630000FF058093FE0510922A0580911905877F6D -:106310008093190569C0923041F40E94861F8091D4 -:106320000E0690E00E9440165FC09330C1F4809149 -:106330000E0690E00E9440168091FC059091FD05AC -:1063400091FDC2C20E94D21F882309F4BDC289E018 -:106350008093000680E090E00E94BD1FB1C294309F -:1063600019F40E94861F2AC0963039F40E94861FB5 -:1063700080E090E00E94BD1F37C09A30B1F480E009 -:1063800090E00E94BD1F0E943524DC01CB018819DA -:106390009909AA09BB0988389341A105B10510F4F0 -:1063A000A895F1CF0E94861F0DC0953069F40E9418 -:1063B000861F80910E0690E00E94401680E090E0DB -:1063C0000E94BD1F81E007C0973081F2983031F400 -:1063D0000E94861F80E00E94B02806C080E090E006 -:1063E0000E94BD1F0E94861F011116C01330A1F428 -:1063F00080910F0690911006A0911106B09112069F -:10640000881A990AAA0ABB0A31ED831637E0930667 -:10641000A104B10408F454C210930106809100064F -:10642000833009F06FC080913E0690913F061816A8 -:1064300019060CF067C00E94B9170091340610913C -:10644000350620913606309137066091660361115A -:1064500008C01092620310926303109264031092BA -:1064600065038091620390916303A0916403B091EE -:106470006503080F191F2A1F3B1F00936203109327 -:106480006303209364033093650381E0860F809358 -:1064900066038032B9F510926603A9019801F5E010 -:1064A0005695479537952795FA95D1F7A0913E06D1 -:1064B000B0913F060E94EB3880903C0690903D06DC -:1064C000092C000CAA08BB08DC01CB01881999092A -:1064D000AA09BB09B7FD09C0809338069093390615 -:1064E000A0933A06B0933B0608C01092380610926B -:1064F000390610923A0610923B0680913D0580685D -:1065000080933D0580910006833009F062C0A09120 -:106510000E06B0E0159628EE33E00E94D938809040 -:10652000380690903906A0903A06B0903B06861641 -:106530009706A806B9060CF44CC080912A069091E3 -:106540002B06A0912C06B0912D06892B8A2B8B2B24 -:10655000A9F10E94352480902A0690902B06A090E5 -:106560002C06B0902D06DC01CB0188199909AA09E7 -:10657000BB0988389341A105B10598F15BE05093C0 -:10658000000680E090E00E94BD1F0E9435244B0170 -:106590005C010E943524DC01CB0188199909AA0904 -:1065A000BB09883E9340A105B10510F4A895F1CF31 -:1065B0000E94861F81E00E94B0280BC00E943524F3 -:1065C00060932A0670932B0680932C0690932D06D9 -:1065D00008C010922A0610922B0610922C061092D8 -:1065E0002D068091FC059091FD0592FD30C00E9422 -:1065F00071169091190590FFE9C120912305309102 -:106600002405293532400CF0E1C120911F0530915D -:1066100020052D3632400CF0D9C120912105309152 -:1066200022052D3632400CF0D1C19E7F9093190582 -:1066300041E060E00E949D168091CD059091CE05CD -:10664000019729F080910E0690E00E9440168091FB -:106650000006833009F0D6C0809117069091180685 -:10666000A0911906B0911A0680931B0690931C0600 -:10667000A0931D06B0931E060E94352480900F063D -:1066800090901006A0901106B09012066819790932 -:106690008A099B09A70196010E9483382093170657 -:1066A000309318064093190650931A068091FC0502 -:1066B0009091FD0592FD45C080911B0690911C06AE -:1066C000A0911D06B0911E06281739074A075B07DF -:1066D000C1F10E9471169091190590FD18C020918A -:1066E0002305309124052A3832400CF08CC12091CA -:1066F0001F05309120052A3832400CF084C12091CA -:106700002105309122052A3832400CF07CC191FDE0 -:1067100018C020912305309124052C3B32400CF009 -:1067200087C120911F0530912005283A32400CF096 -:106730007FC12091210530912205283A32400CF08A -:1067400077C18091410690914206A0914306B09195 -:1067500044060097A105B10571F040915106509192 -:1067600052066091530670915406481759076A07FC -:106770007B0708F061C1409130065091310660916D -:106780003206709133064115510561057105D1F14D -:1067900080901F0690902006A0902106B0902206BF -:1067A0008091170690911806A0911906B0911A06CB -:1067B000880D991DAA1DBB1D84179507A607B7074D -:1067C00008F11092300610923106109232061092A3 -:1067D000330610922F068091FE059091FF051092CE -:1067E00041061092420610924306109244061092FF -:1067F00040068F7E9F7D84609093FF058093FE0509 -:106800000E94241680E00E940D2575CB89819A8113 -:106810008B36B3E09B07F8F48C30B3E09B0790F421 -:10682000823B42E0940740F08091CD059091CE05E7 -:10683000019759F083E007C0892B51F084E022FFD3 -:106840000FC004C082E092E008C083E093E005C07E -:1068500080E090E002C081E091E0911302C0F8CCAA -:1068600094E020910206921749F0809205069092DA -:106870000606A0920706B0920806EACC40910506EB -:1068800050910606609107067091080624013501B3 -:10689000441A550A660A770A913029F04AEF50E007 -:1068A00060E070E004C049E150E060E070E0441650 -:1068B00055066606770608F4CBCC90930006C8CC44 -:1068C00081E00E94B02817CB80912E06882381F1A9 -:1068D00068E272E082E494E00E940F268091FA055B -:1068E0000E94342668E372E082E494E00E940F265E -:1068F0008091FB050E94342661E085E00E945123CF -:1069000061E086E00E9451236091FA0570E080E02A -:1069100090E00E94FB236091FB0570E085E00E94FF -:106920009D236091FB0570E086E00E949D2308C0D6 -:1069300080EE95E00E94E80F83EE95E00E94E80F5C -:1069400086EE95E00E94E80F8091FE059091FF058C -:106950009C0120643093FF052093FE0591FF19C030 -:1069600010921F0610922006109221061092220605 -:106970009D7F80649093FF058093FE050E943524DF -:1069800060930F0670931006809311069093120681 -:106990002BCD409117065091180660911906709101 -:1069A0001A0680911F0690912006A0912106B091B1 -:1069B0002206840F951FA61FB71F80931F06909372 -:1069C0002006A0932106B0932206D8CF91FF3FCE98 -:1069D00020912305309124052B3832400CF037CE1E -:1069E00020911F05309120052B3832400CF02FCE1E -:1069F00020912105309122052B3832400CF027CE12 -:106A000086959D7F13CE869599609093190541E0F8 -:106A100060E00E949D168091CD059091CE05019772 -:106A200009F48FCE80910E0690E00E94401689CE28 -:106A3000869586959A60E9CF10924106109242069B -:106A40001092430610924406109240068091FE0573 -:106A50009091FF0510923006109231061092320686 -:106A60001092330610922F068F7E9F7D8460909344 -:106A7000FF058093FE050E9424167DCE002309F4B5 -:106A800045CA0E94511F1092510610925206109250 -:106A90005306109254060E94352460934906709361 -:106AA0004A0680934B0690934C0680915506816070 -:106AB000809355062BCA82FD32CA0E94352460930A -:106AC000490670934A0680934B0690934C0690CAF1 -:106AD0008B7F91CA9E3F09F4D6CA10922A05D3CA69 -:106AE000211106C09E3F09F4CECA0E942416CBCACB -:106AF0009E3F09F0C8CAF1CF2091FC0524FD1AC0C1 -:106B00008823D1F080910F0690911006A091110674 -:106B1000B0911206A5019401281B390B4A0B5B0B9F -:106B2000DA01C901893E9340A105B105D0F161FCAC -:106B30003BC037C0811135C040910F0650911006FF -:106B40006091110670911206D501C401841B950B4A -:106B5000A60BB70BAC01BD01493E53406105710561 -:106B600050F51FC08091F305863008F064C0409155 -:106B7000EF055091F0056091F1057091F205240147 -:106B80003501441A550A660A770A21EE421623E9AE -:106B9000520624E06206710408F44DC08F5F8093B2 -:106BA000F30501E090E0BBCA0E94861F9EE090932F -:106BB000000600E0B4CA23FD03C0A3E06A1639F062 -:106BC00001E090E08091FE0580FFA9CA1DC0A7E00A -:106BD000A09300060E94861F173059F06091F405BB -:106BE0006F5F6E3F30F46093F40582E190E00E94A5 -:106BF000E93B8092EF059092F005A092F105B092EA -:106C0000F20500E097E0DECF80910006833009F0C6 -:106C100086CA611006C061E082E09E830E94FE1673 -:106C20009E812091FE053091FF052E7F3093FF0558 -:106C30002093FE0574CA37E03093000697E0B9CF81 -:106C40009091FC0594FDADCF882319F061FE05C03D -:106C50005BC043E0641609F457C01830A1F080917E -:106C6000F5059091F605A091F705B091F805892BEF -:106C70008A2B8B2B41F48092F5059092F605A09219 -:106C8000F705B092F8058091130690911406A09133 -:106C90001506B091160624013501481A590A6A0AE8 -:106CA0007B0A29EE421623E0520661047104A8F023 -:106CB0008091F5059091F605A091F705B091F80542 -:106CC00024013501481A590A6A0A7B0A29EE42163C -:106CD00023E052066104710420F4183009F061CFFA -:106CE0000DC0183059F06091F9056F5F6E3F30F4B8 -:106CF0006093F90583E190E00E94E93B38E030932E -:106D0000000600E098E00BCA1092F5051092F60517 -:106D10001092F7051092F80544CF85E095E0A1CDDB -:106D2000109245041092440488EE93E0A0E0B0E095 -:106D30008093460490934704A0934804B093490479 -:106D40008CE291E0909343048093420485EC90E0C0 -:106D500090934F0480934E0484EC90E09093510400 -:106D60008093500480EC90E09093530480935204FD -:106D700081EC90E0909355048093540482EC90E071 -:106D8000909357048093560486EC90E090935904B6 -:106D90008093580410925B0410925C0410925D047E -:106DA00010925E04109218058CE391E09093E00439 -:106DB0008093DF0482E791E09093BB058093BA054E -:106DC0008AE093E09093BD058093BC0580E091E05C -:106DD000980FE82FF0E0EE0FFF1FEE59FE4F2081D5 -:106DE0003181232B11F0892FF2CF8093BF058CE5E1 -:106DF00091E09093B5058093B40584E093E090937F -:106E0000B7058093B60580E091E0980FE82FF0E099 -:106E1000EE0FFF1FEE5AFE4F20813181232B11F020 -:106E2000892FF2CF8093B90582E192E09093AE056D -:106E30008093AD0589E493E09093B0058093AF050E -:106E400088E092E09093A9058093A80581E493E0FF -:106E50009093AB058093AA058EEF91E09093A405E3 -:106E60008093A30587E393E09093A6058093A505FF -:106E700024EF31E030939F0520939E052AEE31E008 -:106E800030939A052093990590939C0580939B05D8 -:106E900080EE91E0909395058093940586ED91E0C6 -:106EA0009093900580938F058CEC91E090938B05E7 -:106EB00080938A0582EC91E0909386058093850506 -:106EC0008BE293E0909388058093870528EB31E06F -:106ED00030938105209380059093830580938205EC -:106EE0008EEA91E090937C0580937B0584EA91E0A3 -:106EF00090937705809376058AE991E090937205E7 -:106F00008093710580E991E090936D0580936C0505 -:106F100086E891E090936805809367058EE193E0A1 -:106F200090936A05809369058CE791E090936305DF -:106F30008093620583E193E09093650580936405F7 -:106F40001092560510925705109258051092590547 -:106F500010925A0510925B0510925C0510925D0527 -:106F600010925E051092600510925F051092320536 -:106F7000109231058EE491E09093300580932F05B7 -:106F800082E080933A051092390580E280933805BB -:106F90001092330580EA95E1AFEFBFEF80932B05A8 -:106FA00090932C05A0932D05B0932E0510921E05ED -:106FB0001092C4051092C30588EE93E0A0E0B0E003 -:106FC0008093C5059093C605A093C705B093C805E7 -:106FD0008CE192E09093C2058093C10581E080939B -:106FE000DE051092DF0510925506109251061092A0 -:106FF000520610925306109254068DE090E00E94C3 -:10700000DD3B6F3F7F4F8F4F9F4F39F440E050E0A3 -:10701000BA018DE090E00E94F73B8DE090E00E9485 -:10702000DD3B60934D0670934E0680934F06909320 -:10703000500608950F931F93CF93DF93EC0160E008 -:1070400070E0CB01E991EE23A9F0AAE0B0E09B014A -:10705000AC010E94E0380E2E000CFF0BAF01405334 -:1070600051098A01550F220B330B600F711F821FCC -:10707000931FE8CFDF91CF911F910F910895DB010E -:107080008F939F930E94E038BF91AF91A29F800D94 -:10709000911DA39F900DB29F900D11240895991BEF -:1070A00079E004C0991F961708F0961B881F7A95FF -:1070B000C9F780950895AA1BBB1B51E107C0AA1F01 -:1070C000BB1FA617B70710F0A61BB70B881F991F89 -:1070D0005A95A9F780959095BC01CD01089597FB2D -:1070E000072E16F4009407D077FD09D00E945B3874 -:1070F00007FC05D03EF4909581959F4F08957095BB -:1071000061957F4F0895A1E21A2EAA1BBB1BFD01BA -:107110000DC0AA1FBB1FEE1FFF1FA217B307E40776 -:10712000F50720F0A21BB30BE40BF50B661F771FCE -:10713000881F991F1A9469F76095709580959095AE -:107140009B01AC01BD01CF010895052E97FB1EF4F4 -:1071500000940E94BC3857FD07D00E94833807FC7A -:1071600003D04EF40C94BC38509540953095219541 -:107170003F4F4F4F5F4F0895909580957095619563 -:107180007F4F8F4F9F4F0895EE0FFF1F0590F49193 -:10719000E02D0994A29FB001B39FC001A39F700D81 -:1071A000811D1124911DB29F700D811D1124911D0F -:1071B00008950E94CA38B7FF0895821B930B089563 -:1071C0000E94CA38A59F900DB49F900DA49F800D7A -:1071D000911D11240895B7FF0C94E0380E94E03807 -:1071E000821B930B089581E090E0F8940C944B3C43 -:1071F000FB01DC010D900020E9F7119701900D9241 -:107200000020E1F70895FB01DC0101900D920020C0 -:10721000E1F70895AEE0B0E0E0E1F9E30C94223C40 -:107220000D891E8986E08C831A8309838FEF9FE77F -:107230009E838D83AE01475E5F4F6F89788DCE014F -:1072400001960E942D392F813885F801E20FF31F36 -:1072500010822E96E4E00C943E3CACE0B0E0E3E318 -:10726000F9E30C94143C7C016B018A01FC01178248 -:107270001682838181FFBDC1CE0101964C01F701C9 -:107280009381F60193FD859193FF81916F0188238E -:1072900009F4ABC1853239F493FD859193FF819157 -:1072A0006F01853229F4B70190E00E94153BE7CFCA -:1072B000512C312C20E02032A0F48B3269F030F4D4 -:1072C000803259F0833269F420612CC08D3239F05C -:1072D000803339F4216026C02260246023C02860F6 -:1072E00021C027FD27C030ED380F3A3078F426FF53 -:1072F00006C0FAE05F9E300D1124532E13C08AE0C1 -:10730000389E300D1124332E20620CC08E3221F4B1 -:1073100026FD6BC1206406C08C3611F4206802C0C3 -:10732000883641F4F60193FD859193FF81916F01B9 -:107330008111C1CF982F9F7D9554933028F40C5F15 -:107340001F4FFFE3F9830DC0833631F0833771F0AF -:10735000833509F05BC022C0F801808189830E5F0C -:107360001F4F44244394512C540115C03801F2E0BE -:107370006F0E711CF801A080B18026FF03C0652D3F -:1073800070E002C06FEF7FEFC5012C870E940A3BBF -:107390002C0183012C852F77222E17C03801F2E0B3 -:1073A0006F0E711CF801A080B18026FF03C0652D0F -:1073B00070E002C06FEF7FEFC5012C870E94FF3A9B -:1073C0002C012C852068222E830123FC1BC0832DD9 -:1073D00090E048165906B0F4B70180E290E00E94B0 -:1073E000153B3A94F4CFF50127FC859127FE819156 -:1073F0005F01B70190E00E94153B31103A94F1E033 -:107400004F1A51084114510471F7E5C0843611F048 -:10741000893639F5F80127FF07C0608171818281C3 -:1074200093810C5F1F4F08C060817181072E000C93 -:10743000880B990B0E5F1F4F2F76722E97FF09C096 -:1074400090958095709561957F4F8F4F9F4F2068E5 -:10745000722E2AE030E0A4010E944D3BA82EA8180D -:1074600044C0853729F42F7EB22E2AE030E025C0B3 -:10747000F22FF97FBF2E8F36C1F018F4883579F0DE -:10748000B4C0803719F0883721F0AFC02F2F2061AA -:10749000B22EB4FE0DC08B2D8460B82E09C024FF1F -:1074A0000AC09F2F9660B92E06C028E030E005C0C4 -:1074B00020E130E002C020E132E0F801B7FE07C071 -:1074C00060817181828193810C5F1F4F06C0608152 -:1074D000718180E090E00E5F1F4FA4010E944D3B40 -:1074E000A82EA818FB2DFF777F2E76FE0BC0372D18 -:1074F0003E7FA51450F474FE0AC072FC08C0372DFC -:107500003E7E05C0BA2C372D03C0BA2C01C0B52C65 -:1075100034FF0DC0FE01EA0DF11D8081803311F4AE -:10752000397E09C032FF06C0B394B39404C0832FE0 -:10753000867809F0B39433FD13C030FF06C05A2C8F -:10754000B31418F4530C5B18B32CB31468F4B701DC -:1075500080E290E03C870E94153BB3943C85F5CFD8 -:10756000B31410F43B1801C0312C34FF12C0B70122 -:1075700080E390E03C870E94153B3C8532FF17C0BA -:1075800031FD03C088E790E002C088E590E0B701D4 -:107590000CC0832F867859F031FF02C08BE201C006 -:1075A00080E237FD8DE2B70190E00E94153BA51403 -:1075B00038F4B70180E390E00E94153B5A94F7CF6E -:1075C000AA94F401EA0DF11D8081B70190E00E94B8 -:1075D000153BA110F5CF332009F451CEB70180E25D -:1075E00090E00E94153B3A94F6CFF701868197818F -:1075F00002C08FEF9FEF2C96E2E10C94303CFC012F -:107600000590615070400110D8F7809590958E0FCD -:107610009F1F0895FC016150704001900110D8F740 -:10762000809590958E0F9F1F08950F931F93CF9372 -:10763000DF93FB01238121FD03C08FEF9FEF28C063 -:1076400022FF16C046815781248135814217530796 -:1076500044F4A081B1819D012F5F3F4F318320838E -:107660008C93268137812F5F3F4F3783268310C04D -:10767000EB01092F182F0084F185E02D0995892B46 -:10768000E1F68E819F8101969F838E83812F902FBB -:10769000DF91CF911F910F910895FA01AA27283009 -:1076A00051F1203181F1E8946F936E7F6E5F7F4FCF -:1076B0008F4F9F4FAF4FB1E03ED0B4E03CD0670F4B -:1076C000781F891F9A1FA11D680F791F8A1F911D9E -:1076D000A11D6A0F711D811D911DA11D20D009F4EE -:1076E00068943F912AE0269F11243019305D319330 -:1076F000DEF6CF010895462F4770405D4193B3E019 -:107700000FD0C9F7F6CF462F4F70405D4A3318F0BF -:10771000495D31FD4052419302D0A9F7EACFB4E070 -:10772000A6959795879577956795BA95C9F7009728 -:107730006105710508959B01AC010A2E06945795C9 -:10774000479537952795BA95C9F7620F731F841F20 -:10775000951FA01D0895FB01DC0102C005900D924C -:1077600041505040D8F70895FB01DC010D900020F6 -:10777000E9F7119705900D920020E1F70895FB01BC -:10778000DC0105900D920020E1F70895FB01DC017A -:107790004150504048F005900D920020C9F701C0BB -:1077A0001D9241505040E0F70895F999FECF92BDE7 -:1077B00081BDF89A992780B50895A6E1B0E044E02C -:1077C00050E00C94063CA8E1B0E042E050E00C949C -:1077D000063C262FF999FECF1FBA92BD81BD20BD70 -:1077E0000FB6F894FA9AF99A0FBE01960895242FCD -:1077F0000E94EA3B252F0E94EA3B0C94FF3B0E942B -:10780000E93B272F0C94EA3BDC01CB01FC01F99901 -:10781000FECF06C0F2BDE1BDF89A319600B40D92DC -:1078200041505040B8F708952F923F924F925F9287 -:107830006F927F928F929F92AF92BF92CF92DF9280 -:10784000EF92FF920F931F93CF93DF93CDB7DEB7E5 -:10785000CA1BDB0B0FB6F894DEBF0FBECDBF099479 -:107860002A88398848885F846E847D848C849B84D0 -:10787000AA84B984C884DF80EE80FD800C811B81DE -:10788000AA81B981CE0FD11D0FB6F894DEBF0FBE0D -:0A789000CDBFED010895F894FFCF7D -:10789A00DE22DE22000040001400540052455452F9 -:1078AA005920494E20004C25643A25644100EF02D4 -:1078BA000F0319039702F302000000004622C221B7 -:1078CA000F22ED2101228D2200000000F322EF2277 -:1078DA00E022DF22EB221126E122000000004A0FFB -:1078EA00C221AD05A305000000000000280C0C0C05 -:1078FA00A40B620567058505B405A805000000000C -:10790A0000007B0C380CCC0F000000003F1C261C2A -:10791A000C1C00000000921C7D1CA41C000000002E -:10792A005D194F19BE1C000000007E197019E81C71 -:10793A0000000000B119A319911900000000E8190C -:10794A00DA19C81900000000A21D641D121D0000EA -:10795A000000F418C91DDB1800000000971AE51D85 -:10796A00861E00000000D71A071EB81A0000000081 -:10797A00321B181BF81A000000007F1B291E601B0F -:10798A0000000000D81E4A1EA01B000000000219B9 -:10799A006A1E3C1D00000000FE0BE20BBB0B000040 -:1079AA000000E60C900FAC0C00000000710B340BC9 -:1079BA002C0B180B090B080B0A72656C6179436C66 -:1079CA006F73654D733A200072656C6179486F6C0C -:1079DA006450776D3A2000256420256300257820BD -:1079EA00257820257800256C6420256C64002530D4 -:1079FA00327820256C64202530327820253034787E -:107A0A00002564202564202564202564202564201F -:107A1A00256400256C7520256C7500256357462062 -:107A2A0025303278002B00596573004C31004C32F6 -:107A3A00002573204D61782043757272656E74005B -:107A4A002B2564410025356C7557680025366C7501 -:107A5A006B57680020256441002533642E25644154 -:107A6A00002532642E2531644300253032643A25DC -:107A7A003032643A25303264005E2530325800597B -:107A8A0065732F4E6F003A002F006F666600206DF7 -:107A9A00696E002E350020687200206B576800530B -:107AAA006574205374617274005365742053746F43 -:107ABA007000256341422025303278200025634139 -:107ACA00542025303278202530327820256420252C -:107ADA00303478000D0A002563414E202564004F9A -:107AEA004B004E4B00256325730020256325303259 -:027AFA00580032 -:107E0000112484B714BE81FFF0D085E080938100F7 -:107E100082E08093C00088E18093C10086E0809377 -:107E2000C20080E18093C4008EE0C9D0259A86E02C -:107E300020E33CEF91E0309385002093840096BBD3 -:107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 -:107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 -:107E6000A2D0813461F49FD0082FAFD0023811F036 -:107E7000013811F484E001C083E08DD089C08234E0 -:107E800011F484E103C0853419F485E0A6D080C0E4 -:107E9000853579F488D0E82EFF2485D0082F10E0AE -:107EA000102F00270E291F29000F111F8ED06801E7 -:107EB0006FC0863521F484E090D080E0DECF843638 -:107EC00009F040C070D06FD0082F6DD080E0C81688 -:107ED00080E7D80618F4F601B7BEE895C0E0D1E017 -:107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 -:107EF00018F0F601B7BEE89568D007B600FCFDCFD4 -:107F0000A601A0E0B1E02C9130E011968C91119780 -:107F100090E0982F8827822B932B1296FA010C0160 -:107F200087BEE89511244E5F5F4FF1E0A038BF0790 -:107F300051F7F601A7BEE89507B600FCFDCF97BE46 -:107F4000E89526C08437B1F42ED02DD0F82E2BD052 -:107F50003CD0F601EF2C8F010F5F1F4F84911BD097 -:107F6000EA94F801C1F70894C11CD11CFA94CF0C13 -:107F7000D11C0EC0853739F428D08EE10CD085E9AC -:107F80000AD08FE07ACF813511F488E018D01DD067 -:107F900080E101D065CF982F8091C00085FFFCCF94 -:107FA0009093C60008958091C00087FFFCCF809118 -:107FB000C00084FD01C0A8958091C6000895E0E648 -:107FC000F0E098E1908380830895EDDF803219F02E -:107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA -:107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 -:047FF000FF270994CA -:027FFE00040479 -:0400000300007E007B -:00000001FF diff --git a/firmware/open_evse/open_evse.sln b/firmware/open_evse/open_evse.sln deleted file mode 100644 index acae7e85..00000000 --- a/firmware/open_evse/open_evse.sln +++ /dev/null @@ -1,44 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "open_evse", "open_evse.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32 - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32 - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32 - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "open_evse", "open_evse.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32 - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32 - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32 - {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/firmware/open_evse/open_evse.vcxproj b/firmware/open_evse/open_evse.vcxproj deleted file mode 100644 index 5895db75..00000000 --- a/firmware/open_evse/open_evse.vcxproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {C5F80730-F44F-4478-BDAE-6634EFC2CA88} - - - open_evse - - - - Application - true - - - MultiByte - - - Application - false - - - true - MultiByte - - - - - - - - - - - - - - - Level3 - Disabled - true - $(ProjectDir)..\open_evse;$(ProjectDir)..\..\..\..\hacking\arduino\arduino-1.8.3\libraries;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\hardware\avr\1.6.15\libraries;$(ProjectDir)..\..\..\..\Geek\Google Drive\arduino\sketchbook\libraries;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\hardware\avr\1.6.15\cores\arduino;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\hardware\avr\1.6.15\variants\standard;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2\avr\include\;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2\avr\include\avr\;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2\lib\gcc\avr\4.8.1\include;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2\lib\gcc\avr\4.9.2\include;C:\Users\Geek\AppData\Local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories) - $(ProjectDir)__vm\.open_evse.vsarduino.h;%(ForcedIncludeFiles) - false - __AVR_ATmega328p__;__AVR_ATmega328P__;_VMDEBUG=1;F_CPU=16000000L;ARDUINO=10803;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions) - - - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - - - - CppCode - - - - - CppCode - - - CppCode - - - CppCode - - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - CppCode - - - - - - - - - - - - - - - - - - - - - - - - - - - VisualMicroDebugger - - - - - \ No newline at end of file diff --git a/firmware/open_evse/open_evse.vcxproj.filters b/firmware/open_evse/open_evse.vcxproj.filters deleted file mode 100644 index 25e10054..00000000 --- a/firmware/open_evse/open_evse.vcxproj.filters +++ /dev/null @@ -1,156 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/firmware/open_evse/rapi_proc.cpp b/firmware/open_evse/rapi_proc.cpp index 3b6633b5..95d39680 100644 --- a/firmware/open_evse/rapi_proc.cpp +++ b/firmware/open_evse/rapi_proc.cpp @@ -33,18 +33,6 @@ const char RAPI_VER[] PROGMEM = RAPIVER; -#ifdef MCU_ID_LEN -// mcuid *must* be of size MCU_ID_LEN -#include -void getMcuId(uint8_t *mcuid) -{ - for (int i=0;i < MCU_ID_LEN;i++) { - mcuid[i] = boot_signature_byte_get(0x0E + i); - } -} -#endif // MCU_ID_LEN - - // convert 2-digit hex string to uint8_t uint8_t htou8(const char *s) { @@ -71,15 +59,25 @@ uint8_t htou8(const char *s) return u; } -// convert decimal string to uint32_t -uint32_t dtou32(const char *s) + +// convert decimal string to int32_t +uint32_t dtoi32(const char *s) { - uint32_t u = 0; + int minus; + int32_t i = 0; + if (*s == '-') { + minus = 1; + s++; + } + else minus = 0; + while (*s) { - u *= 10; - u += *(s++) - '0'; + i *= 10; + i += *(s++) - '0'; } - return u; + if (minus) i = -i; + + return i; } #ifdef RAPI_I2C @@ -162,7 +160,7 @@ void EvseRapiProcessor::sendBootNotification() void EvseRapiProcessor::sendEvseState() { - sprintf(g_sTmp,"%cAT %02x %02x %d %04x",ESRAPI_SOC,g_EvseController.GetState(),g_EvseController.GetPilotState(),g_EvseController.GetCurrentCapacity(),g_EvseController.GetVFlags()); + sprintf(g_sTmp,"%cAT %02x %02x %d %04x",ESRAPI_SOC,g_EvseController.GetState(),g_EvseController.GetPilotState(),g_EvseController.GetCurrentCapacity(),g_EvseController.GetVFlags()); appendChk(g_sTmp); writeStart(); write(g_sTmp); @@ -285,11 +283,16 @@ int EvseRapiProcessor::processCmd() #ifdef LCD16X2 case 'B': // LCD backlight if (tokenCnt == 2) { - g_OBD.LcdSetBacklightColor(dtou32(tokens[1])); + g_OBD.LcdSetBacklightColor(dtoi32(tokens[1])); rc = 0; } break; #endif // LCD16X2 + case 'C': // reset fault counters + total energy + g_EvseController.ResetFaultCounters(); + g_EnergyMeter.ResetTotkWh(); + rc = 0; + break; case 'D': // disable EVSE g_EvseController.Disable(); rc = 0; @@ -326,6 +329,16 @@ int EvseRapiProcessor::processCmd() g_EvseController.EnableStuckRelayChk(u1.u8); break; #endif // ADVPWR +#ifdef BOOTLOCK + case 'L': // boot lock + g_EvseController.EnableBootLock(u1.u8); + break; +#endif // BOOTLOCK +#ifdef OVERCURRENT_THRESHOLD + case 'O': // overcurrent check + g_EvseController.EnableOverCurrentCheck(u1.u8); + break; +#endif // OVERCURRENT_THRESHOLD #ifdef TEMPERATURE_MONITORING case 'T': // temperature monitoring g_EvseController.EnableTempChk(u1.u8); @@ -340,11 +353,22 @@ int EvseRapiProcessor::processCmd() } } break; +#ifdef TEMPERATURE_MONITORING + case 'O': // print to LCD + if (tokenCnt == 2) { + u1.i16 = dtoi32(tokens[1]); + if (u1.i16 > 0) { + g_TempMonitor.SetPanicTemperature(u1.i16); + rc = 0; + } + } + break; +#endif // TEMPERATURE_MONITORING #ifdef LCD16X2 case 'P': // print to LCD if ((tokenCnt >= 4) && !g_EvseController.InHardFault()) { - u1.u = dtou32(tokens[1]); // x - u2.u = dtou32(tokens[2]); // y + u1.u = dtoi32(tokens[1]); // x + u2.u = dtoi32(tokens[2]); // y // now restore the spaces that were replaced w/ nulls by tokenizing for (u3.i=4;u3.i < tokenCnt;u3.i++) { *(tokens[u3.i]-1) = ' '; @@ -376,16 +400,16 @@ int EvseRapiProcessor::processCmd() } break; #endif // LCD16X2 -#ifdef RTC +#ifdef HAVE_RTC case '1': // set RTC if (tokenCnt == 7) { extern void SetRTC(uint8_t y,uint8_t m,uint8_t d,uint8_t h,uint8_t mn,uint8_t s); - SetRTC(dtou32(tokens[1]),dtou32(tokens[2]),dtou32(tokens[3]), - dtou32(tokens[4]),dtou32(tokens[5]),dtou32(tokens[6])); + SetRTC(dtoi32(tokens[1]),dtoi32(tokens[2]),dtoi32(tokens[3]), + dtoi32(tokens[4]),dtoi32(tokens[5]),dtoi32(tokens[6])); rc = 0; } break; -#endif // RTC +#endif // HAVE_RTC #if defined(AMMETER) && defined(ECVF_AMMETER_CAL) case '2': // ammeter calibration mode if (tokenCnt == 2) { @@ -398,7 +422,7 @@ int EvseRapiProcessor::processCmd() case '3': // set time limit if (tokenCnt == 2) { if (g_EvseController.LimitsAllowed()) { - g_EvseController.SetTimeLimit15(dtou32(tokens[1])); + g_EvseController.SetTimeLimit15(dtoi32(tokens[1])); if (!g_OBD.UpdatesDisabled()) g_OBD.Update(OBD_UPD_FORCE); rc = 0; } @@ -408,7 +432,7 @@ int EvseRapiProcessor::processCmd() #if defined(AUTH_LOCK) && !defined(AUTH_LOCK_REG) case '4': // auth lock if (tokenCnt == 2) { - g_EvseController.AuthLock((int8_t)dtou32(tokens[1]),1); + g_EvseController.AuthLock((int8_t)dtoi32(tokens[1]),1); rc = 0; } break; @@ -439,8 +463,8 @@ int EvseRapiProcessor::processCmd() #ifdef AMMETER case 'A': if (tokenCnt == 3) { - g_EvseController.SetCurrentScaleFactor(dtou32(tokens[1])); - g_EvseController.SetAmmeterCurrentOffset(dtou32(tokens[2])); + g_EvseController.SetCurrentScaleFactor(dtoi32(tokens[1])); + g_EvseController.SetAmmeterCurrentOffset(dtoi32(tokens[2])); rc = 0; } break; @@ -460,7 +484,7 @@ int EvseRapiProcessor::processCmd() #endif // BOOTLOCK case 'C': // current capacity if ((tokenCnt == 2) || (tokenCnt == 3)) { - u2.u8 = dtou32(tokens[1]); + u2.u8 = dtoi32(tokens[1]); if ((tokenCnt == 3) && (*tokens[2] == 'M')) { rc = g_EvseController.SetMaxHwCurrentCapacity(u2.u8); sprintf(buffer,"%d",(int)g_EvseController.GetMaxHwCurrentCapacity()); @@ -496,7 +520,7 @@ int EvseRapiProcessor::processCmd() case 'H': // cHarge limit if (tokenCnt == 2) { if (g_EvseController.LimitsAllowed()) { - g_EvseController.SetChargeLimitkWh(dtou32(tokens[1])); + g_EvseController.SetChargeLimitkWh(dtoi32(tokens[1])); if (!g_OBD.UpdatesDisabled()) g_OBD.Update(OBD_UPD_FORCE); rc = 0; } @@ -505,7 +529,7 @@ int EvseRapiProcessor::processCmd() #endif // CHARGE_LIMIT #ifdef KWH_RECORDING case 'K': // set accumulated kwh - g_EnergyMeter.SetTotkWh(dtou32(tokens[1])); + g_EnergyMeter.SetTotkWh(dtoi32(tokens[1])); g_EnergyMeter.SaveTotkWh(); rc = 0; break; @@ -533,7 +557,7 @@ int EvseRapiProcessor::processCmd() #ifdef VOLTMETER case 'M': if (tokenCnt == 3) { - g_EvseController.SetVoltmeter(dtou32(tokens[1]),dtou32(tokens[2])); + g_EvseController.SetVoltmeter(dtoi32(tokens[1]),dtoi32(tokens[2])); rc = 0; } break; @@ -542,10 +566,10 @@ int EvseRapiProcessor::processCmd() case 'T': // timer if (tokenCnt == 5) { extern DelayTimer g_DelayTimer; - u1.u8 = (uint8_t)dtou32(tokens[1]); - u2.u8 = (uint8_t)dtou32(tokens[2]); - u3.u8 = (uint8_t)dtou32(tokens[3]); - u4.u8 = (uint8_t)dtou32(tokens[4]); + u1.u8 = (uint8_t)dtoi32(tokens[1]); + u2.u8 = (uint8_t)dtoi32(tokens[2]); + u3.u8 = (uint8_t)dtoi32(tokens[3]); + u4.u8 = (uint8_t)dtoi32(tokens[4]); if ((u1.u8 == 0) && (u2.u8 == 0) && (u3.u8 == 0) && (u4.u8 == 0)) { g_DelayTimer.Disable(); } @@ -562,7 +586,7 @@ int EvseRapiProcessor::processCmd() #if defined(KWH_RECORDING) && !defined(VOLTMETER) case 'V': // set voltage if (tokenCnt == 2) { - g_EvseController.SetMV(dtou32(tokens[1])); + g_EvseController.SetMV(dtoi32(tokens[1])); rc = 0; } break; @@ -575,15 +599,15 @@ int EvseRapiProcessor::processCmd() } else if (tokenCnt == 3) { //This is a full HEARTBEAT_SUPERVISION setpoint command with both parameters rc = 0; - u1.u16 = (uint16_t)dtou32(tokens[1]); // HS Interval in seconds. 0 = disabled - u2.u8 = (uint8_t)dtou32(tokens[2]); // HS fallback current, in amperes + u1.u16 = (uint16_t)dtoi32(tokens[1]); // HS Interval in seconds. 0 = disabled + u2.u8 = (uint8_t)dtoi32(tokens[2]); // HS fallback current, in amperes if (u1.u16 == 0) { //Test for deactivation { rc = g_EvseController.HsRestoreAmpacity(); } rc |= g_EvseController.HeartbeatSupervision(u1.u16, u2.u8); } else if (tokenCnt == 2) { //This is a command to ack a heartbeat supervision miss - u1.u8 = (uint8_t)dtou32(tokens[1]); //Magic cookie + u1.u8 = (uint8_t)dtoi32(tokens[1]); //Magic cookie rc = g_EvseController.HsAckMissedPulse(u1.u8); } else { //Invalid number of tokens, return 1 @@ -725,6 +749,7 @@ int EvseRapiProcessor::processCmd() uint8_t mcuid[MCU_ID_LEN]; getMcuId(mcuid); char *s = buffer; +#ifdef TARGET_M238P *(s++) = ' '; for (int i=0;i < 6;i++) { *(s++) = mcuid[i]; @@ -733,6 +758,12 @@ int EvseRapiProcessor::processCmd() sprintf(s,"%02X",mcuid[i]); s += 2; } +#else + for (int i=0;i < MCU_ID_LEN;i++) { + sprintf(s,"%02X",mcuid[i]); + s += 2; + } +#endif bufCnt = 1; // flag response text output rc = 0; } @@ -748,15 +779,12 @@ int EvseRapiProcessor::processCmd() break; #endif // VOLTMETER #ifdef TEMPERATURE_MONITORING -#ifdef TEMPERATURE_MONITORING_NY case 'O': - u1.i = g_TempMonitor.m_ambient_thresh; - u2.i = g_TempMonitor.m_ir_thresh; - sprintf(buffer,"%d %d",u1.i,u2.i); + u1.i = g_TempMonitor.m_panicTemperature; + sprintf(buffer,"%d",u1.i); bufCnt = 1; // flag response text output rc = 0; break; -#endif // TEMPERATURE_MONITORING_NY case 'P': sprintf(buffer,"%d %d %d",(int)g_TempMonitor.m_DS3231_temperature, (int)g_TempMonitor.m_MCP9808_temperature, @@ -776,18 +804,22 @@ int EvseRapiProcessor::processCmd() u1.u8 = g_EvseController.GetState(); u2.u8 = g_EvseController.GetPilotState(); u3.u16 = g_EvseController.GetVFlags(); +#ifdef TARGET_M328P sprintf(buffer,"%02x %ld %02x %04x",u1.u8,g_EvseController.GetElapsedChargeTime(),u2.u8,u3.u16); +#else + sprintf(buffer,"%02x %ld %02x %04x",u1.u8,(long int)g_EvseController.GetElapsedChargeTime(),u2.u8,u3.u16); +#endif bufCnt = 1; // flag response text output rc = 0; break; -#ifdef RTC +#ifdef HAVE_RTC case 'T': // get time extern void GetRTC(char *buf); GetRTC(buffer); bufCnt = 1; // flag response text output rc = 0; break; -#endif // RTC +#endif // HAVE_RTC #ifdef KWH_RECORDING case 'U': sprintf(buffer,"%lu %lu",g_EnergyMeter.GetSessionWs(),g_EnergyMeter.GetTotkWh()); @@ -820,7 +852,7 @@ int EvseRapiProcessor::processCmd() #ifdef FAKE_CHARGING_CURRENT case '0': // set fake charging current if (tokenCnt == 2) { - g_EvseController.SetChargingCurrent(dtou32(tokens[1])*1000); + g_EvseController.SetChargingCurrent(dtoi32(tokens[1])*1000); g_OBD.SetAmmeterDirty(1); g_OBD.Update(OBD_UPD_FORCE); rc = 0; @@ -830,13 +862,13 @@ int EvseRapiProcessor::processCmd() } break; #endif //RAPI_T_COMMANDS -#if defined(RELAY_HOLD_DELAY_TUNING) +#if defined(RELAY_PWM) && defined(RELAY_HOLD_DELAY_TUNING) case 'Z': // reserved op switch(*s) { case '0': // set relayCloseMs if (tokenCnt == 3) { - u1.u8 = dtou32(tokens[1]); - u2.u8 = dtou32(tokens[2]); + u1.u8 = dtoi32(tokens[1]); + u2.u8 = dtoi32(tokens[2]); g_EvseController.setPwmPinParms(u1.u8,u2.u8); sprintf(g_sTmp,"\nZ0 %u %u",(unsigned)u1.u8,(unsigned)u2.u8); Serial.println(g_sTmp); @@ -1030,6 +1062,7 @@ EvseSerialRapiProcessor::EvseSerialRapiProcessor() void EvseSerialRapiProcessor::init() { + RAPI_SERIAL_PORT.begin(SERIAL_BAUD); EvseRapiProcessor::init(); } #endif // RAPI_SERIAL @@ -1062,11 +1095,11 @@ EvseI2cRapiProcessor g_EIRP; void RapiInit() { #ifdef RAPI_SERIAL - g_ESRP.init(); #ifdef GPPBUGKLUDGE static char g_rapiSerialBuffer[ESRAPI_BUFLEN]; g_ESRP.setBuffer(g_rapiSerialBuffer); #endif // GPPBUGKLUDGE + g_ESRP.init(); #endif // RAPI_SERIAL #ifdef RAPI_I2C g_EIRP.init(); diff --git a/firmware/open_evse/rapi_proc.h b/firmware/open_evse/rapi_proc.h index 1aa77988..9c36f5a0 100644 --- a/firmware/open_evse/rapi_proc.h +++ b/firmware/open_evse/rapi_proc.h @@ -116,10 +116,17 @@ FB color - set LCD backlight color WHITE 7 $FB 7*03 - set backlight to white +FC - reset fault counters and total energy FD - disable EVSE $FD*AE FE - enable EVSE $FE*AF +FO set Overtemperature threshold + $FO panicthresh + panicthresh in 10ths of a degree Celsius + $FO 705 - set panic threshold to 70.5C + if temperature exceeds panicthresh, EVSE goes into OVER_TEMPERATURE fault state + FP x y text - print text on lcd display OPTIONAL: can substitute character 0x11 for spaces within a string, because they print as on HD44780. More reliable. FR - restart EVSE @@ -138,6 +145,8 @@ FF - enable/disable feature after its replies. Valid only over a serial connection, DO NOT USE on I2C F = GFI self test G = Ground check + L = boot Lock + O = overcurrent check R = stuck Relay check T = temperature monitoring V = Vent required check @@ -213,7 +222,9 @@ SV mv - Set Voltage for power calculations to mv millivolts NOTES: - only available if VOLTMETER not defined and KWH_RECORDING defined - volatile - value is lost, and replaced with VOLTS_FOR_Lx at boot -SY heartbeatinterval hearbeatcurrentlimit +SY heartbeatinterval heartbeatcurrentlimit + heartbeatinterval - seconds. 0 to disable + heartbeatcurrentlimit - max current when no heartbeat within heartbeatinterval Response includes heartbeatinterval hearbeatcurrentlimit hearbeattrigger hearbeattrigger: 0 - There has never been a missed pulse, 2 - there is a missed pulse, and HS is still in current limit @@ -292,20 +303,25 @@ GH - get cHarge limit GI - get MCU ID - requires MCU_ID_LEN to be defined response: $OK mcuid - mcuid: AVR serial number - mcuid is 6 ASCII characters followed by 4 hex digits - first hex digit = FF for 328P - WARNING: mcuid is guaranteed to be unique only for the 328PB. Uniqueness is - unknown in 328P. The first 6 characters are ASCII, and the rest are - hexadecimal. + mcuid: MCU serial number + AVR: + mcuid is 6 ASCII characters followed by 8 hex digits + first hex digit = FF for 328P + WARNING: mcuid is guaranteed to be unique only for the 328PB. Uniqueness is + unknown in 328P. The first 6 characters are ASCII, and the rest are + hexadecimal. + SAMD: + mcuid is 128-bit number + returned as a 32-character hex string GM - get voltMeter settings response: $OK voltcalefactor voltoffset $GM^2E -GO get Overtemperature thresholds - response: $OK ambientthresh irthresh - thresholds are in 10ths of a degree Celcius +GO get Overtemperature threshold + response: $OK panicthresh + panicthresh in 10ths of a degree Celsius + if temperature exceeds panicthresh, EVSE goes into OVER_TEMPERATURE fault state $GO^2C GP - get temPerature (v1.0.3+) response: $OK ds3231temp mcp9808temp tmp007temp @@ -363,7 +379,7 @@ Z0 closems holdpwm #ifdef RAPI -#define RAPIVER "5.2.1" +#define RAPIVER "6.0.0" #define WIFI_MODE_AP 0 #define WIFI_MODE_CLIENT 1 @@ -445,10 +461,10 @@ class EvseRapiProcessor { #ifdef RAPI_SERIAL class EvseSerialRapiProcessor : public EvseRapiProcessor { - int available() { return Serial.available(); } - int read() { return Serial.read(); } - int write(uint8_t u8) { return Serial.write(u8); } - int write(const char *str) { return Serial.write(str); } + int available() { return RAPI_SERIAL_PORT.available(); } + int read() { return RAPI_SERIAL_PORT.read(); } + int write(uint8_t u8) { return RAPI_SERIAL_PORT.write(u8); } + int write(const char *str) { return RAPI_SERIAL_PORT.write(str); } public: EvseSerialRapiProcessor(); diff --git a/firmware/open_evse/Adafruit_TMP007.cpp b/firmware/targets/m328p/Adafruit_TMP007.cpp similarity index 100% rename from firmware/open_evse/Adafruit_TMP007.cpp rename to firmware/targets/m328p/Adafruit_TMP007.cpp diff --git a/firmware/open_evse/Adafruit_TMP007.h b/firmware/targets/m328p/Adafruit_TMP007.h similarity index 100% rename from firmware/open_evse/Adafruit_TMP007.h rename to firmware/targets/m328p/Adafruit_TMP007.h diff --git a/firmware/open_evse/Gfi.cpp b/firmware/targets/m328p/Gfi.cpp similarity index 99% rename from firmware/open_evse/Gfi.cpp rename to firmware/targets/m328p/Gfi.cpp index 470f2ab4..aacf0b85 100644 --- a/firmware/open_evse/Gfi.cpp +++ b/firmware/targets/m328p/Gfi.cpp @@ -79,6 +79,7 @@ uint8_t Gfi::SelfTest() testInProgress = 1; testSuccess = 0; + WDT_RESET(); for(int i=0; !testSuccess && (i < GFI_TEST_CYCLES); i++) { pinTest.write(1); delayMicroseconds(GFI_PULSE_ON_US); diff --git a/firmware/open_evse/Gfi.h b/firmware/targets/m328p/Gfi.h similarity index 100% rename from firmware/open_evse/Gfi.h rename to firmware/targets/m328p/Gfi.h diff --git a/firmware/open_evse/I2CIO.cpp b/firmware/targets/m328p/I2CIO.cpp similarity index 98% rename from firmware/open_evse/I2CIO.cpp rename to firmware/targets/m328p/I2CIO.cpp index 03e583e5..7e8755b0 100644 --- a/firmware/open_evse/I2CIO.cpp +++ b/firmware/targets/m328p/I2CIO.cpp @@ -24,11 +24,8 @@ // // @author F. Malpartida - fmalpartida@gmail.com // --------------------------------------------------------------------------- -#if (ARDUINO < 100) -#include -#else + #include -#endif #include diff --git a/firmware/open_evse/I2CIO.h b/firmware/targets/m328p/I2CIO.h similarity index 100% rename from firmware/open_evse/I2CIO.h rename to firmware/targets/m328p/I2CIO.h diff --git a/firmware/open_evse/J1772Pilot.cpp b/firmware/targets/m328p/J1772Pilot.cpp similarity index 100% rename from firmware/open_evse/J1772Pilot.cpp rename to firmware/targets/m328p/J1772Pilot.cpp diff --git a/firmware/open_evse/J1772Pilot.h b/firmware/targets/m328p/J1772Pilot.h similarity index 100% rename from firmware/open_evse/J1772Pilot.h rename to firmware/targets/m328p/J1772Pilot.h diff --git a/firmware/open_evse/LCD.cpp b/firmware/targets/m328p/LCD.cpp similarity index 99% rename from firmware/open_evse/LCD.cpp rename to firmware/targets/m328p/LCD.cpp index 0c86d972..120e8129 100644 --- a/firmware/open_evse/LCD.cpp +++ b/firmware/targets/m328p/LCD.cpp @@ -36,11 +36,7 @@ #include #include -#if (ARDUINO < 100) -#include -#else #include -#endif #include "./LCD.h" // CLASS CONSTRUCTORS diff --git a/firmware/open_evse/LCD.h b/firmware/targets/m328p/LCD.h similarity index 100% rename from firmware/open_evse/LCD.h rename to firmware/targets/m328p/LCD.h diff --git a/firmware/open_evse/LiquidCrystal_I2C.cpp b/firmware/targets/m328p/LiquidCrystal_I2C.cpp similarity index 100% rename from firmware/open_evse/LiquidCrystal_I2C.cpp rename to firmware/targets/m328p/LiquidCrystal_I2C.cpp diff --git a/firmware/open_evse/LiquidCrystal_I2C.h b/firmware/targets/m328p/LiquidCrystal_I2C.h similarity index 100% rename from firmware/open_evse/LiquidCrystal_I2C.h rename to firmware/targets/m328p/LiquidCrystal_I2C.h diff --git a/firmware/open_evse/LiquidTWI2.cpp b/firmware/targets/m328p/LiquidTWI2.cpp similarity index 98% rename from firmware/open_evse/LiquidTWI2.cpp rename to firmware/targets/m328p/LiquidTWI2.cpp index d0e547e1..ba51535e 100644 --- a/firmware/open_evse/LiquidTWI2.cpp +++ b/firmware/targets/m328p/LiquidTWI2.cpp @@ -689,15 +689,15 @@ void LiquidTWI2::buzz(long duration, uint16_t freq) { while (cycles-- > 0) { ontime = micros(); - Wire.beginTransmission(MCP23017_ADDRESS | _i2cAddr); - wiresend(MCP23017_GPIOA); - wiresend(currentRegister |= M17_BIT_BZ); - while(Wire.endTransmission()); + Wire.beginTransmission(MCP23017_ADDRESS | _i2cAddr); + wiresend(MCP23017_GPIOA); + wiresend(currentRegister |= M17_BIT_BZ); + while(Wire.endTransmission()); while((long)(ontime + (cycletime/2) - micros()) > 0); - Wire.beginTransmission(MCP23017_ADDRESS | _i2cAddr); - wiresend(MCP23017_GPIOA); - wiresend(currentRegister &= ~M17_BIT_BZ); - while(Wire.endTransmission()); + Wire.beginTransmission(MCP23017_ADDRESS | _i2cAddr); + wiresend(MCP23017_GPIOA); + wiresend(currentRegister &= ~M17_BIT_BZ); + while(Wire.endTransmission()); while((long)(ontime + cycletime - micros()) > 0); } } diff --git a/firmware/open_evse/LiquidTWI2.h b/firmware/targets/m328p/LiquidTWI2.h similarity index 100% rename from firmware/open_evse/LiquidTWI2.h rename to firmware/targets/m328p/LiquidTWI2.h diff --git a/firmware/open_evse/RTClib.cpp b/firmware/targets/m328p/RTClib.cpp similarity index 100% rename from firmware/open_evse/RTClib.cpp rename to firmware/targets/m328p/RTClib.cpp diff --git a/firmware/open_evse/RTClib.h b/firmware/targets/m328p/RTClib.h similarity index 100% rename from firmware/open_evse/RTClib.h rename to firmware/targets/m328p/RTClib.h diff --git a/firmware/open_evse/Wire.cpp b/firmware/targets/m328p/Wire.cpp similarity index 100% rename from firmware/open_evse/Wire.cpp rename to firmware/targets/m328p/Wire.cpp diff --git a/firmware/open_evse/Wire.h b/firmware/targets/m328p/Wire.h similarity index 100% rename from firmware/open_evse/Wire.h rename to firmware/targets/m328p/Wire.h diff --git a/firmware/targets/m328p/flash.bat b/firmware/targets/m328p/flash.bat new file mode 100644 index 00000000..26bb4c23 --- /dev/null +++ b/firmware/targets/m328p/flash.bat @@ -0,0 +1,2 @@ +rem avrdude -c USBasp -p m328p -B16 -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0xFD:m +avrdude -c USBasp -p m328p -B0.5 -U flash:w:%1 diff --git a/firmware/open_evse/fuse.bat b/firmware/targets/m328p/fuse.bat similarity index 80% rename from firmware/open_evse/fuse.bat rename to firmware/targets/m328p/fuse.bat index 1a17902c..795f4a23 100644 --- a/firmware/open_evse/fuse.bat +++ b/firmware/targets/m328p/fuse.bat @@ -1,2 +1,2 @@ -avrdude -c usbasp -p m328p -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0x05:m +avrdude -c usbasp -p m328p -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0xFD:m pause diff --git a/firmware/targets/m328p/pindefs.h b/firmware/targets/m328p/pindefs.h new file mode 100644 index 00000000..b4bf6e78 --- /dev/null +++ b/firmware/targets/m328p/pindefs.h @@ -0,0 +1,113 @@ +//#define PZEM_RX_PIN MISO // ICSP 1 +//#define PZEM_TX_PIN MOSI // ICSP 4 +//#define PZEM_RX_PIN 9 // AUX_B = PB1 +//#define PZEM_TX_PIN A3 // AUX_A = PC3 + +#define GFI_INTERRUPT 0 // interrupt number 0 = PD2, 1 = PD3 +// interrupt number 0 = PD2, 1 = PD3 +#define GFI_REG &PIND +#define GFI_IDX 2 + +// pin is supposed to be wrapped around the GFI CT 5+ times +// pin is supposed to be wrapped around the GFI CT 5+ times +#define GFITEST_REG &PIND +#define GFITEST_IDX 6 +// V6 GFI test pin PB0 +#define V6_GFITEST_REG &PINB +#define V6_GFITEST_IDX 0 + + +// button sensing pin +#define BTN_REG &PINC +#define BTN_IDX 3 + + +//J1772EVSEController +#define CURRENT_PIN 0 // analog current reading pin ADCx +#define PILOT_SENSE_PIN 1 // analog pilot voltage reading pin ADCx +#define PP_PIN 2 // PP_READ - ADC2 + + // TEST PIN 1 for L1/L2, ground and stuck relay +#define ACLINE1_REG &PIND +#define ACLINE1_IDX 3 +// TEST PIN 2 for L1/L2, ground and stuck relay +#define ACLINE2_REG &PIND +#define ACLINE2_IDX 4 + +#ifdef VOLTMETER +// N.B. Note, ADC2 is already used as PP_PIN so beware of potential clashes +// voltmeter pin is ADC2 on OPENEVSE_2 +#define VOLTMETER_PIN 2 // analog AC Line voltage voltmeter pin ADCx +#endif // VOLTMETER + +#ifdef OPENEVSE_2 +// This pin must match the last write to CHARGING_PIN, modulo a delay. If +// it is low when CHARGING_PIN is high, that's a missing ground. +// If it's high when CHARGING_PIN is low, that's a stuck relay. +// Auto L1/L2 is done with the voltmeter. +#define ACLINE1_REG &PIND // OpenEVSE II has only one AC test pin. +#define ACLINE1_IDX 3 + +#define CHARGING_REG &PIND // OpenEVSE II has just one relay pin. +#define CHARGING_IDX 7 // OpenEVSE II has just one relay pin. +#else // !OPENEVSE_2 + + // TEST PIN 1 for L1/L2, ground and stuck relay +#define ACLINE1_REG &PIND +#define ACLINE1_IDX 3 + // TEST PIN 2 for L1/L2, ground and stuck relay +#define ACLINE2_REG &PIND +#define ACLINE2_IDX 4 + +#define V6_CHARGING_PIN 5 +#define V6_CHARGING_PIN2 6 + +// digital Relay trigger pin +#define CHARGING_REG &PINB +#define CHARGING_IDX 0 +// digital Relay trigger pin for second relay +#define CHARGING2_REG &PIND +#define CHARGING2_IDX 7 +//digital Charging pin for AC relay +#define CHARGINGAC_REG &PINB +#define CHARGINGAC_IDX 1 + +// obsolete LED pin +//#define RED_LED_REG &PIND +//#define RED_LED_IDX 5 +// obsolete LED pin +//#define GREEN_LED_REG &PINB +//#define GREEN_LED_IDX 5 +#endif // OPENEVSE_2 + +// N.B. if PAFC_PWM is enabled, then pilot pin can be PB1 or PB2 +// if using fast PWM (PAFC_PWM disabled) pilot pin *MUST* be PB2 +#define PILOT_REG &PINB +#define PILOT_IDX 2 + +#ifdef MENNEKES_LOCK +// requires external 12V H-bridge driver such as Polulu 1451 + +//D11 - MOSI +#define MENNEKES_LOCK_PINA_REG &PINB +#define MENNEKES_LOCK_PINA_IDX 3 + +//D12 - MISO +#define MENNEKES_LOCK_PINB_REG &PINB +#define MENNEKES_LOCK_PINB_IDX 4 +#endif // MENNEKES_LOCK + + +// if defined, this pin goes HIGH when the EVSE is sleeping, and LOW otherwise +//#define SLEEP_STATUS_REG &PINB +//#define SLEEP_STATUS_IDX 4 + +#ifdef AUTH_LOCK +// AUTH_LOCK_REG/IDX - use an input pin to control AUTH_LOCK instead of +// manual function calls +// digital pin is configured as input with internal pull-up enabled +// EVSE is locked when input HIGH and unlocked when input LOW +//#define AUTH_LOCK_REG &PINC +//#define AUTH_LOCK_IDX 2 +#endif // AUTH_LOCK + diff --git a/firmware/targets/m328p/platformio.ini b/firmware/targets/m328p/platformio.ini new file mode 100644 index 00000000..5a449527 --- /dev/null +++ b/firmware/targets/m328p/platformio.ini @@ -0,0 +1,57 @@ + +[m328p] +upload_protocol = usbasp +upload_flags = "-e -B0.5" +lib_deps = ${common.lib_deps} +build_src_flags = + ${common.build_flags} + -D TARGET_M328P + -D OEV6 + -D RAPI_SERIAL_PORT=Serial + -D RELAY_PWM + -D SHOW_DISABLED_TESTS + -I firmware/targets/m328p +build_src_filter = + ${common.build_src_filter} + +<../targets/m328p> + +# autodetect V5/6 and CGMI +[env:m328p_autodetect] +platform = atmelavr@3.4.0 +board = openevse +framework = arduino +upload_protocol = ${m328p.upload_protocol} +upload_flags = ${m328p.upload_flags} +lib_deps = ${m328p.lib_deps} +build_src_filter = + ${m328p.build_src_filter} +build_src_flags= + ${m328p.build_src_flags} + -D 'VERSION="${common.version}"' + + # v5/ v6 and CGMI plus legacy RTC LCD BTN +[env:m328p_RTC_BTN_LCD] +extends = env:m328p_autodetect +platform = atmelavr@3.4.0 +board = openevse +framework = arduino +build_src_flags= + ${m328p.build_src_flags} + -D AUTOSVCLEVEL + -D BTN_MENU + -D HAVE_RTC + -D DELAY_TIMER + -D RGBLCD + -D CHARGE_LIMIT + -D TIME_LIMIT + -D TEMPERATURE_THROTTLING + -D 'VERSION="${common.version}.RTCRGBLCD"' + + + + + + + + + diff --git a/firmware/open_evse/strings.cpp b/firmware/targets/m328p/strings.cpp similarity index 96% rename from firmware/open_evse/strings.cpp rename to firmware/targets/m328p/strings.cpp index 024a4ab7..e44777ac 100644 --- a/firmware/open_evse/strings.cpp +++ b/firmware/targets/m328p/strings.cpp @@ -122,3 +122,8 @@ const char *g_DelayMenuItems[] = STR_YESNO_SETSTART_SETSTOP; #ifdef OVERCURRENT_THRESHOLD const char g_psOverCurrent[] PROGMEM = STR_OVER_CURRENT; #endif // OVERCURRENT_THRESHOLD + +#ifdef PP_AUTO_AMPACITY +const char g_psCableFault[] PROGMEM = STR_CABLE_FAULT; +const char g_psPPShorted[] PROGMEM = STR_PP_SHORTED; +#endif //PP_AUTO_AMPACITY diff --git a/firmware/open_evse/strings.h b/firmware/targets/m328p/strings.h similarity index 96% rename from firmware/open_evse/strings.h rename to firmware/targets/m328p/strings.h index 01f1b3a6..ad2c54ac 100644 --- a/firmware/open_evse/strings.h +++ b/firmware/targets/m328p/strings.h @@ -127,3 +127,8 @@ extern const char *g_DelayMenuItems[]; #ifdef OVERCURRENT_THRESHOLD extern const char g_psOverCurrent[] PROGMEM; #endif // OVERCURRENT_THRESHOLD + +#ifdef PP_AUTO_AMPACITY +extern const char g_psCableFault[] PROGMEM; +extern const char g_psPPShorted[] PROGMEM; +#endif //PP_AUTO_AMPACITY diff --git a/firmware/open_evse/avrstuff.cpp b/firmware/targets/m328p/target.cpp similarity index 61% rename from firmware/open_evse/avrstuff.cpp rename to firmware/targets/m328p/target.cpp index 8165a054..b9beb9f5 100644 --- a/firmware/open_evse/avrstuff.cpp +++ b/firmware/targets/m328p/target.cpp @@ -1,18 +1,32 @@ -// Copyright (C) 2015 Sam C. Lin -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE for a copy of the GNU General Public License or see -// it online at . +#include "open_evse.h" + +// wdt_init turns off the watchdog timer after we use it +// to reboot + +#ifdef MCU_ID_LEN +// mcuid *must* be of size MCU_ID_LEN +#include +void getMcuId(uint8_t *mcuid) +{ + for (int i=0;i < MCU_ID_LEN;i++) { + mcuid[i] = boot_signature_byte_get(0x0E + i); + } +} +#endif // MCU_ID_LEN + + +void wdt_init(void) __attribute__((naked,used)) __attribute__((section(".init3"))); +void wdt_init(void) +{ + MCUSR = 0; + wdt_disable(); + + return; +} + +// A/B B/C C/D D DS +THRESH_DATA J1772EVSEController::m_ThreshData = {875,780,690,0,260}; -#include "avrstuff.h" void DigitalPin::init(volatile uint8_t* _reg,uint8_t idx,PinMode _mode) { @@ -105,3 +119,47 @@ uint16_t AdcPin::read() // combine the two bytes return (high << 8) | low; } + + +// platform-specific init +void initTarget() +{ + +/* detect the board + * Board ID +PD7 | ADC6 | + 0 | 0 | OpenEVSE v1-v5 + 1 | 0 | OEV6 v5.5 + 0 | 1 | n/a + 1 | 1 | OEV6 + CGMI v6.5+ (ADC6 tied to VCC via 330 ohm -> reads ~1023; floating = no CGMI) + * + N.B. lincomatic's BETA V6 board inverts PD7 so V6 is PD7=0 + */ + DigitalPin pinPD7; + pinPD7.init(&PIND,7,DigitalPin::INP); + int pd7 = pinPD7.read(); + + // ADC - fake as a digital pin + // CGMI boards tie A6 to VCC via 330 ohm -> reads ~1023; floating reads mid-rail or lower + int adc6 = analogRead(A6); + if (adc6 > 1000) adc6 = 1; + else adc6 = 0; + + if (pd7 && !adc6) { + g_isV6 = true; + g_hasCGMI = false; + } + else if (pd7 && adc6) { + g_isV6 = true; + g_hasCGMI = true; + } + else { + g_isV6 = false; + g_hasCGMI = false; + } + + extern char g_sTmp[]; + sprintf(g_sTmp,"isV6: %c hasCGMI %c",g_isV6 ? '1':'0',g_hasCGMI ? '1':'0'); + Serial.println(g_sTmp); + +} diff --git a/firmware/open_evse/avrstuff.h b/firmware/targets/m328p/target.h similarity index 56% rename from firmware/open_evse/avrstuff.h rename to firmware/targets/m328p/target.h index 60422646..c8d5a1f8 100644 --- a/firmware/open_evse/avrstuff.h +++ b/firmware/targets/m328p/target.h @@ -14,14 +14,72 @@ // it online at . #pragma once - +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#if defined(ARDUINO) && (ARDUINO >= 100) #include "Arduino.h" +#include "./Wire.h" +#include "./RTClib.h" + + +// enable $GI +#define MCU_ID_LEN 10 + +#define ADC_RESOLUTION_BITS 10 +#define ADC_MAX 1023 +#define ADC_HALF 512 + +// for J1772.ReadPilot() +// 1x = 114us 20x = 2.3ms 100x = 11.3ms +#define PILOT_LOOP_CNT 100 + + + +// This multiplier is the number of milliamps per A/d converter unit. + +// First, you need to select the burden resistor for the CT. You choose the largest value possible such that +// the maximum peak-to-peak voltage for the current range is 5 volts. To obtain this value, divide the maximum +// outlet current by the Te. That value is the maximum CT current RMS. You must convert that to P-P, so multiply +// by 2*sqrt(2). Divide 5 by that value and select the next lower standard resistor value. For the reference +// design, Te is 1018 and the outlet maximum is 30. 5/((30/1018)*2*sqrt(2)) = 59.995, so a 56 ohm resistor +// is called for. Call this value Rb (burden resistor). + +// Next, one must use Te and Rb to determine the volts-per-amp value. Note that the readCurrent() +// method calculates the RMS value before the scaling factor, so RMS need not be taken into account. +// (1 / Te) * Rb = Rb / Te = Volts per Amp. For the reference design, that's 55.009 mV. +// Each count of the A/d converter is 4.882 mV (5/1024). V/A divided by V/unit is unit/A. For the reference +// design, that's 11.26. But we want milliamps per unit, so divide that into 1000 to get 88.7625558. Round near... +//#define DEFAULT_CURRENT_SCALE_FACTOR 106 // for RB = 47 - recommended for 30A max +//#define DEFAULT_CURRENT_SCALE_FACTOR 184 // for RB = 27 - recommended for 50A max +// Craig K, I arrived at 213 by scaling my previous multiplier of 225 down by the ratio of my panel meter reading of 28 with the OpenEVSE uncalibrated reading of 29.6 +// then upped the scale factor to 220 after fixing the zero offset by subtracing 900ma +//#define DEFAULT_CURRENT_SCALE_FACTOR 220 // for RB = 22 - measured by Craig on his new OpenEVSE V3 +// NOTE: setting DEFAULT_CURRENT_SCALE_FACTOR TO 0 will disable the ammeter +// until it is overridden via RAPI +//#define DEFAULT_CURRENT_SCALE_FACTOR 220 // Craig K, average of three OpenEVSE controller calibrations +#ifdef OPENEVSE_2 +#define DEFAULT_CURRENT_SCALE_FACTOR 186 // OpenEVSE II with a 27 Ohm burden resistor, after a 2-point calibration at 12.5A and 50A #else -#include "WProgram.h" // shouldn't need this but arduino sometimes messes up and puts inside an #ifdef -#endif // ARDUINO +#define DEFAULT_CURRENT_SCALE_FACTOR 220 // OpenEVSE v2.5 and v3 with a 22 Ohm burden resistor (note that the schematic may say 28 Ohms by mistake) +#endif + +// subtract this from ammeter current reading to correct zero offset +#ifdef OPENEVSE_2 +#define DEFAULT_AMMETER_CURRENT_OFFSET 230 // OpenEVSE II with a 27 Ohm burden resistor, after a 2-point calibration at 12.5A and 50A +#else +#define DEFAULT_AMMETER_CURRENT_OFFSET 0 // OpenEVSE v2.5 and v3 with a 22 Ohm burden resistor. Could use a more thorough calibration exercise to nails this down. +#endif + + + +typedef unsigned long time_t; #ifdef __cplusplus class CriticalSection { @@ -89,6 +147,24 @@ example #ifdef __cplusplus +void getMcuId(uint8_t *mcuid); + +#if WATCHDOG_TIMEOUT_SEC != 2 +#error "unsupported WATCHDOG_TIMEOUT_SEC value" +#endif + +#ifdef WATCHDOG +#define WDT_RESET() wdt_reset() +#define WDT_ENABLE() wdt_enable(WDTO_2S) +#define WDT_ENABLE_1S() wdt_enable(WDTO_1S) +#define WDT_DISABLE() wdt_disable() +#else +#define WDT_RESET() +#define WDT_ENABLE() +#define WDT_ENABLE_1S() +#define WDT_DISABLE() +#endif // WATCHDOG + // // begin digitalPin class // using this class beautifies the code, but wastes 3 bytes per pin @@ -181,4 +257,5 @@ class Led { // end digital pin class // +void initTarget(); #endif // __cplusplus diff --git a/firmware/open_evse/twi.c b/firmware/targets/m328p/twi.c similarity index 100% rename from firmware/open_evse/twi.c rename to firmware/targets/m328p/twi.c diff --git a/firmware/open_evse/twi.h b/firmware/targets/m328p/twi.h similarity index 100% rename from firmware/open_evse/twi.h rename to firmware/targets/m328p/twi.h diff --git a/firmware/targets/samd/Gfi.cpp b/firmware/targets/samd/Gfi.cpp new file mode 100644 index 00000000..d1ab7824 --- /dev/null +++ b/firmware/targets/samd/Gfi.cpp @@ -0,0 +1,123 @@ +/* + * This file is part of Open EVSE. + * + * Copyright (c) 2011-2019 Sam C. Lin + * + * Open EVSE is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + + * Open EVSE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Open EVSE; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include "open_evse.h" + +#ifdef GFI +// interrupt service routing +void gfi_isr() +{ +#ifndef BYPASS_GFI + g_EvseController.SetGfiTripped(); +#endif +} + + +void Gfi::Init(uint8_t v6) +{ + pin.init(GFI_REG,GFI_IDX,DigitalPin::INP); + // GFI triggers on rising edge + attachInterrupt(digitalPinToInterrupt(GFI_REG),gfi_isr,RISING); + +#ifdef GFI_SELFTEST + uint32_t reg = GFITEST_REG; + uint32_t idx = GFITEST_IDX; + + pinTest.init(reg,idx,DigitalPin::OUT); +#endif // GFI_SELFTEST + + Reset(); +} + + +//RESET GFI LOGIC +void Gfi::Reset() +{ + WDT_RESET(); + +#ifdef GFI_SELFTEST + testInProgress = 0; + testSuccess = 0; +#endif // GFI_SELFTEST + + if (pin.read()) m_GfiFault = 1; // if interrupt pin is high, set fault + else m_GfiFault = 0; +} + +#ifdef GFI_SELFTEST + +uint8_t Gfi::SelfTest() +{ +#ifdef BYPASS_GFI + return 0; +#endif + // RAPI_SERIAL_PORT.print("GST "); + // uint32_t sms = millis(); + int i; + // wait for GFI pin to clear + for (i=0;i < 20;i++) { + WDT_RESET(); + if (!pin.read()) break; + delay(50); + } + if (i == 20) return 2; + // RAPI_SERIAL_PORT.print(millis()-sms); + + testInProgress = 1; + testSuccess = 0; + WDT_RESET(); + for(i=0; !testSuccess && (i < 200); i++) { + pinTest.write(1); + delayMicroseconds(GFI_PULSE_ON_US); + pinTest.write(0); + delayMicroseconds(GFI_PULSE_OFF_US); + if ((i % 50) == 0) WDT_RESET(); + } + // RAPI_SERIAL_PORT.print(" ST ");RAPI_SERIAL_PORT.print(millis()-sms); + // RAPI_SERIAL_PORT.print(" ");RAPI_SERIAL_PORT.print(i); + + // wait for GFI pin to clear + for (i=0;i < 40;i++) { + WDT_RESET(); + if (!pin.read()) break; + delay(50); + } + if (i == 40) return 3; + // RAPI_SERIAL_PORT.print(" w ");RAPI_SERIAL_PORT.print(i); + // RAPI_SERIAL_PORT.print(" s ");RAPI_SERIAL_PORT.println(testSuccess); + + +#ifdef dontneed + // sometimes getting spurious GFI faults when testing just before closing + // relay. + // wait a little more for everything to settle down + // this delay is needed only if 10uF cap is in the circuit, which makes the circuit + // temporarily overly sensitive to trips until it discharges + wdt_delay(1000); +#endif + + m_GfiFault = 0; + + testInProgress = 0; + + return !testSuccess; +} +#endif // GFI_SELFTEST +#endif // GFI diff --git a/firmware/targets/samd/Gfi.h b/firmware/targets/samd/Gfi.h new file mode 100644 index 00000000..289c8841 --- /dev/null +++ b/firmware/targets/samd/Gfi.h @@ -0,0 +1,49 @@ +/* + * Open EVSE Firmware + * + * This file is part of Open EVSE. + * + * Copyright (c) 2011-2019 Sam C. Lin + * + * Open EVSE is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + + * Open EVSE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Open EVSE; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#pragma once + +class Gfi { + DigitalPin pin; + uint8_t m_GfiFault; +#ifdef GFI_SELFTEST + volatile uint8_t testSuccess; + uint8_t testInProgress; +#endif // GFI_SELFTEST +public: +#ifdef GFI_SELFTEST + DigitalPin pinTest; +#endif + + Gfi() {} + + void Init(uint8_t v6=0); + void Reset(); + void SetFault() { m_GfiFault = 1; } + uint8_t Fault() { return m_GfiFault; } +#ifdef GFI_SELFTEST + uint8_t SelfTest(); + void SetTestSuccess() { testSuccess = 1; } + uint8_t SelfTestSuccess() { return testSuccess; } + uint8_t SelfTestInProgress() { return testInProgress; } +#endif +}; diff --git a/firmware/targets/samd/J1772Pilot.cpp b/firmware/targets/samd/J1772Pilot.cpp new file mode 100644 index 00000000..329cfd34 --- /dev/null +++ b/firmware/targets/samd/J1772Pilot.cpp @@ -0,0 +1,123 @@ +#include "open_evse.h" +#include + +static constexpr uint32_t kPilotTop = 47999; // 48MHz / 1 / (47999 + 1) = 1kHz + +void J1772Pilot::pwmEnable(bool tf) +{ + if (tf) { + // configure PWM + pinPeripheral(PILOT_REG, PIO_TIMER_ALT); // PA18 -> TCC0/WO[2] + + PM->APBCMASK.reg |= PM_APBCMASK_TCC0; + + GCLK->CLKCTRL.reg = (uint16_t)(GCLK_CLKCTRL_CLKEN | + GCLK_CLKCTRL_GEN_GCLK0 | + GCLK_CLKCTRL_ID_TCC0_TCC1); + while (GCLK->STATUS.bit.SYNCBUSY) { + } + + TCC0->CTRLA.bit.ENABLE = 0; + while (TCC0->SYNCBUSY.bit.ENABLE) { + } + + TCC0->CTRLA.reg = TCC_CTRLA_PRESCALER_DIV1; + TCC0->WAVE.reg = TCC_WAVE_WAVEGEN_NPWM; + while (TCC0->SYNCBUSY.bit.WAVE) { + } + + TCC0->PER.reg = kPilotTop; + while (TCC0->SYNCBUSY.bit.PER) { + } + + TCC0->CC[2].reg = 0; + while (TCC0->SYNCBUSY.bit.CC2) { + } + + TCC0->CTRLA.bit.ENABLE = 1; + while (TCC0->SYNCBUSY.bit.ENABLE) { + } + // end configure PWM + } + else { + TCC0->CTRLA.bit.ENABLE = 0; + while (TCC0->SYNCBUSY.bit.ENABLE) { + } + + pinMode(PILOT_REG, OUTPUT); + } +} + +void J1772Pilot::pwmSetCompareCounts(uint32_t compare) +{ + if (compare > kPilotTop) { + compare = kPilotTop; + } + + TCC0->CC[2].reg = compare; + while (TCC0->SYNCBUSY.bit.CC2) { + } +} + + +void J1772Pilot::Init() +{ + pinMode(PILOT_REG,OUTPUT); + + + + SetState(PILOT_STATE_P12); // turns the pilot on 12V steady state +} + + +// no PWM pilot signal - steady state +// PILOT_STATE_P12 = steady +12V (EVSE_STATE_A - VEHICLE NOT CONNECTED) +// PILOT_STATE_N12 = steady -12V (EVSE_STATE_F - FAULT) +void J1772Pilot::SetState(PILOT_STATE state) +{ + if (m_State == PILOT_STATE_PWM) pwmEnable(0); + + digitalWrite(PILOT_REG,(state == PILOT_STATE_P12) ? HIGH : LOW); + + m_State = state; + // g_serial->printf("pstate: %s\n",(state == PILOT_STATE_P12) ? "P12":"N12"); +} + +// +// set EVSE current capacity in Amperes +// +// outputting a 1KHz square wave w/ proper duty cycle +// quick reference: +// 6A -> 10% +// 16A -> 26.67% +// 32A -> 53.33% +// 51A -> 85% +// 52A -> 84.8% +// 80A -> 96% +// +int J1772Pilot::SetPWM(int amps) +{ + uint32_t compare; + if ((amps >= 6) && (amps <= 51)) { + // amps = (duty cycle %) X 0.6 + // duty% = amps / 0.6 = amps * 5 / 3 + // compare = duty% * (PER+1) / 100 = amps * 800 (exact integer) + compare = (uint32_t)amps * 800u; + } else if ((amps > 51) && (amps <= 80)) { + // amps = (duty cycle % - 64) X 2.5 + // duty% = 64 + amps / 2.5 = 64 + 2*amps/5 + // compare = 64%*(PER+1) + amps*192 (exact integer) + compare = 30720u + ((uint32_t)amps * 192u); + } + else { + return 1; + } + + pwmEnable(1); + pwmSetCompareCounts(compare); + + m_State = PILOT_STATE_PWM; + + // g_serial->printf("pwm cnt: %d\n",cnt); + return 0; +} diff --git a/firmware/targets/samd/J1772Pilot.h b/firmware/targets/samd/J1772Pilot.h new file mode 100644 index 00000000..7d88f87e --- /dev/null +++ b/firmware/targets/samd/J1772Pilot.h @@ -0,0 +1,40 @@ +#pragma once +/* + * This file is part of Open EVSE. + * + * Copyright (c) 2011-2019 Sam C. Lin + * + * Open EVSE is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + + * Open EVSE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Open EVSE; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +typedef enum { + PILOT_STATE_P12, PILOT_STATE_PWM, PILOT_STATE_N12 +} +PILOT_STATE; +class J1772Pilot { + PILOT_STATE m_State; + + void pwmEnable(bool tf); + void pwmSetCompareCounts(uint32_t compare); +public: + J1772Pilot() {} + void Init(); + void SetState(PILOT_STATE pstate); // P12/N12 + PILOT_STATE GetState() { + return m_State; + } + int SetPWM(int amps); // 12V 1KHz PWM +}; diff --git a/firmware/targets/samd/pindefs.h b/firmware/targets/samd/pindefs.h new file mode 100644 index 00000000..ea976592 --- /dev/null +++ b/firmware/targets/samd/pindefs.h @@ -0,0 +1,42 @@ +#include "samd_pins.h" + +#define GFI_REG ZERO_PA14 + +// pin is supposed to be wrapped around the GFI CT 5+ times +#define GFITEST_REG ZERO_PA06 + +#define PILOT_REG ZERO_PA18 // PWM + +// analog pins +#define CURRENT_PIN ZERO_PA02 // analog current reading pin A0 +#define PILOT_SENSE_PIN ZERO_PB08 // analog pilot voltage reading pin A1 +#define PP_PIN ZERO_PB09 // PP_READ - A2 + + +#define ACLINE1_REG ZERO_PA08 // WELD_DETECT +#define ACLINE2_REG ZERO_PA09 // GMI_LINE + +// digital Relay trigger pin +#define CHARGING_REG ZERO_PA15 // DC_RELAY_1 +#define CHARGING2_REG ZERO_PA20 // DC_RELAY_2 +#define CHARGINGAC_REG ZERO_PA07 // AC_RELAY + +// requires external 12V H-bridge driver such as Polulu 1451 +#define MENNEKES_LOCK_PINA_REG ZERO_PA16 // LOCK +#define MENNEKES_LOCK_PINB_REG ZERO_PA19 // UNLOCK + + + +// dummies - unused +#define PILOT_IDX 0 +#define CHARGING_IDX 0 +#define CHARGING2_IDX 0 +#define CHARGINGAC_IDX 0 +#define ACLINE1_IDX 0 +#define ACLINE2_IDX 0 + +#define GFI_IDX 0 +#define GFITEST_IDX 0 + +#define MENNEKES_LOCK_PINA_IDX 0 +#define MENNEKES_LOCK_PINB_IDX 0 diff --git a/firmware/targets/samd/platformio.ini b/firmware/targets/samd/platformio.ini new file mode 100644 index 00000000..87320309 --- /dev/null +++ b/firmware/targets/samd/platformio.ini @@ -0,0 +1,53 @@ +[samd] +lib_deps = ${common.lib_deps} + https://github.com/lincomatic/Adafruit_SleepyDog.git + https://github.com/sparkfun/SparkFun_External_EEPROM_Arduino_Library.git +build_src_flags = + -D TARGET_SAMD + -D EEPROM_FLASH_STORE_KB=48 + -D RAPI_SERIAL_PORT=Serial1 + -I firmware/targets/samd +build_src_filter = + ${common.build_src_filter} + +<../targets/samd> + + +# SAMD OpenEVSE NXT +[env:samd] +platform = atmelsam +framework = arduino +board = zeroUSB +build_type = release +monitor_speed=115200 +;extra_scripts = ${samd.extra_scripts} +lib_deps = ${samd.lib_deps} +build_src_filter = + ${samd.build_src_filter} +build_src_flags= + ${samd.build_src_flags} + ${common.build_flags} + -D 'VERSION="${common.version}.SAMD"' + +# SAMD OpenEVSE NXT (Atmel-ICE upload/programming) +[env:samd_ice] +extends = env:samd +upload_protocol = atmel-ice +build_type = release + +[env:samd_ice_dev] ; don't use this.. for dev/debug only +extends = env:samd +upload_protocol = atmel-ice +build_type = release ;debug +;debug_tool = atmel-ice +build_src_flags= + -UWATCHDOG + -UBOOTLOCK + -UHEARTBEAT_SUPERVISION + -DBYPASS_GFI ; disable GFI +; -DCALIBRATE ; pilot calibration mode - for initial setup only +; -DAMMETER_TEST ; ammeter test mode - for initial setup only + + + + + diff --git a/firmware/targets/samd/samd_pins.h b/firmware/targets/samd/samd_pins.h new file mode 100644 index 00000000..27064502 --- /dev/null +++ b/firmware/targets/samd/samd_pins.h @@ -0,0 +1,163 @@ +// table from C:\Users\Geek\.platformio\packages\framework-arduino-samd\variants\arduino_zero\variant.cpp +#pragma once +/* + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * + Pin number + ZERO Board pin | PIN | Label/Name | Comments (* is for default peripheral in use) + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | Digital Low | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 0 | 0 -> RX | PA11 | | EIC/EXTINT[11] ADC/AIN[19] PTC/X[3] *SERCOM0/PAD[3] SERCOM2/PAD[3] TCC0/WO[3] TCC1/WO[1] + * | 1 | 1 <- TX | PA10 | | EIC/EXTINT[10] ADC/AIN[18] PTC/X[2] *SERCOM0/PAD[2] TCC0/WO[2] TCC1/WO[0] + * | 2 | 2 | PA14 | | EIC/EXTINT[14] SERCOM2/PAD[2] SERCOM4/PAD[2] TC3/WO[0] TCC0/WO[4] + * | 3 | ~3 | PA09 | | EIC/EXTINT[9] ADC/AIN[17] PTC/X[1] SERCOM0/PAD[1] SERCOM2/PAD[1] *TCC0/WO[1] TCC1/WO[3] + * | 4 | ~4 | PA08 | | EIC/NMI ADC/AIN[16] PTC/X[0] SERCOM0/PAD[0] SERCOM2/PAD[0] *TCC0/WO[0] TCC1/WO[2] + * | 5 | ~5 | PA15 | | EIC/EXTINT[15] SERCOM2/PAD[3] SERCOM4/PAD[3] *TC3/WO[1] TCC0/WO[5] + * | 6 | ~6 | PA20 | | EIC/EXTINT[4] PTC/X[8] SERCOM5/PAD[2] SERCOM3/PAD[2] *TCC0/WO[6] + * | 7 | 7 | PA21 | | EIC/EXTINT[5] PTC/X[9] SERCOM5/PAD[3] SERCOM3/PAD[3] TCC0/WO[7] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | Digital High | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 8 | ~8 | PA06 | | EIC/EXTINT[6] ADC/AIN[6] AC/AIN[2] PTC/Y[4] SERCOM0/PAD[2] *TCC1/WO[0] + * | 9 | ~9 | PA07 | | EIC/EXTINT[7] ADC/AIN[7] AC/AIN[3] PTC/Y[5] SERCOM0/PAD[3] *TCC1/WO[1] + * | 10 | ~10 | PA18 | | EIC/EXTINT[2] PTC/X[6] +SERCOM1/PAD[2] SERCOM3/PAD[2] *TC3/WO[0] TCC0/WO[2] + * | 11 | ~11 | PA16 | | EIC/EXTINT[0] PTC/X[4] +SERCOM1/PAD[0] SERCOM3/PAD[0] *TCC2/WO[0] TCC0/WO[6] + * | 12 | ~12 | PA19 | | EIC/EXTINT[3] PTC/X[7] +SERCOM1/PAD[3] SERCOM3/PAD[3] TC3/WO[1] *TCC0/WO[3] + * | 13 | ~13 | PA17 | LED | EIC/EXTINT[1] PTC/X[5] +SERCOM1/PAD[1] SERCOM3/PAD[1] *TCC2/WO[1] TCC0/WO[7] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | Analog Connector | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 14 | A0 | PA02 | A0 | EIC/EXTINT[2] *ADC/AIN[0] DAC/VOUT PTC/Y[0] + * | 15 | A1 | PB08 | A1 | EIC/EXTINT[8] *ADC/AIN[2] PTC/Y[14] SERCOM4/PAD[0] TC4/WO[0] + * | 16 | A2 | PB09 | A2 | EIC/EXTINT[9] *ADC/AIN[3] PTC/Y[15] SERCOM4/PAD[1] TC4/WO[1] + * | 17 | A3 | PA04 | A3 | EIC/EXTINT[4] *ADC/AIN[4] AC/AIN[0] PTC/Y[2] SERCOM0/PAD[0] TCC0/WO[0] + * | 18 | A4 | PA05 | A4 | EIC/EXTINT[5] *ADC/AIN[5] AC/AIN[1] PTC/Y[5] SERCOM0/PAD[1] TCC0/WO[1] + * | 19 | A5 | PB02 | A5 | EIC/EXTINT[2] *ADC/AIN[10] PTC/Y[8] SERCOM5/PAD[0] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | Wire | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 20 | SDA | PA22 | SDA | EIC/EXTINT[6] PTC/X[10] *SERCOM3/PAD[0] SERCOM5/PAD[0] TC4/WO[0] TCC0/WO[4] + * | 21 | SCL | PA23 | SCL | EIC/EXTINT[7] PTC/X[11] *SERCOM3/PAD[1] SERCOM5/PAD[1] TC4/WO[1] TCC0/WO[5] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | |SPI (Legacy ICSP) | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 22 | 1 | PA12 | MISO | EIC/EXTINT[12] SERCOM2/PAD[0] *SERCOM4/PAD[0] TCC2/WO[0] TCC0/WO[6] + * | | 2 | | 5V0 | + * | 23 | 4 | PB10 | MOSI | EIC/EXTINT[10] *SERCOM4/PAD[2] TC5/WO[0] TCC0/WO[4] + * | 24 | 3 | PB11 | SCK | EIC/EXTINT[11] *SERCOM4/PAD[3] TC5/WO[1] TCC0/WO[5] + * | | 5 | | RESET | + * | | 6 | | GND | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | LEDs | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 25 | | PB03 | RX | + * | 26 | | PA27 | TX | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | USB | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 27 | | PA28 | USB_HOST_ENABLE | EIC/EXTINT[8] + * | 28 | | PA24 | USB_NEGATIVE | *USB/DM + * | 29 | | PA25 | USB_POSITIVE | *USB/DP + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | EDBG | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 30 | | PB22 | EDBG_UART TX | *SERCOM5/PAD[2] + * | 31 | | PB23 | EDBG_UART RX | *SERCOM5/PAD[3] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 32 | | PA22 | EDBG_SDA | Pin 20 (SDA) + * | 33 | | PA23 | EDBG_SCL | Pin 21 (SCL) + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 34 | | PA19 | EDBG_MISO | EIC/EXTINT[3] *SERCOM1/PAD[3] SERCOM3/PAD[3] TC3/WO[1] TCC0/WO[3] + * | 35 | | PA16 | EDBG_MOSI | EIC/EXTINT[0] *SERCOM1/PAD[0] SERCOM3/PAD[0] TCC2/WO[0] TCC0/WO[6] + * | 36 | | PA18 | EDBG_SS | EIC/EXTINT[2] *SERCOM1/PAD[2] SERCOM3/PAD[2] TC3/WO[0] TCC0/WO[2] + * | 37 | | PA17 | EDBG_SCK | EIC/EXTINT[1] *SERCOM1/PAD[1] SERCOM3/PAD[1] TCC2/WO[1] TCC0/WO[7] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 38 | ATN | PA13 | EDBG_GPIO0 | EIC/EXTINT[13] SERCOM2/PAD[1] SERCOM4/PAD[1] *TCC2/WO[1] TCC0/WO[7] + * | 39 | | PA21 | EDBG_GPIO1 | Pin 7 + * | 40 | | PA06 | EDBG_GPIO2 | Pin 8 + * | 41 | | PA07 | EDBG_GPIO3 | Pin 9 + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | GND | | | + * | 42 | AREF | PA03 | | EIC/EXTINT[3] *[ADC|DAC]/VREFA ADC/AIN[1] PTC/Y[1] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | 43 | | PA02 | | Alternate use of A0 (DAC output) + * | 44 | | PA30 | | SWCLK, alternate use EXTINT[10] TCC1/WO[0] SERCOM1/PAD[2] + * | 45 | | PA31 | | SWDIO, alternate use EXTINT[11] TCC1/WO[1] SERCOM1/PAD[3] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | |32.768KHz Crystal | | | + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + * | | | PA00 | XIN32 | EIC/EXTINT[0] SERCOM1/PAD[0] TCC2/WO[0] + * | | | PA01 | XOUT32 | EIC/EXTINT[1] SERCOM1/PAD[1] TCC2/WO[1] + * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- + */ + +/* +#defines generated by https://grok.com/c/bc3507b4-0f4c-4ff1-81ea-448429308146?rid=118354ef-aedc-4fb8-8796-072878f2a395 + +Notes: + +Only pins that have a clear Pin Number (0–45 range in the left column) are included. +Pins without an explicit Arduino pin number (e.g. pure USB pins without number, crystal pins PA00/PA01, some EDBG-only entries without number) were skipped. +Some pins appear multiple times (e.g. PA22 = 20 and 32) because they are shared (SDA / EDBG_SDA). You can choose whether to keep only one or use both depending on your coding style. +The generated names follow the common pattern seen in many Arduino SAMD variants (e.g. #define ZERO_PAxx N). +*/ + +// n.b. we don't use XXXX because they're already defined differently in +// C:\Users\Geek\.platformio\packages\framework-cmsis-atmel\CMSIS\Device\ATMEL\samd21\include\pio\samd21g18a.h +#define ZERO_PA11 0 +#define ZERO_PA10 1 +#define ZERO_PA14 2 +#define ZERO_PA09 3 +#define ZERO_PA08 4 +#define ZERO_PA15 5 +#define ZERO_PA20 6 +#define ZERO_PA21 7 + +#define ZERO_PA06 8 +#define ZERO_PA07 9 +#define ZERO_PA18 10 +#define ZERO_PA16 11 +#define ZERO_PA19 12 +#define ZERO_PA17 13 + +#define ZERO_PA02 14 // A0 +#define ZERO_PB08 15 // A1 +#define ZERO_PB09 16 // A2 +#define ZERO_PA04 17 // A3 +#define ZERO_PA05 18 // A4 +#define ZERO_PB02 19 // A5 + +#define ZERO_PA22 20 // SDA +#define ZERO_PA23 21 // SCL + +#define ZERO_PA12 22 // MISO (legacy ICSP) +#define ZERO_PB10 23 // MOSI +#define ZERO_PB11 24 // SCK + +#define ZERO_PB03 25 // RX LED related +#define ZERO_PA27 26 // TX LED related + +#define ZERO_PA28 27 // USB_HOST_ENABLE + +#define ZERO_PA24 28 // USB/DM +#define ZERO_PA25 29 // USB/DP + +// EDBG related (internal) +#define ZERO_PB22 30 // EDBG_UART TX +#define ZERO_PB23 31 // EDBG_UART RX + +// EDBG alternate mappings (often same physical pins) +//#define ZERO_PA22 32 // EDBG_SDA (same as 20) +//#define ZERO_PA23 33 // EDBG_SCL (same as 21) +//#define ZERO_PA19 34 // EDBG_MISO (same as 12) +//#define ZERO_PA16 35 // EDBG_MOSI (same as 11) +//#define ZERO_PA18 36 // EDBG_SS (same as 10) +//#define ZERO_PA17 37 // EDBG_SCK (same as 13) + +#define ZERO_PA13 38 // ATN / EDBG_GPIO0 + +// Additional / special pins +#define ZERO_PA03 42 // AREF +#define ZERO_PA30 44 // SWCLK +#define ZERO_PA31 45 // SWDIO diff --git a/firmware/targets/samd/target.cpp b/firmware/targets/samd/target.cpp new file mode 100644 index 00000000..01f88d30 --- /dev/null +++ b/firmware/targets/samd/target.cpp @@ -0,0 +1,92 @@ +#include "open_evse.h" + +ExternalEEPROM g_eeprom; + +// A/B B/C C/D D DS +THRESH_DATA J1772EVSEController::m_ThreshData = {3948,3539,3258,0,492}; + +#ifdef MCU_ID_LEN +// mcuid *must* be of size MCU_ID_LEN +void getMcuId(uint8_t *mcuid) +{ + for (uint8_t word = 0; word < 4; word++) { + uint32_t value; + switch (word) { + case 0: + value = *((volatile uint32_t *)0x0080A00C); + break; + case 1: + value = *((volatile uint32_t *)0x0080A040); + break; + case 2: + value = *((volatile uint32_t *)0x0080A044); + break; + default: + value = *((volatile uint32_t *)0x0080A048); + break; + } + mcuid[(word * 4) + 0] = (uint8_t)(value & 0xFF); + mcuid[(word * 4) + 1] = (uint8_t)((value >> 8) & 0xFF); + mcuid[(word * 4) + 2] = (uint8_t)((value >> 16) & 0xFF); + mcuid[(word * 4) + 3] = (uint8_t)((value >> 24) & 0xFF); + } +} +#endif // MCU_ID_LEN + + +void DigitalPin::init(uint32_t pinnum,int idxjunk,PinMode mode) +{ + _pinNum = pinnum; + if (mode == INP) { + _pinMode = INPUT; + } + else if (mode == INP_PU) { + _pinMode = INPUT_PULLUP; + } + else { + _pinMode = OUTPUT; + } + pinMode(_pinNum,_pinMode); +} + + +// platform-specific init +void initTarget() +{ + g_hasCGMI = true; + + Wire.begin(); + g_eeprom.setMemoryType(512); + if (g_eeprom.begin() == false) { + g_EvseController.SetState(EVSE_STATE_EEPROM_FAILURE); + RapiInit(); + RapiSendBootNotification(); + while(1); + } + + //n.b. set BOD via fuses, not this code, as fuses may lock out BOD from being + // manipulated in code, anyway + // default factory fuse setting is 1.78V BOD enabled +#ifdef DONTUSE + // 1. Prepare the configuration value level 7 = ~1.78V + uint32_t bod33_config = SYSCTRL_BOD33_LEVEL(7) | + SYSCTRL_BOD33_HYST | + SYSCTRL_BOD33_ACTION_RESET | + SYSCTRL_BOD33_ENABLE; + + // 2. Wait for the SYSCTRL to be ready/synchronized + // (BOD33 is often in a different clock domain) + while (SYSCTRL->PCLKSR.bit.BOD33RDY == 0); + + // 3. Disable before configuring if it was already running + // (Optional, but ensures Level change takes effect cleanly) + SYSCTRL->BOD33.bit.ENABLE = 0; + while (SYSCTRL->PCLKSR.bit.BOD33RDY == 0); + + // 4. Write the full configuration + SYSCTRL->BOD33.reg = bod33_config; + + // 5. Wait for synchronization again to ensure it's active + while (SYSCTRL->PCLKSR.bit.BOD33RDY == 0); +#endif // DONTUSE +} diff --git a/firmware/targets/samd/target.h b/firmware/targets/samd/target.h new file mode 100644 index 00000000..3d1d3b7c --- /dev/null +++ b/firmware/targets/samd/target.h @@ -0,0 +1,129 @@ +#pragma once + + +// enable $GI +#define MCU_ID_LEN 16 // SAMD ID is 128-bit + +#define ADC_RESOLUTION_BITS 12 +#define ADC_MAX 4095 +#define ADC_HALF 2048 + +#define DEFAULT_CURRENT_SCALE_FACTOR 37 +#define DEFAULT_AMMETER_CURRENT_OFFSET -135 + + +// for J1772.ReadPilot() +// 15 = ~13ms +#define PILOT_LOOP_CNT 15 + + +#define GetVerStr(s) strcpy(s,VERSION) + +void wdt_disable(); + +#ifdef WATCHDOG +#include + +inline void wdt_enable(int sec) +{ + Watchdog.enable(sec * 1000); +} + +inline void wdt_disable() +{ + Watchdog.disable(); +} + +inline void wdt_reset() +{ + Watchdog.reset(); +} + +#define WDT_RESET() wdt_reset() +#define WDT_ENABLE() wdt_enable(2) +#define WDT_ENABLE_1S() wdt_enable(1) +#define WDT_DISABLE() wdt_disable() +#else +#define WDT_RESET() +#define WDT_ENABLE() +#define WDT_ENABLE_1S() +#define WDT_DISABLE() +#define wdt_reset() +#define wdt_enable(sec) +#endif // WATCHDOG + +class DigitalPin { + uint32_t _pinNum; + uint32_t _pinMode; + +public: + enum PinMode { INP,INP_PU,OUT }; + + DigitalPin() {} + DigitalPin(uint32_t pinnum,int idxjunk,PinMode mode) { + init(pinnum,idxjunk,mode); + } + +void init(uint32_t pinnum,int idxjunk,PinMode mode); + void mode(PinMode mode); + + uint8_t read() { + return digitalRead(_pinNum) ? 1 : 0; + } + void write(uint32_t state) { + digitalWrite(_pinNum,state ? HIGH : LOW); + } +}; + +class AdcPin { + uint32_t _pinNum; +public: + + AdcPin() {} + AdcPin(uint32_t pinnum) { + init(pinnum); + } + + void init(uint32_t pinnum) { + _pinNum = pinnum; + analogReadResolution(ADC_RESOLUTION_BITS); + } + + uint32_t read() { + return analogRead(_pinNum); + } +}; + +void getMcuId(uint8_t *mcuid); + +#include "SparkFun_External_EEPROM.h" +extern ExternalEEPROM g_eeprom; + +static uint8_t eeprom_read_byte (const uint8_t *ofs) { + uint8_t ret = 0xFF; + g_eeprom.read((uint32_t) ofs,(uint8_t *)&ret,sizeof(ret)); + return ret; +} +static uint16_t eeprom_read_word (const uint16_t *ofs) { + uint16_t ret = 0xFFFF; + g_eeprom.read((uint32_t) ofs,(uint8_t *)&ret,sizeof(ret)); + return ret; +} +static uint32_t eeprom_read_dword (const uint32_t *ofs) { + uint32_t ret = 0xFFFFFFFF; + g_eeprom.read((uint32_t) ofs,(uint8_t *)&ret,sizeof(ret)); + return ret; +} +static void eeprom_write_byte (uint8_t *ofs, uint8_t val) { + g_eeprom.write((uint32_t)ofs, (const uint8_t *)&val, sizeof(val)); +} +static void eeprom_write_word (uint16_t *ofs, uint16_t val) { + g_eeprom.write((uint32_t)ofs, (const uint8_t *)&val, sizeof(val)); +} +static void eeprom_write_dword (uint32_t *ofs, uint32_t val) { + g_eeprom.write((uint32_t)ofs, (const uint8_t *)&val, sizeof(val)); +} + + + +void initTarget(); diff --git a/flash.bat b/flash.bat new file mode 100644 index 00000000..26bb4c23 --- /dev/null +++ b/flash.bat @@ -0,0 +1,2 @@ +rem avrdude -c USBasp -p m328p -B16 -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0xFD:m +avrdude -c USBasp -p m328p -B0.5 -U flash:w:%1 diff --git a/platformio.ini b/platformio.ini index 744363fd..0b96aa36 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,99 +11,31 @@ #default_envs = openevse src_dir = firmware/open_evse +extra_configs = + firmware/targets/*/platformio.ini + [common] lib_deps = -upload_protocol = usbasp -upload_flags = "-e -B0.5" -version = 8.2.3 +version = D9.0.0 +build_src_filter = + +<*.cpp> build_flags = - -D OEV6 - -D RELAY_PWM - -D SHOW_DISABLED_TESTS + -D WATCHDOG # watchdog MUST be enabled; only turn it off during debugging + -D WATCHDOG_TIMEOUT_SEC=2 # do not change this value -D AMMETER -D RAPI -D RAPI_SERIAL -D RAPI_WF -D RAPI_BTN - #-D TIME_LIMIT - #-D CHARGE_LIMIT -D MENNEKES_LOCK + -D PP_AUTO_AMPACITY + -D BOOTLOCK -D HEARTBEAT_SUPERVISION -us_build_flags = - ${common.build_flags} - -D AUTOSVCLEVEL - #-D BOOTLOCK -eu_build_flags = - ${common.build_flags} -D NO_AUTOSVCLEVEL - -D PERIODIC_LCD_REFRESH_MS=120000UL - -D DEFAULT_CURRENT_CAPACITY_L2=32 - -D MAX_CURRENT_CAPACITY_L2=32 + -D DEFAULT_SERVICE_LEVEL=2 + -D DEFAULT_CURRENT_CAPACITY_L2=24 + -D MAX_CURRENT_CAPACITY_L2=80 -D OVERCURRENT_THRESHOLD=5 -D OVERCURRENT_TIMEOUT=10000UL - -D DEFAULT_SERVICE_LEVEL=2 - -[env:openevse_1-8-3] -platform = atmelavr@3.4.0 -board = openevse -framework = arduino -lib_deps = ${common.lib_deps} -upload_protocol = ${common.upload_protocol} -upload_flags = ${common.upload_flags} -build_src_flags= - ${common.us_build_flags} - -[env:openevse_latest] -platform = atmelavr -board = openevse -framework = arduino -lib_deps = ${common.lib_deps} -upload_protocol = ${common.upload_protocol} -upload_flags = ${common.upload_flags} -build_src_flags= - ${common.us_build_flags} - -[env:openevse] -extends = env:openevse_1-8-3 -build_src_flags= - ${common.us_build_flags} - -D 'VERSION="${common.version}"' - -# v6 CGMI OpenEVSE -[env:openevse_v6] -extends = env:openevse -build_src_flags= - ${common.us_build_flags} - -D ENABLE_CGMI - -D NO_AUTOSVCLEVEL - -D DEFAULT_SERVICE_LEVEL=2 - #-D BTN_MENU - #-D RTC - -D 'VERSION="${common.version}.CGMI"' - -# EU OpenEVSE -[env:openevse_eu] -extends = env:openevse -build_src_flags= - ${common.eu_build_flags} - -D MV_FOR_L2=230000L - -D 'VERSION="${common.version}.EU"' - -# Non-tethered T2 EmonEVSE single-phase -[env:emonevse] -extends = env:openevse -build_src_flags= - ${common.eu_build_flags} - -D PP_AUTO_AMPACITY - -D MV_FOR_L2=230000L - -D 'VERSION="${common.version}.T2"' - -# Non-tethered T2 EmonEVSE three-phase -# Deprecated, unneeded with wifi fw > 4.1.7 -; [env:emonevse_3ph] -; extends = env:openevse -; build_src_flags= -; ${common.eu_build_flags} -; -D PP_AUTO_AMPACITY -; -D THREEPHASE -; -D 'VERSION="${common.version}.3P"' + -D PERIODIC_LCD_REFRESH_MS=120000UL + -D NO_GROUND_RECORD_DELAY=2000 \ No newline at end of file diff --git a/prepare-release.sh b/prepare-release.sh index 40d06150..e97ec9b0 100755 --- a/prepare-release.sh +++ b/prepare-release.sh @@ -1,18 +1,18 @@ #!/bin/bash -# Script to compile all released enviroments and copy build artifacts to project root for easy upload to github releases. +# Script to compile all released environments and copy build artifacts to firmware/targets/ for easy upload to github releases. -pio run -e emonevse -pio run -e openevse -pio run -e emonevse_eu -pio run -e emonevse_v6 +mkdir -p firmware/targets -cp .pio/build/emonevse/firmware.hex emonevse.hex -cp .pio/build/openevse/firmware.hex openevse.hex -cp .pio/build/openevse_eu/firmware.hex openevse_eu.hex -cp .pio/build/openevse_v6/firmware.hex openevse_v6cgmi.hex -ls *.hex +pio run -e m328p_autodetect +cp .pio/build/m328p_v6/firmware.hex firmware/targets/m328p_openevse.hex -echo "Done" +pio run -e m328p_RTC_BTN_LCD +cp .pio/build/m328p_RTC_BTN_LCD/firmware.hex firmware/targets/m328p_openevse_RTC_BTN_LCD.hex +pio run -e samd +cp .pio/build/samd_us/firmware.bin firmware/targets/arm_samd_openevse_nxt.bin +ls firmware/targets/ + +echo "Done" diff --git a/firmware/open_evse/srec_cat.exe b/utils/srec_cat.exe similarity index 100% rename from firmware/open_evse/srec_cat.exe rename to utils/srec_cat.exe